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

On branch  : 

http://hackage.haskell.org/trac/ghc/changeset/595e6721f0e333c6bb9de1bf0f32082df9cbe9ed

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

commit 595e6721f0e333c6bb9de1bf0f32082df9cbe9ed
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Wed Feb 8 17:04:16 2012 +0000

    Use Train data type for promises tree instead (more precise), allow 
ancestor instance match

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

 .../supercompile/Supercompile/Drive/Process3.hs    |   36 +++++++++++---------
 compiler/supercompile/Supercompile/Utilities.hs    |    7 ++++
 2 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/compiler/supercompile/Supercompile/Drive/Process3.hs 
b/compiler/supercompile/Supercompile/Drive/Process3.hs
index 19f5270..df9a5ef 100644
--- a/compiler/supercompile/Supercompile/Drive/Process3.hs
+++ b/compiler/supercompile/Supercompile/Drive/Process3.hs
@@ -63,19 +63,21 @@ data Promise = P {
   }
 
 
-appendHead :: [b] -> [(a, [b])] -> [(a, [b])]
-appendHead ys1 ((x, ys2):zs) = (x, ys1 ++ ys2):zs
-appendHead _   []            = error "Used promises after last fulfilment"
+appendHead :: [b] -> Train (a, [b]) [b] -> Train (a, [b]) [b]
+appendHead ys1 (Car (x, ys2) zs) = (x, ys1 ++ ys2) `Car` zs
+appendHead ys1 (Loco ys2)        = Loco (ys1 ++ ys2)
 
-leftExtension :: [a] -- ^ Longer list
-              -> [a] -- ^ Shorter list
-              -> ([a], [a]) -- Pair of the prefix present in the longer list 
and the common suffix (== shorter list)
-leftExtension xs ys = (reverse prefix_rev, suffix_rev)
-  where (prefix_rev, suffix_rev) = splitBy ys (reverse xs) -- NB: we actually 
assume ys == suffix_rev
+leftExtension :: Train a b -- ^ Longer list
+              -> Train a b -- ^ Shorter list
+              -> ([a], Train a b) -- Pair of the prefix present in the longer 
list and the common suffix (== shorter list)
+leftExtension xs_train ys_train = (reverse prefix_rev, ys_train)
+  where (xs, _xs_loco) = trainToList xs_train
+        (ys, _ys_loco) = trainToList ys_train
+        (prefix_rev, _suffix_rev) = splitBy ys (reverse xs) -- NB: we actually 
assume ys == suffix_rev
 
 
 data MemoState = MS {
-    promises :: [(Maybe Promise, [Promise])], -- (parent, siblings) pairs, 
with those closest to current level first
+    promises :: Train (Promise, [Promise]) [Promise], -- (parent, siblings) 
pairs, with those closest to current level first
     hNames   :: Stream Name
   }
 
@@ -99,7 +101,7 @@ promise ms (state, reduced_state) = (ms', p)
             dumped     = False
           }
         ms' = MS {
-            promises = (Just p, []) : promises ms, -- Establishes a new level 
in the process tree
+            promises = (p, []) `Car` promises ms, -- Establishes a new level 
in the process tree
             hNames   = h_names'
           }
 
