Optimizer has bugs regarding handling of -0.0
This is most likely related to #9238 (closed)
Perhaps it can be merged into that if it is indeed the case, though it'd be good for an expert to take a look and make sure first that the culprit is indeed the same. In any case, the program in this ticket can at least serve as a test-case.
I observed this on 7.8.3; though I suspect the same holds in the just released 7.10.1 as well. For the following program:
testF :: Float -> Bool
testF x = x == 0 && not (isNegativeZero x)
testD :: Double -> Bool
testD x = x == 0 && not (isNegativeZero x)
main :: IO ()
main = do print $ testF (-0.0)
print $ testD (-0.0)
If I compile with no optimizations, then I get the correct answers:
$ /bin/rm -f a.hi a.o a; ghc -O0 a; ./a
[1 of 1] Compiling Main ( a.hs, a.o )
Linking a ...
False
False
But if I turn optimizations on, then I get:
$ /bin/rm -f a.hi a.o a; ghc -O2 a; ./a
[1 of 1] Compiling Main ( a.hs, a.o )
Linking a ...
True
True
which is just plain wrong.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.8.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | high |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |