Incorrect optimizations involving negative zero
The program
main = print $ if negativeZero == 0.0 then 1 / negativeZero else 0.0
where
negativeZero = negate 0.0
outputs -Infinity when compiled with GHC 7.6.3 and Infinity when compiled with GHC 7.8.3 and the optimization level -O2. The relevant pieces of Core:
-- GHC 7.6.3
Main.main2 =
case GHC.Prim.==## (GHC.Prim.negateDouble# 0.0) 0.0 of _ {
GHC.Types.False -> Main.main3 (GHC.Types.[] @ GHC.Types.Char);
GHC.Types.True ->
case GHC.Prim./## 1.0 (GHC.Prim.negateDouble# 0.0)
of wild2_aK6 { __DEFAULT ->
GHC.Float.$w$sshowSignedFloat
GHC.Float.$fShowDouble_$sshowFloat
GHC.Show.shows26
wild2_aK6
(GHC.Types.[] @ GHC.Types.Char)
}
}
-- GHC 7.8.3
Main.main2 =
case GHC.Prim.negateDouble# 0.0 of _ [Occ=Dead] {
__DEFAULT -> Main.main3 (GHC.Types.[] @ GHC.Types.Char);
0.0 ->
case GHC.Prim./## 1.0 0.0 of wild2_a1NU { __DEFAULT ->
GHC.Float.$w$sshowSignedFloat
GHC.Float.$fShowDouble_$sshowFloat
GHC.Show.shows27
wild2_a1NU
(GHC.Types.[] @ GHC.Types.Char)
}
}
I don't think this problem is operating system/architecture dependent, but for the sake of completeness I'm on a 32-bit Linux, and this issue was first discovered on 64-bit Windows running in a virtual machine.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.8.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |