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

On branch  : 

http://hackage.haskell.org/trac/ghc/changeset/71462ae6b17b6fdd5ed87390894c0e5fb30c73a6

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

commit 71462ae6b17b6fdd5ed87390894c0e5fb30c73a6
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Fri Jul 1 13:32:55 2011 +0100

    Fix construction of the initial heap from the unfoldings: FVs of unfoldings 
were not bound

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

 .../supercompile/Supercompile/Drive/Process.hs     |   31 +++++++++++--------
 1 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/compiler/supercompile/Supercompile/Drive/Process.hs 
b/compiler/supercompile/Supercompile/Drive/Process.hs
index e56c40b..2ea0870 100644
--- a/compiler/supercompile/Supercompile/Drive/Process.hs
+++ b/compiler/supercompile/Supercompile/Drive/Process.hs
@@ -89,19 +89,24 @@ instance Monoid SCStats where
 
 
 supercompile :: M.Map Var Term -> Term -> (SCStats, Term)
-supercompile unfoldings e = pprTraceSC "all input FVs" (ppr input_fvs) $ 
second fVedTermToTerm $ runScpM $ liftM snd $ sc (mkHistory (cofmap fst wQO)) 
S.empty state
-  where anned_e = toAnnedTerm tag_ids e
-        input_fvs = annedTermFreeVars anned_e
-        state = normalise ((bLOAT_FACTOR - 1) * annedSize anned_e, Heap 
(M.fromDistinctAscList anned_h_kvs) (mkInScopeSet input_fvs), [], 
(mkIdentityRenaming input_fvs, anned_e))
-        
-        (tag_ids, anned_h_kvs) = mapAccumL add_one_heap_binding tagUniqSupply 
(varSetElems input_fvs)
-          where add_one_heap_binding tag_ids0 x' = (tag_ids2, (x', hb))
-                  where (hb, tag_ids2) = case M.lookup x' unfoldings of
-                                            Nothing | let (i, tag_ids1) = 
takeUniqFromSupply tag_ids0
-                                                    -> (environmentallyBound 
(mkTag (getKey i)), tag_ids1)
-                                            Just e  | let (tag_unf_ids, 
tag_ids1) = splitUniqSupply tag_ids0
-                                                          anned_e = 
toAnnedTerm tag_unf_ids e
-                                                    -> (letBound 
(mkIdentityRenaming (annedFreeVars anned_e), anned_e), tag_ids1)
+supercompile unfoldings e = pprTraceSC "unfoldings" (ppr (M.keys unfoldings)) $
+                            pprTraceSC "all input FVs" (ppr input_fvs) $
+                            second fVedTermToTerm $ runScpM $ liftM snd $ sc 
(mkHistory (cofmap fst wQO)) S.empty state
+  where (tag_ids0, tag_ids1) = splitUniqSupply tagUniqSupply
+        anned_e = toAnnedTerm tag_ids0 e
+        
+        ((input_fvs, tag_ids2), h_unfoldings) = mapAccumL add_one_unfolding 
(annedTermFreeVars anned_e, tag_ids1) (M.toList unfoldings)
+          where add_one_unfolding (input_fvs', tag_ids1) (x', e) = 
((input_fvs'', tag_ids2), (x', letBound (mkIdentityRenaming (annedFreeVars 
anned_e), anned_e)))
+                    where (tag_unf_ids, tag_ids2) = splitUniqSupply tag_ids1
+                          anned_e = toAnnedTerm tag_unf_ids e
+                          input_fvs'' = input_fvs' `unionVarSet` annedFreeVars 
anned_e
+        
+        (_, h_fvs) = mapAccumL add_one_fv tag_ids2 (varSetElems input_fvs)
+          where add_one_fv tag_ids2 x' = (tag_ids3, (x', environmentallyBound 
(mkTag (getKey i))))
+                    where (i, tag_ids3) = takeUniqFromSupply tag_ids2
+        
+        -- NB: h_fvs might contain bindings for things also in h_unfoldings, 
so union them in the right order
+        state = normalise ((bLOAT_FACTOR - 1) * annedSize anned_e, Heap 
(M.fromList h_unfoldings `M.union` M.fromList h_fvs) (mkInScopeSet input_fvs), 
[], (mkIdentityRenaming input_fvs, anned_e))
 
 --
 -- == Bounded multi-step reduction ==



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

Reply via email to