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

On branch  : 

http://hackage.haskell.org/trac/ghc/changeset/4f815ddfe6338c17225ba967e01aac1039619293

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

commit 4f815ddfe6338c17225ba967e01aac1039619293
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Tue Jan 3 14:23:30 2012 +0000

    Changes with Simon

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

 compiler/supercompile/Supercompile/Core/Tag.hs     |    4 +-
 .../supercompile/Supercompile/Drive/Process3.hs    |   22 +++++++++++--------
 2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/compiler/supercompile/Supercompile/Core/Tag.hs 
b/compiler/supercompile/Supercompile/Core/Tag.hs
index 82951b9..8dfcaad 100644
--- a/compiler/supercompile/Supercompile/Core/Tag.hs
+++ b/compiler/supercompile/Supercompile/Core/Tag.hs
@@ -9,6 +9,7 @@ import Supercompile.Core.Size
 import Supercompile.Core.Syntax
 
 import qualified DataCon
+import Unique (Uniquable(getUnique))
 import Literal (hashLiteral)
 import Var (varUnique)
 
@@ -26,8 +27,7 @@ tagFVedTerm = mkTagger (\tg e -> Comp (Tagged tg e))
 -- are specialised on very long repititions of the same constructor.
 
 dataConTag :: DataCon -> Tag
---dataConTag dc = mkTag (negate (DataCon.dataConTag dc)) -- Works well because 
(hashLiteral l) is always positive
-dataConTag = mkTag . getKey . varUnique . DataCon.dataConWorkId -- This is 
much better because otherwise [], True and all dictionary all get the same tag!!
+dataConTag dc = mkTag (negate (abs (getKey (getUnique dc)))) -- Works well 
because (hashLiteral l) is always positive. Don't use dataConTag because tags 
are shared between DC families
 
 literalTag :: Literal -> Tag
 literalTag = mkTag . hashLiteral
