Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : supercompiler

http://hackage.haskell.org/trac/ghc/changeset/ea232136c947a1d68da35809ea62a2d3074e48e4

>---------------------------------------------------------------

commit ea232136c947a1d68da35809ea62a2d3074e48e4
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Thu Oct 4 16:30:16 2012 +0100

    Fix MSG not preserving global-idness

>---------------------------------------------------------------

 compiler/supercompile/Supercompile.hs           |    1 -
 compiler/supercompile/Supercompile/Drive/MSG.hs |   20 ++++++++++----------
 2 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/compiler/supercompile/Supercompile.hs 
b/compiler/supercompile/Supercompile.hs
index 5f59e69..5e52e96 100644
--- a/compiler/supercompile/Supercompile.hs
+++ b/compiler/supercompile/Supercompile.hs
@@ -147,7 +147,6 @@ mkLiftedTupleSelector xs want_x tup_e
 termUnfoldings :: S.Term -> [(Var, S.Term)]
 termUnfoldings e = go (S.termFreeVars e) emptyVarSet [] []
   where
-    -- FIXME: varBndrFreeVars?
     go new_fvs all_fvs all_xwhy_nots all_xes
       | isEmptyVarSet added_fvs = pprTrace "termUnfoldings" (vcat [hang (text 
why_not <> text ":") 2 (vcat (map ppr xs)) | (why_not, xs) <- groups snd fst 
all_xwhy_nots]) $
                                   all_xes
diff --git a/compiler/supercompile/Supercompile/Drive/MSG.hs 
b/compiler/supercompile/Supercompile/Drive/MSG.hs
index 3736fc0..a702cc0 100644
--- a/compiler/supercompile/Supercompile/Drive/MSG.hs
+++ b/compiler/supercompile/Supercompile/Drive/MSG.hs
@@ -23,8 +23,8 @@ import Util
 import Coercion
 import CoreUtils  (hashCoercion, hashType {- , hashExpr -})
 import Name       (mkSystemVarName)
-import Var        (TyVar, mkTyVar, isTyVar, isId, varType, setVarType, 
tyVarKind, setTyVarKind, varName, idDetails, setIdDetails, idInfo, 
lazySetIdInfo)
-import Id         (Id, idType, idName, realIdUnfolding, setIdUnfolding, 
idSpecialisation, setIdSpecialisation, mkSysLocal, mkLocalId)
+import Var        (TyVar, mkTyVar, isTyVar, isId, varType, setVarType, 
tyVarKind, setTyVarKind, varName, idDetails, setIdDetails, idInfo, 
lazySetIdInfo, varUnique)
+import Id         (Id, idType, idName, realIdUnfolding, setIdUnfolding, 
idSpecialisation, setIdSpecialisation, mkSysLocal, mkLocalId, isGlobalId)
 import IdInfo     (SpecInfo(..))
 import VarEnv
 import Pair
@@ -235,14 +235,14 @@ msgPend rn2 x0 pending = MSG $ \e s0 -> case 
lookupUpdatePending s0 of
     Right x                       -> (s0, pure x)
     Left (mb_eq, binderise, mk_s) -> case res of (_,  Left msg) -> (s0, Left 
msg)
                                                  (s3, Right x)  -> (s3, Right 
x)  -- NB: must revert state or else x_looped will be in the msgKnownVars, and 
pulling on it will fail the irrefutible pattern match
-      where -- The use of s here is necessary to ensure we only allocate a 
given common var once
-            extra_iss | Just eq <- mb_eq
-                      , eq `elemInScopeSet` msgCommonHeapVars (msgMode e)
-                      = emptyInScopeSet
-                      | otherwise
-                      = msgInScopeSet s0
-            -- This use of rn2 is 1/2 of the story necessary to ensure new 
common vars don't clash with rigid binders
-            x1 = uniqAway (rnInScopeSet rn2 `unionInScope` extra_iss) x0
+      where x1 = case mb_eq of
+                   Just eq | eq `elemInScopeSet` msgCommonHeapVars (msgMode e) 
|| isGlobalId eq
+                   -- The incoming x0 is always a local variable, but we 
better make a damn sure that we return a global variable if necessary
+                   -- TODO: maybe all global ids should be in the initial 
InScopeSet? Would need to change prepareTerm.
+                           -> eq
+                   -- This use of rn2 is 1/2 of the story necessary to ensure 
new common vars don't clash with rigid binders
+                   -- The use of s here is necessary to ensure we only 
allocate a given common var once
+                   _       -> uniqAway (rnInScopeSet rn2 `unionInScope` 
msgInScopeSet s0) x0
             -- We *don't* need to uniqAway with the set of common variables 
(in e) because the msgInScopeSet
             -- was initialized to contain them all.
 



_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to