X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FcoreSyn%2FCoreSubst.lhs;h=18b12a6335a5b2d1b806d84218b2dfe6a7cfbc7d;hb=5e218036aabd1666ff2b509436e4e88491596c37;hp=50164795f6acfb1142b73dd3848b61a491a18a97;hpb=ca35995c610a2d3be5fbaad74436e59da364461c;p=ghc-hetmet.git diff --git a/compiler/coreSyn/CoreSubst.lhs b/compiler/coreSyn/CoreSubst.lhs index 5016479..18b12a6 100644 --- a/compiler/coreSyn/CoreSubst.lhs +++ b/compiler/coreSyn/CoreSubst.lhs @@ -116,12 +116,14 @@ For Ids, we have a different invariant In consequence: -* In substIdBndr, we extend the IdSubstEnv only when the unique changes +* If the TvSubstEnv and IdSubstEnv are both empty, substExpr would be a + no-op, so substExprSC ("short cut") does nothing. + + However, substExpr still goes ahead and substitutes. Reason: we may + want to replace existing Ids with new ones from the in-scope set, to + avoid space leaks. -* If the TvSubstEnv and IdSubstEnv are both empty, substExpr does nothing - (Note that the above rule for substIdBndr maintains this property. If - the incoming envts are both empty, then substituting the type and - IdInfo can't change anything.) +* In substIdBndr, we extend the IdSubstEnv only when the unique changes * In lookupIdSubst, we *must* look up the Id in the in-scope set, because it may contain non-trivial changes. Example: @@ -131,7 +133,7 @@ In consequence: set when we find the occurrence of x. * The requirement to look up the Id in the in-scope set means that we - must NOT take no-op short cut in the case the substitution is empty. + must NOT take no-op short cut when the IdSubst is empty. We must still look up every Id in the in-scope set. * (However, we don't need to do so for expressions found in the IdSubst @@ -697,7 +699,8 @@ simpleOptPgm dflags binds rules ; return (reverse binds', substRulesForImportedIds subst' rules) } where - occ_anald_binds = occurAnalysePgm binds rules + occ_anald_binds = occurAnalysePgm Nothing {- No rules active -} + rules binds (subst', binds') = foldl do_one (emptySubst, []) occ_anald_binds do_one (subst, binds') bind