diff --git a/compiler/supercompile/Supercompile/Drive/Process3.hs 
b/compiler/supercompile/Supercompile/Drive/Process3.hs
index 3caef19..0425c17 100644
--- a/compiler/supercompile/Supercompile/Drive/Process3.hs
+++ b/compiler/supercompile/Supercompile/Drive/Process3.hs
@@ -96,7 +96,6 @@ fulfill :: Promise -> (Deeds, FVedTerm) -> FulfilmentState -> 
((Deeds, FVedTerm)
 fulfill p (deeds, e_body) fs = ((deeds, fun p `applyAbsVars` abstracted p), FS 
{ fulfilments = (fun p, absVarLambdas (abstracted p) e_body) : fulfilments fs })
 
 
-type Depth = Int
 type StopCount = Int
 
 data ScpState = ScpState {
@@ -107,9 +106,9 @@ data ScpState = ScpState {
   }
 
 data ScpEnv = ScpEnv {
-    scpDepth :: Depth,
     scpStopCount :: StopCount,
     scpNodeKey :: NodeKey,
+    scpParents :: [Var],
     scpAlreadySpeculated :: AlreadySpeculated,
     scpTagAnnotations :: TagAnnotations
   }
@@ -130,22 +129,27 @@ runScpM tag_anns me = letRec (fulfilments fs') e
         hist = pROCESS_HISTORY
         fs = FS { fulfilments = [] }
         parent = generatedKey hist
-        (e, ScpState _ms' _hist' fs' _resid_tags) = unI $ unReaderT (unStateT 
(unScpM me) (ScpState ms hist fs emptyResidTags)) (ScpEnv 0 0 parent 
nothingSpeculated tag_anns)
+        (e, ScpState _ms' _hist' fs' _resid_tags) = unI $ unReaderT (unStateT 
(unScpM me) (ScpState ms hist fs emptyResidTags)) (ScpEnv 0 parent [] 
nothingSpeculated tag_anns)
 
 
+scpDepth = length . scpParents
+
 traceRenderM :: Outputable a => String -> a -> ScpM ()
 traceRenderM msg x = ScpM $ StateT $ \s -> ReaderT $ \env -> pprTraceSC 
(replicate (scpDepth env) ' ' ++ msg) (pPrint x) $ pure ((), s) -- TODO: 
include depth, refine to ScpM monad only
 
+addParentM :: Promise -> ScpM a -> ScpM a
+addParentM p mx = ScpM $ StateT $ \s -> ReaderT $ \env ->  trace ("depth: " ++ 
show (scpDepth env) ++ ' ' : showSDoc (parens (hsep (map ppr (scpParents 
env))))) $ unReaderT (unStateT (unScpM mx) s) (env { scpParents = fun p : 
scpParents env })
+
 fulfillM :: Promise -> (Deeds, FVedTerm) -> ScpM (Deeds, FVedTerm)
 fulfillM p res = ScpM $ StateT $ \s -> case fulfill p res (scpFulfilmentState 
s) of (res', fs') -> return (res', s { scpFulfilmentState = fs' })
 
 terminateM :: String -> State -> ScpM a -> (String -> State -> ScpM a) -> ScpM 
a
-terminateM h state mcont mstop = ScpM $ StateT $ \s -> ReaderT $ \env -> trace 
("depth: " ++ show (scpDepth env)) $ case terminate (scpProcessHistory s) 
(scpNodeKey env, (h, state)) of
+terminateM h state mcont mstop = ScpM $ StateT $ \s -> ReaderT $ \env -> case 
terminate (scpProcessHistory s) (scpNodeKey env, (h, state)) of
         Stop (_, (shallow_h, shallow_state))
           -> trace ("stops: " ++ show (scpStopCount env)) $
-             unReaderT (unStateT (unScpM (mstop shallow_h shallow_state)) s)   
                              (env { scpDepth = scpDepth env + 1, scpStopCount 
= scpStopCount env + 1}) -- FIXME: prevent rollback?
+             unReaderT (unStateT (unScpM (mstop shallow_h shallow_state)) s)   
                              (env { scpStopCount = scpStopCount env + 1}) -- 
FIXME: prevent rollback?
         Continue hist'
-          -> unReaderT (unStateT (unScpM mcont)                           (s { 
scpProcessHistory = hist' })) (env { scpDepth = scpDepth env + 1, scpNodeKey = 
generatedKey hist' })
+          -> unReaderT (unStateT (unScpM mcont)                           (s { 
scpProcessHistory = hist' })) (env { scpNodeKey = generatedKey hist' })
   -- TODO: record the names of the h-functions on the way to the current one 
instead of a Int depth
 
 speculateM :: State -> (State -> ScpM a) -> ScpM a
@@ -246,9 +250,9 @@ memo opt state
                           match (meaning p) reduced_state]
          ] of (p, res):_ -> pure (do { traceRenderM "=sc" (fun p, PrettyDoc 
(pPrintFullState quietStatePrettiness state), res)
                                      ; return res }, ScpState ms hist fs 
resid_tags)
-              _          -> pure (do { traceRenderM ">sc" (fun p, stateTags 
state, PrettyDoc (pPrintFullState quietStatePrettiness state))
-                                     ; res <- opt (Just (getOccString (varName 
(fun p)))) state
-                                     ; traceRenderM "<sc" (fun p, PrettyDoc 
(pPrintFullState quietStatePrettiness state), res)
+              _          -> pure (do { traceRenderM ">sc {" (fun p, stateTags 
state, PrettyDoc (pPrintFullState quietStatePrettiness state))
+                                     ; res <- addParentM p $ opt (Just 
(getOccString (varName (fun p)))) state
+                                     ; traceRenderM "<sc }" (fun p, PrettyDoc 
(pPrintFullState quietStatePrettiness state), res)
                                      ; fulfillM p res }, ScpState ms' hist fs 
resid_tags)
                 where (p, ms') = promise (state, reduced_state) ms
   where reduced_state = reduceForMatch state



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

Reply via email to