Semantically-equivalent expressions evaluating at different values with -O1
The following code shows inconsistent results when compiled with -O1:
import Data.Bits ((.&.))
flags :: Int -> [Int]
flags x = filter (\y -> x .&. y > 0) [1, 128, 129, 255]
main :: IO ()
main = do
putStrLn $ show $ flags $ 255 -- These lines should display
putStrLn (show (flags 255)) -- the same value, right?
-- It appears that this is related to something that started
-- with GHC 7.10, but was also changed in GHC 8.0, as we can
-- see from the following tests:
--
-- Stack snapshot lts-0.7 (GHC 7.8.3), with -O2
-- [1,128,129,255]
-- [1,128,129,255]
--
-- Stack snapshot lts-2.22 (GHC 7.8.4) with -O2
-- [1,128,129,255]
-- [1,128,129,255]
--
-- Stack snapshot lts-3.22 (GHC 7.10.2) with -O2
-- [1]
-- [1]
--
-- Stack snapshot lts-6.30 (GHC 7.10.3) with -O2
-- [1]
-- [1]
--
-- Stack snapshot lts-7.20 (GHC 8.0.1) with -O2
-- [1]
-- [1,128,129,255]
--
-- Stack snapshot lts-8.5 (GHC 8.0.2) with -O2
-- [1]
-- [1,128,129,255]
--
-- In GHC 8.0.2, compiling with any of the following...
-- -O0
-- -O2 -fno-cmm-sink
-- -O2 -fno-enable-rewrite-rules
--
-- ...we get the expected results:
-- [1,128,129,255]
-- [1,128,129,255]
--
-- Using only -O1, we get the abnormal behavior again:
-- [1]
-- [1,128,129,255]
Trac metadata
Trac field | Value |
---|---|
Version | 8.0.2 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |