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

On branch  : 

http://hackage.haskell.org/trac/ghc/changeset/15031a34ecf273fbfed2a505a8cb0cff96439610

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

commit 15031a34ecf273fbfed2a505a8cb0cff96439610
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Tue Mar 20 17:40:29 2012 +0000

    Fix shadowing bug in DFunUnfoldings that showed up as a lint failure

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

 compiler/supercompile/Supercompile.hs     |   19 ++++++++++++++-----
 compiler/supercompile/Supercompile/GHC.hs |   10 +++++-----
 2 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/compiler/supercompile/Supercompile.hs 
b/compiler/supercompile/Supercompile.hs
index 7e65989..338c7e2 100644
--- a/compiler/supercompile/Supercompile.hs
+++ b/compiler/supercompile/Supercompile.hs
@@ -163,10 +163,10 @@ termUnfoldings e = go (S.termFreeVars e) emptyVarSet []
       | otherwise                          = case realIdUnfolding x of
         NoUnfolding                   -> Nothing
         OtherCon _                    -> Nothing
-        DFunUnfolding _ dc es         -> Just $ runParseM $ coreExprToTerm $ 
mkLams as $ mkLams xs $ Var (dataConWorkId dc) `mkTyApps` cls_tys `mkApps` [(e 
`mkTyApps` map mkTyVarTy as) `mkVarApps` xs | e <- es]
+        DFunUnfolding _ dc es         -> Just $ runParseM us2 $ coreExprToTerm 
$ mkLams as $ mkLams xs $ Var (dataConWorkId dc) `mkTyApps` cls_tys `mkApps` 
[(e `mkTyApps` map mkTyVarTy as) `mkVarApps` xs | e <- es]
          where (as, theta, _cls, cls_tys) = tcSplitDFunTy (idType x)
                xs = zipWith (mkSysLocal (fsLit "x")) bv_uniques theta
-        CoreUnfolding { uf_tmpl = e } -> Just $ runParseM $ coreExprToTerm e
+        CoreUnfolding { uf_tmpl = e } -> Just $ runParseM us2 $ coreExprToTerm 
e
          -- NB: it's OK if the unfolding is a non-value, as the evaluator 
won't inline LetBound non-values
     
     -- We don't want to expose an unfolding if it would not be inlineable in 
the initial phase.
@@ -193,15 +193,24 @@ termUnfoldings e = go (S.termFreeVars e) emptyVarSet []
             xs = zipWith (mkSysLocal (fsLit "x")) bv_uniques arg_tys
             (qs, ys) = span isCoVar xs
 
-    -- It doesn't matter if we reuse Uniques here because by construction they 
can't shadow other uses of the anfUniqSupply'
-    bv_uniques = uniqsFromSupply anfUniqSupply'
+    -- We need a UniqSupply so we can generate Uniques for datacon/primop/user 
unfoldings. It doesn't really matter
+    -- that the binders we generate here may shadow things above, but we have 
to be careful with our use of anfUniqSupply'
+    -- when we call runParseM to deal with user unfoldings. The reason is that 
coreExprToTerm assumes that no free variables
+    -- of the CoreExpr have Uniques generated by the unique supply it is 
passed.
+    --
+    -- This meant that when runParseM used to unconditionally use 
anfUniqSupply' for Uniques we had a stupid bug, because
+    -- we were also using the uniques from anfUniqueSupply to generate 
lambda-binders in the DFunUnfolding case.
+    -- All we needed to do to fix this was to make sure we split off a 
seperate UniqSupply for generating the lambda-bindings
+    -- than we pass down to runParseM. 
+    (us1, us2) = splitUniqSupply anfUniqSupply'
+    bv_uniques = uniqsFromSupply us1
 
 supercompile :: CoreExpr -> IO CoreExpr
 supercompile e = -- liftM (termToCoreExpr . snd) $
                  return $ termToCoreExpr $
                  S.supercompile (M.fromList unfs) e'
   where unfs = termUnfoldings e'
-        e' = runParseM (coreExprToTerm e)
+        e' = runParseM anfUniqSupply' (coreExprToTerm e)
 
 supercompileProgram :: [CoreBind] -> IO [CoreBind]
 supercompileProgram binds = supercompileProgramSelective selector binds
diff --git a/compiler/supercompile/Supercompile/GHC.hs 
b/compiler/supercompile/Supercompile/GHC.hs
index d44496b..5e5ff06 100644
--- a/compiler/supercompile/Supercompile/GHC.hs
+++ b/compiler/supercompile/Supercompile/GHC.hs
@@ -79,12 +79,12 @@ instance Monad ParseM where
 instance MonadUnique ParseM where
     getUniqueSupplyM = ParseM $ \us -> case splitUniqSupply us of (us1, us2) 
-> (us1, [], us2)
 
-runParseM' :: ParseM a -> ([(Var, S.Term)], a)
-runParseM' act = (floats, x)
-  where (_s, floats, x) = unParseM act anfUniqSupply'
+runParseM' :: UniqSupply -> ParseM a -> ([(Var, S.Term)], a)
+runParseM' us act = (floats, x)
+  where (_s, floats, x) = unParseM act us
 
-runParseM :: ParseM S.Term -> S.Term
-runParseM = uncurry (S.bindManyMixedLiftedness S.termFreeVars) . runParseM'
+runParseM :: UniqSupply -> ParseM S.Term -> S.Term
+runParseM us = uncurry (S.bindManyMixedLiftedness S.termFreeVars) . runParseM' 
us
 
 freshFloatId :: String -> S.Term -> ParseM (Maybe (Var, S.Term), Var)
 freshFloatId _ (I (S.Var x)) = return (Nothing, x)



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

Reply via email to