diff options
| author | Ben Gamari <bgamari.foss@gmail.com> | 2015-10-02 15:40:43 +0200 |
|---|---|---|
| committer | Ben Gamari <ben@smart-cactus.org> | 2015-10-02 15:51:09 +0200 |
| commit | eb975d2eec349429e735c272d46a7becccf393c6 (patch) | |
| tree | 1784251eaa5b21fd1d3477f1e55415053b6925cd /compiler/codeGen/CgUtils.hs | |
| parent | a52db23198708984885fe43f14570a8912583f3e (diff) | |
| download | haskell-eb975d2eec349429e735c272d46a7becccf393c6.tar.gz | |
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
Diffstat (limited to 'compiler/codeGen/CgUtils.hs')
0 files changed, 0 insertions, 0 deletions
