Ticket #2078 (closed bug: fixed)
INLINE and strictness
| Reported by: | simonpj | Owned by: | simonpj |
|---|---|---|---|
| Priority: | lowest | Milestone: | 7.6.1 |
| Component: | Compiler | Version: | 6.8.2 |
| Keywords: | Cc: | ndp@… | |
| Operating System: | Unknown/Multiple | Architecture: | Unknown/Multiple |
| Type of failure: | Runtime performance bug | Difficulty: | Unknown |
| Test Case: | Blocked By: | ||
| Blocking: | Related Tickets: |
Description
Consider this code
module A where
{-# INLINE [0] foo #-}
{#- RULE foo (reverse xs) = xs #-}
foo xs = reverse $ xs
module B where
import A( foo )
g b ys = foo (case b of
True -> reverse ys
False -> ys)
h xs = map foo xs
At the moment the body of foo is not optimised at all, because it's going to be inlined. But that means that
- The foo executed by the map in h is very inefficient, because it actually calls $ etc.
- The strictness analyser doesn't see that foo is strict, because again the $ gets in the way. So the rule for foo does not match in the RHS of g. (If foo were strict, we'd push the call to foo inside the case branches.)
For both reasons it'd be better to
- Retain the original RHS of foo for inlining purposes
- But otherwise optimise foo normally, so that if it is not inlined, we get the efficient version, and so that strictness analysis does the right thing.
Hmm. Maybe INLINE should turn into a RULE, rather than (as now) a Note in Core?
Anyway, this ticket is to make sure I don't forget this point.
Change History
Note: See
TracTickets for help on using
tickets.
