[commit: ghc] wip/T14068: Prevent inlining of loopified programs (cec4ce2)
git at git.haskell.org
git at git.haskell.org
Wed Nov 1 17:00:13 UTC 2017
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/T14068
Link : http://ghc.haskell.org/trac/ghc/changeset/cec4ce21a05ae083150998cdfb31f12701424d9c/ghc
>---------------------------------------------------------------
commit cec4ce21a05ae083150998cdfb31f12701424d9c
Author: Joachim Breitner <mail at joachim-breitner.de>
Date: Fri Aug 4 15:34:11 2017 -0400
Prevent inlining of loopified programs
Previously, a recursive function is not inlineable. After loopification,
it turns into a non-recursive function, and suddenly it is. While this
is in general desirable, it has many knock-on effects, which makes it
hard to evaluate and debug loopification. Therefore, this commit (tries to)
prevent this inlining. When this results in no unfixable regressions,
then we can tackle the next step.
It is surprisingly hard to reliably prevent inlining, it seems, so I
have been playing whack-a-mole a bit:
* simpl_binds has two copies of the ids around, one in the env and one
in the AST. If maybeLoopify changes only one of them, then things go wrong.
Worked-around that for now, but probably not ideal.
TODO: Apply maybeLoopify before entering simplTopBinds
* Also, worker-wrapper needs to preserve the no-inlining better.
>---------------------------------------------------------------
cec4ce21a05ae083150998cdfb31f12701424d9c
compiler/coreSyn/CoreOpt.hs | 8 +++++++-
compiler/simplCore/Simplify.hs | 4 +++-
compiler/stranal/WorkWrap.hs | 1 +
3 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/compiler/coreSyn/CoreOpt.hs b/compiler/coreSyn/CoreOpt.hs
index 605a679..550a0a7 100644
--- a/compiler/coreSyn/CoreOpt.hs
+++ b/compiler/coreSyn/CoreOpt.hs
@@ -673,8 +673,14 @@ loopificationJoinPointBinding_maybe bndr rhs
zapFragileIdInfo $
localiseId $
bndr
+
-- RULES etc stay with bindr'
- bndr' = zapIdTailCallInfo bndr
+ -- Also, previously, the function was recursive, and hence not inlineable.
+ -- To tread with caution, let's keep it this way
+ bndr' = (`setIdUnfolding` noUnfolding) $
+ (`setInlinePragma` neverInlinePragma) $
+ zapIdTailCallInfo $
+ bndr
in Just (bndr', join_bndr, mkLams bndrs body)
| otherwise
diff --git a/compiler/simplCore/Simplify.hs b/compiler/simplCore/Simplify.hs
index 7eaf96a..6e75a80 100644
--- a/compiler/simplCore/Simplify.hs
+++ b/compiler/simplCore/Simplify.hs
@@ -145,7 +145,9 @@ simplTopBinds env0 binds0
; return (float `addFloats` floats, env2) }
simpl_bind env bind | Just bind' <- maybeLoopify bind
- = simpl_bind env bind'
+ = do -- update the env, as maybeLoopify changes the id info
+ env1 <- simplRecBndrs env (bindersOf bind')
+ simpl_bind env1 bind'
simpl_bind env (Rec pairs) = simplRecBind env TopLevel Nothing pairs
simpl_bind env (NonRec b r) = do { (env', b') <- addBndrRules env b (lookupRecBndr env b)
; simplRecOrTopPair env' TopLevel
diff --git a/compiler/stranal/WorkWrap.hs b/compiler/stranal/WorkWrap.hs
index ac8798e..49045d9 100644
--- a/compiler/stranal/WorkWrap.hs
+++ b/compiler/stranal/WorkWrap.hs
@@ -479,6 +479,7 @@ splitFun dflags fam_envs fn_id fn_info wrap_dmds res_info rhs
work_act = case work_inline of
-- See Note [Activation for workers]
NoInline -> inl_act inl_prag
+ NoUserInline | isNeverActive (inl_act inl_prag) -> inl_act inl_prag
_ -> wrap_act
work_prag = InlinePragma { inl_src = SourceText "{-# INLINE"
, inl_inline = work_inline
More information about the ghc-commits
mailing list