X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FcoreSyn%2FCoreFVs.lhs;h=1e8c9e7b0b226d63bee9664a25803d8f6175ff53;hp=f94f61d25ebd30ea2a1fd0578de933deb5b7a283;hb=c86161c5cf11de77e911fcb9e1e2bd1f8bd80b42;hpb=72462499b891d5779c19f3bda03f96e24f9554ae diff --git a/compiler/coreSyn/CoreFVs.lhs b/compiler/coreSyn/CoreFVs.lhs index f94f61d..1e8c9e7 100644 --- a/compiler/coreSyn/CoreFVs.lhs +++ b/compiler/coreSyn/CoreFVs.lhs @@ -416,9 +416,13 @@ 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 {} } + = case realIdUnfolding id of + CoreUnfolding { uf_tmpl = rhs, uf_src = src } + | isInlineRuleSource src -> exprFreeVars rhs DFunUnfolding _ args -> exprsFreeVars args _ -> emptyVarSet