Commit 51367fba authored by simonpj@microsoft.com's avatar simonpj@microsoft.com
Browse files

Don't worker-wrapper INLINABLE things

See Note [Don't w/w INLINABLE things] in WorkWrap

This fixes a bug that Milan found.
parent 94bf0d36
...@@ -173,6 +173,20 @@ I measured it on nofib, it didn't make much difference; just a few ...@@ -173,6 +173,20 @@ I measured it on nofib, it didn't make much difference; just a few
percent improved allocation on one benchmark (bspt/Euclid.space). percent improved allocation on one benchmark (bspt/Euclid.space).
But nothing got worse. But nothing got worse.
Note [Don't w/w INLINABLE things]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If we have
{-# INLINABLE f #-}
f x y = ....
then in principle we might get a more efficient loop by w/w'ing f.
But that would make a new unfolding which would overwrite the old
one. So we leave INLINABLE things alone too.
This is a slight infelicity really, because it means that adding
an INLINABLE pragma could make a program a bit less efficient,
because you lose the worker/wrapper stuff. But I don't see a way
to avoid that.
Note [Wrapper activation] Note [Wrapper activation]
~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~
When should the wrapper inlining be active? It must not be active When should the wrapper inlining be active? It must not be active
...@@ -260,6 +274,7 @@ tryWW is_rec fn_id rhs ...@@ -260,6 +274,7 @@ tryWW is_rec fn_id rhs
checkSize :: Id -> CoreExpr checkSize :: Id -> CoreExpr
-> UniqSM [(Id,CoreExpr)] -> UniqSM [(Id,CoreExpr)] -> UniqSM [(Id,CoreExpr)] -> UniqSM [(Id,CoreExpr)]
-- See Note [Don't w/w inline things (a) and (b)] -- See Note [Don't w/w inline things (a) and (b)]
-- and Note [Don't w/w INLINABLE things]
checkSize fn_id rhs thing_inside checkSize fn_id rhs thing_inside
| isStableUnfolding unfolding -- For DFuns and INLINE things, leave their | isStableUnfolding unfolding -- For DFuns and INLINE things, leave their
= return [ (fn_id, rhs) ] -- unfolding unchanged; but still attach = return [ (fn_id, rhs) ] -- unfolding unchanged; but still attach
...@@ -271,7 +286,8 @@ checkSize fn_id rhs thing_inside ...@@ -271,7 +286,8 @@ checkSize fn_id rhs thing_inside
| otherwise = thing_inside | otherwise = thing_inside
where where
unfolding = idUnfolding fn_id unfolding = realIdUnfolding fn_id -- We want to see the unfolding
-- for loop breakers!
inline_rule = mkInlineUnfolding Nothing rhs inline_rule = mkInlineUnfolding Nothing rhs
--------------------- ---------------------
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment