X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FcoreSyn%2FCoreFVs.lhs;h=46c21b26dd505e75624abed2dc7c9e34b9da3f24;hb=ec5035bd9b6a052126d9631331ff924fc9cc28e6;hp=f94f61d25ebd30ea2a1fd0578de933deb5b7a283;hpb=72462499b891d5779c19f3bda03f96e24f9554ae;p=ghc-hetmet.git diff --git a/compiler/coreSyn/CoreFVs.lhs b/compiler/coreSyn/CoreFVs.lhs index f94f61d..46c21b2 100644 --- a/compiler/coreSyn/CoreFVs.lhs +++ b/compiler/coreSyn/CoreFVs.lhs @@ -416,12 +416,16 @@ idRuleRhsVars id = foldr (unionVarSet . ruleRhsFreeVars) idUnfoldingVars :: Id -> VarSet -- Produce free vars for an unfolding, but NOT for an ordinary -- (non-inline) unfolding, since it is a dup of the rhs +-- and we'll get exponential behaviour if we look at both unf and rhs! +-- But do look at the *real* unfolding, even for loop breakers, else +-- we might get out-of-scope variables idUnfoldingVars id - = case idUnfolding id of - CoreUnfolding { uf_tmpl = rhs, uf_guidance = InlineRule {} } - -> exprFreeVars rhs - DFunUnfolding _ args -> exprsFreeVars args - _ -> emptyVarSet + = case realIdUnfolding id of + CoreUnfolding { uf_tmpl = rhs, uf_src = src } + | isInlineRuleSource src + -> exprFreeVars rhs + DFunUnfolding _ _ args -> exprsFreeVars args + _ -> emptyVarSet \end{code}