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.
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