X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FcoreSyn%2FCoreFVs.lhs;h=807b76c02e04da08eb02f9653b1599a7325b11df;hb=2eb04ca0f8d0ec72b417cddc60672c696b4a3daa;hp=bda9342f7b281283287f3f5c62d150a60d2303af;hpb=8ffdb8eed6b38db00761093889f5cddbe8ca1d60;p=ghc-hetmet.git diff --git a/compiler/coreSyn/CoreFVs.lhs b/compiler/coreSyn/CoreFVs.lhs index bda9342..807b76c 100644 --- a/compiler/coreSyn/CoreFVs.lhs +++ b/compiler/coreSyn/CoreFVs.lhs @@ -14,7 +14,7 @@ module CoreFVs ( exprFreeNames, exprsFreeNames, idRuleVars, idFreeVars, varTypeTyVars, - ruleRhsFreeVars, rulesRhsFreeVars, + ruleRhsFreeVars, rulesFreeVars, ruleLhsFreeNames, ruleLhsFreeIds, CoreExprWithFVs, -- = AnnExpr Id VarSet @@ -241,18 +241,18 @@ exprsFreeNames es = foldr (unionNameSets . exprFreeNames) emptyNameSet es ruleRhsFreeVars :: CoreRule -> VarSet ruleRhsFreeVars (BuiltinRule {}) = noFVs ruleRhsFreeVars (Rule { ru_fn = fn, ru_bndrs = bndrs, ru_rhs = rhs }) - = delFromUFM fvs fn - -- Hack alert! - -- Don't include the Id in its own rhs free-var set. - -- Otherwise the occurrence analyser makes bindings recursive - -- that shoudn't be. E.g. - -- RULE: f (f x y) z ==> f x (f y z) + = delFromUFM fvs fn -- Note [Rule free var hack] where fvs = addBndrs bndrs (expr_fvs rhs) isLocalVar emptyVarSet -rulesRhsFreeVars :: [CoreRule] -> VarSet -rulesRhsFreeVars rules - = foldr (unionVarSet . ruleRhsFreeVars) emptyVarSet rules +ruleFreeVars :: CoreRule -> VarSet -- All free variables, both left and right +ruleFreeVars (Rule { ru_fn = fn, ru_bndrs = bndrs, ru_rhs = rhs, ru_args = args }) + = delFromUFM fvs fn -- Note [Rule free var hack] + where + fvs = addBndrs bndrs (exprs_fvs (rhs:args)) isLocalVar emptyVarSet + +rulesFreeVars :: [CoreRule] -> VarSet +rulesFreeVars rules = foldr (unionVarSet . ruleFreeVars) emptyVarSet rules ruleLhsFreeIds :: CoreRule -> VarSet -- This finds all locally-defined free Ids on the LHS of the rule @@ -261,6 +261,14 @@ ruleLhsFreeIds (Rule { ru_bndrs = bndrs, ru_args = args }) = addBndrs bndrs (exprs_fvs args) isLocalId emptyVarSet \end{code} +Note [Rule free var hack] +~~~~~~~~~~~~~~~~~~~~~~~~~ +Don't include the Id in its own rhs free-var set. +Otherwise the occurrence analyser makes bindings recursive +that shoudn't be. E.g. + RULE: f (f x y) z ==> f x (f y z) + +Also since rule_fn is a Name, not a Var, we have to use the grungy delUFM. %************************************************************************ %* *