[GHC] #13425: Semantically-equivalent expressions evaluating at different values with -O1

GHC ghc-devs at haskell.org
Tue Mar 14 09:24:56 UTC 2017


#13425: Semantically-equivalent expressions evaluating at different values with -O1
-------------------------------------+-------------------------------------
           Reporter:  rbasso         |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.0.2
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  Incorrect result
  Unknown/Multiple                   |  at runtime
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 The following code shows inconsistent results when compiled with -O1:

 {{{#!hs
 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]
 }}}

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13425>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list