Fix treatment of -0.0
authorBen Gamari <bgamari.foss@gmail.com>
Fri, 2 Oct 2015 13:40:43 +0000 (15:40 +0200)
committerBen Gamari <ben@smart-cactus.org>
Fri, 2 Oct 2015 13:51:09 +0000 (15:51 +0200)
commiteb975d2eec349429e735c272d46a7becccf393c6
tree1784251eaa5b21fd1d3477f1e55415053b6925cd
parenta52db23198708984885fe43f14570a8912583f3e
Fix treatment of -0.0

Here we fix a few mis-optimizations that could occur in code with
floating point comparisons with -0.0. These issues arose from our
insistence on rewriting equalities into case analyses and the
simplifier's ignorance of floating-point semantics.

For instance, in Trac #10215 (and the similar issue Trac #9238) we
turned `ds == 0.0` into a case analysis,

```
case ds of
    __DEFAULT -> ...
    0.0 -> ...
```

Where the second alternative matches where `ds` is +0.0 and *also* -0.0.
However, the simplifier doesn't realize this and will introduce a local
inlining of `ds = -- +0.0` as it believes this is the only
value that matches this pattern.

Instead of teaching the simplifier about floating-point semantics
we simply prohibit case analysis on floating-point scrutinees and keep
this logic in the comparison primops, where it belongs.

We do several things here,

 - Add test cases from relevant tickets
 - Clean up a bit of documentation
 - Desugar literal matches against floats into applications of the
   appropriate equality primitive instead of case analysis
 - Add a CoreLint to ensure we don't pattern match on floats in Core

Test Plan: validate with included testcases

Reviewers: goldfire, simonpj, austin

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D1061

GHC Trac Issues: #10215, #9238
compiler/coreSyn/CoreLint.hs
compiler/coreSyn/CoreSyn.hs
compiler/deSugar/MatchLit.hs
compiler/prelude/PrelRules.hs
compiler/typecheck/TcType.hs
testsuite/tests/deSugar/should_run/T10215.hs [new file with mode: 0644]
testsuite/tests/deSugar/should_run/T10215.stdout [new file with mode: 0644]
testsuite/tests/deSugar/should_run/T9238.hs [new file with mode: 0644]
testsuite/tests/deSugar/should_run/T9238.stdout [new file with mode: 0644]
testsuite/tests/deSugar/should_run/all.T