diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2017-10-30 14:56:58 +0000 |
---|---|---|
committer | Simon Peyton Jones <simonpj@microsoft.com> | 2017-10-30 14:57:09 +0000 |
commit | 609f2844b92d5aa474f34b989c6ec5ad9fdb2ce3 (patch) | |
tree | 4824aa4148d0f5a58c62077b7f67a169b3775136 | |
parent | 201b5aa65109e09953caa1dc1774b75fabbf61b0 (diff) | |
download | haskell-609f2844b92d5aa474f34b989c6ec5ad9fdb2ce3.tar.gz |
Add Note [Setting the right in-scope set]
-rw-r--r-- | compiler/simplCore/SimplEnv.hs | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/compiler/simplCore/SimplEnv.hs b/compiler/simplCore/SimplEnv.hs index 0badb2a13e..d2cb689a22 100644 --- a/compiler/simplCore/SimplEnv.hs +++ b/compiler/simplCore/SimplEnv.hs @@ -337,7 +337,8 @@ setInScopeSet :: SimplEnv -> InScopeSet -> SimplEnv setInScopeSet env in_scope = env {seInScope = in_scope} setInScopeFromE :: SimplEnv -> SimplEnv -> SimplEnv -setInScopeFromE env env' = env { seInScope = seInScope env' } +-- See Note [Setting the right in-scope set] +setInScopeFromE rhs_env here_env = rhs_env { seInScope = seInScope here_env } setInScopeFromF :: SimplEnv -> SimplFloats -> SimplEnv setInScopeFromF env floats = env { seInScope = sfInScope floats } @@ -360,6 +361,30 @@ modifyInScope :: SimplEnv -> CoreBndr -> SimplEnv modifyInScope env@(SimplEnv {seInScope = in_scope}) v = env {seInScope = extendInScopeSet in_scope v} +{- Note [Setting the right in-scope set] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Consider + \x. (let x = e in b) arg[x] +where the let shadows the lambda. Really this means something like + \x1. (let x2 = e in b) arg[x1] + +- When we capture the 'arg' in an ApplyToVal continuation, we capture + the environment, which says what 'x' is bound to, namely x1 + +- Then that continuation gets pushed under the let + +- Finally we simplify 'arg'. We want + - the static, lexical environment bindig x :-> x1 + - the in-scopeset from "here", under the 'let' which includes + both x1 and x2 + +It's important to have the right in-scope set, else we may rename a +variable to one that is already in scope. So we must pick up the +in-scope set from "here", but otherwise use the environment we +captured along with 'arg'. This transfer of in-scope set is done by +setInScopeFromE. +-} + --------------------- zapSubstEnv :: SimplEnv -> SimplEnv zapSubstEnv env = env {seTvSubst = emptyVarEnv, seCvSubst = emptyVarEnv, seIdSubst = emptyVarEnv} |