From: simonpj@microsoft.com Date: Mon, 9 Nov 2009 10:37:03 +0000 (+0000) Subject: Wibble to substituting InlWrappers X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=ec73f013e4ec09a741a69bf50b78ecaf1fe0835f Wibble to substituting InlWrappers See Note [Worker inlining] in CoreSubst --- diff --git a/compiler/coreSyn/CoreSubst.lhs b/compiler/coreSyn/CoreSubst.lhs index 14eccc6..b02bc80 100644 --- a/compiler/coreSyn/CoreSubst.lhs +++ b/compiler/coreSyn/CoreSubst.lhs @@ -523,13 +523,11 @@ substUnfolding _ unf = unf -- NoUnfolding, OtherCon ------------------- substInlineRuleInfo :: Subst -> InlineRuleInfo -> InlineRuleInfo -substInlineRuleInfo subst (InlWrapper wkr) - = case lookupIdSubst subst wkr of - Var w1 -> InlWrapper w1 - other -> WARN( not (exprIsTrivial other), text "CoreSubst.substWorker:" <+> ppr wkr ) - InlVanilla -- Worker has got substituted away altogether - -- (This can happen if it's trivial, via - -- postInlineUnconditionally, hence only warning) +substInlineRuleInfo (Subst in_scope ids _) (InlWrapper wkr) + | Just (Var w1) <- lookupVarEnv ids wkr = InlWrapper w1 + | Just w1 <- lookupInScope in_scope wkr = InlWrapper w1 + | otherwise = WARN( True, text "Interesting! CoreSubst.substWorker:" <+> ppr wkr ) + InlVanilla -- Note [Worker inlining] substInlineRuleInfo _ info = info ------------------ @@ -584,6 +582,18 @@ substVarSet subst fvs | otherwise = Type.tyVarsOfType (lookupTvSubst subst fv) \end{code} +Note [Worker inlining] +~~~~~~~~~~~~~~~~~~~~~~ +A worker can get sustituted away entirely. + - it might be trivial + - it might simply be very small +We do not treat an InlWrapper as an 'occurrence' in the occurence +analyser, so it's possible that the worker is not even in scope any more. + +In all all these cases we simply drop the special case, returning to +InlVanilla. The WARN is just so I can see if it happens a lot. + + %************************************************************************ %* * The Very Simple Optimiser diff --git a/compiler/coreSyn/CoreSyn.lhs b/compiler/coreSyn/CoreSyn.lhs index e9e7f8d..0724630 100644 --- a/compiler/coreSyn/CoreSyn.lhs +++ b/compiler/coreSyn/CoreSyn.lhs @@ -477,6 +477,7 @@ data InlineRuleInfo | InlWrapper Id -- This unfolding is a the wrapper in a -- worker/wrapper split from the strictness analyser + -- The Id is the worker-id -- Used to abbreviate the uf_tmpl in interface files -- which don't need to contain the RHS; -- it can be derived from the strictness info