@@ -113,7 +115,7 @@ fulfill (deeds, e_body) fs ms
   = ((deeds, fun p `applyAbsVars` abstracted p),
      FS { fulfilments = (fun p, absVarLambdas (abstracted p) e_body) : 
fulfilments fs },
      ms { promises = appendHead (p:children) promises' })
-  where (Just p, children):promises' = promises ms
+  where (p, children) `Car` promises' = promises ms
 
 
 type StopCount = Int
@@ -151,7 +153,7 @@ runScpM tag_anns me = fvedTermSize e' `seq` trace ("Deepest 
path:\n" ++ showSDoc
                                                    "\nDepth histogram:\n" ++ 
showSDoc (depthHistogram (scpParentChildren s'))) e'
   where h_names = listToStream $ zipWith (\i uniq -> mkSystemVarName uniq 
(mkFastString ('h' : show (i :: Int))))
                                          [1..] (uniqsFromSupply 
hFunctionsUniqSupply)
-        ms = MS { promises = [(Nothing, [])], hNames = h_names }
+        ms = MS { promises = Loco [], hNames = h_names }
         hist = pROCESS_HISTORY
         fs = FS { fulfilments = [] }
         parent = generatedKey hist
@@ -187,7 +189,7 @@ rolledBackTo s' s = ScpState {
   where
     -- We have to roll back any promise on the "stack" above us:
     (dangerous_promises, ok_promises) = (leftExtension `on` (promises . 
scpMemoState)) s' s
-    (spine_rolled_back, possibly_rolled_back) = (catMaybes *** concat) $ unzip 
dangerous_promises
+    (spine_rolled_back, possibly_rolled_back) = (second concat) $ unzip 
dangerous_promises
     -- NB: rolled_back includes names of both unfulfilled promises rolled back 
from the stack and fulfilled promises that have to be dumped as a result
     (rolled_fulfilments, rolled_back) = pruneFulfilments (scpFulfilmentState 
s') (mkVarSet (map fun spine_rolled_back))
 
@@ -331,14 +333,16 @@ memo opt = memo_opt
         --  2. Suprisingly, terms that match *before* reduction may not match 
*after* reduction! This occurs because
         --     two terms with different distributions of tag may match, but 
may roll back in different ways in reduce.
         case [ (p, instanceSplit (remaining_deeds, heap_inst, k_inst, fun p 
`applyAbsVars` map (renameAbsVar rn_lr) (abstracted p)) memo_opt)
-             | (mb_p_parent, p_siblings) <- promises (scpMemoState s)
-             , p <- maybe id (:) mb_p_parent p_siblings
+             | let (parented_ps, unparented_ps) = trainToList (promises 
(scpMemoState s))
+             , (mb_p_parent, p) <- [(Just p_parent, p_sibling) | (p_parent, 
p_siblings) <- parented_ps, p_sibling <- p_parent:p_siblings] ++
+                                   [(Nothing,       p_root)    | p_root <- 
unparented_ps]
              , Just (heap_inst@(Heap h_inst _), k_inst, rn_lr) <- [-- (\res -> 
if isNothing res then pprTraceSC "no match:" (ppr (fun p)) res   else   
pprTraceSC "match!" (ppr (fun p)) res) $
                                                                    match' 
(meaning p) reduced_state]
              , let instance_match = not (M.null h_inst && null k_inst)
                    -- This will always succeed because the state had deeds for 
everything in its heap/stack anyway:
                    Just remaining_deeds = claimDeeds (releaseStateDeed state) 
(heapSize heap_inst + stackSize k_inst)
-             , not instance_match -- FIXME: less restrictive instance matches
+               -- Alow instance matching against direct ancestors only, NOT 
their children
+             , not instance_match || fmap fun mb_p_parent == Just (fun p)
                -- FIXME: prefer "more exact" matches
              , if dumped p
                 then pprTraceSC "tieback-to-dumped" (ppr (fun p)) False
diff --git a/compiler/supercompile/Supercompile/Utilities.hs 
b/compiler/supercompile/Supercompile/Utilities.hs
index 9939612..c447515 100644
--- a/compiler/supercompile/Supercompile/Utilities.hs
+++ b/compiler/supercompile/Supercompile/Utilities.hs
@@ -619,6 +619,13 @@ supercompileUniqSupply = unsafePerformIO $ 
mkSplitUniqSupply 'p'
 
(hFunctionsUniqSupply:anfUniqSupply:expandUniqSupply:reduceUniqSupply:tagUniqSupply:prettyUniqSupply:matchUniqSupply:splitterUniqSupply:_)
 = listSplitUniqSupply supercompileUniqSupply
 
 
+data Train a b = Car a (Train a b) | Loco b
+
+trainToList :: Train a b -> ([a], b)
+trainToList (Car a abs) = first (a:) (trainToList abs)
+trainToList (Loco b)    = ([], b)
+
+
 data Stream a = a :< Stream a
 
 listToStream :: [a] -> Stream a



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

Reply via email to