Inefficient code generated for x^2
Okay, this one is quite surprising to me. Suppose the following trivial Haskell program:
main = print (2.0 ^ 2)
This innocent example actually ends up generating multiple pages of Core! To see what's going on we just have to look at a few type signatures:
$wg1_r11f :: Double# -> Type.Integer -> Double# -> Double#
$wf1 :: Double# -> Type.Integer -> Double#
The function $wf1 is what is called to perform the calculation. First thing to note is that it actually compiles ^2 into a loop (that's what $wg1_r11f is for). Second, to make matters worse, it ends up using Integer of all things as the index type (defaulting at work, probably).
This has obviously drastic performance implications. A more complicated example program actually got about 4 times faster just by replacing all instances of x^2 with x*x.
I guess this probably is not easy to fix in the general case (speculative loop unrolling?). But couldn't we have, say, a rule that catches the worst cases?
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.0.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |