#2078: INLINE and strictness
-----------------------------------------+----------------------------------
Reporter: simonpj | Owner: simonpj
Type: run-time performance bug | Status: new
Priority: normal | Milestone: 6.10 branch
Component: Compiler | Version: 6.8.2
Severity: normal | Keywords:
Difficulty: Unknown | Testcase:
Architecture: Unknown | Os: Unknown
-----------------------------------------+----------------------------------
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.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/2078>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs