[GHC] #14754: -O1 changes result at runtime

GHC ghc-devs at haskell.org
Sat Feb 3 18:26:31 UTC 2018


#14754: -O1 changes result at runtime
-------------------------------------+-------------------------------------
        Reporter:  Bodigrim          |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  highest           |            Milestone:  8.4.1
       Component:  Compiler          |              Version:  8.4.1-alpha1
      Resolution:                    |             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:                    |
-------------------------------------+-------------------------------------
Changes (by bgamari):

 * priority:  high => highest
 * milestone:   => 8.4.1


Old description:

> I found a program, which works as expected in GHC 8.4.1-alpha1 with
> `-O0`, but freezes with `-O1`.
>
> {{{
> module Main where
>
> import Debug.Trace
>
> main :: IO ()
> main = print (alg 3 1)
>
> alg :: Word -> Word -> Word
> alg a b
>   | traceShow (a, b) False = undefined
>   | c < b = alg b c
>   | c > b = alg c b
>   | otherwise = c
>   where
>     c = a - b
> }}}
>
> {{{
> $ ghc --version
> The Glorious Glasgow Haskell Compilation System, version 8.4.0.20180118
> $ ghc -O0 alg.hs
> [1 of 1] Compiling Main             ( alg.hs, alg.o )
> Linking alg ...
> $ ./alg
> (3,1)
> (2,1)
> 1
> $ ghc -O1 alg.hs
> [1 of 1] Compiling Main             ( alg.hs, alg.o ) [Optimisation flags
> changed]
> Linking alg ...
> $ ./alg 2>&1 | head
> (3,1)
> (1,2)
> (2,18446744073709551615)
> (18446744073709551615,3)
> ^C
> }}}
>
> For some reason an optimised program chooses a wrong case at the very
> first invocation of `alg`.

New description:

 I found a program, which works as expected in GHC 8.4.1-alpha1 with `-O0`,
 but freezes with `-O1`.

 {{{#!hs
 module Main where

 import Debug.Trace

 main :: IO ()
 main = print (alg 3 1)

 alg :: Word -> Word -> Word
 alg a b
   | traceShow (a, b) False = undefined
   | c < b = alg b c
   | c > b = alg c b
   | otherwise = c
   where
     c = a - b
 }}}

 {{{
 $ ghc --version
 The Glorious Glasgow Haskell Compilation System, version 8.4.0.20180118
 $ ghc -O0 alg.hs
 [1 of 1] Compiling Main             ( alg.hs, alg.o )
 Linking alg ...
 $ ./alg
 (3,1)
 (2,1)
 1
 $ ghc -O1 alg.hs
 [1 of 1] Compiling Main             ( alg.hs, alg.o ) [Optimisation flags
 changed]
 Linking alg ...
 $ ./alg 2>&1 | head
 (3,1)
 (1,2)
 (2,18446744073709551615)
 (18446744073709551615,3)
 ^C
 }}}

 For some reason an optimised program chooses a wrong case at the very
 first invocation of `alg`.

--

Comment:

 Yikes! Thank you for catching this.

 I guess this means my plans for another alpha release today are on hold.

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


More information about the ghc-tickets mailing list