Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch : supercompiler
http://hackage.haskell.org/trac/ghc/changeset/d5374d36395ef384ba8d227e083f78d671dc4878 >--------------------------------------------------------------- commit d5374d36395ef384ba8d227e083f78d671dc4878 Author: Max Bolingbroke <batterseapo...@hotmail.com> Date: Tue Jan 17 14:31:47 2012 +0000 Record generalisation info in children tree >--------------------------------------------------------------- .../supercompile/Supercompile/Drive/Process.hs | 14 +++++++------- .../supercompile/Supercompile/Drive/Process3.hs | 17 ++++++++--------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/compiler/supercompile/Supercompile/Drive/Process.hs b/compiler/supercompile/Supercompile/Drive/Process.hs index b72875f..c53acf8 100644 --- a/compiler/supercompile/Supercompile/Drive/Process.hs +++ b/compiler/supercompile/Supercompile/Drive/Process.hs @@ -95,13 +95,13 @@ mK_GENERALISER :: State -> State -> Generaliser -- | otherwise = wqo1 -type ParentChildren = M.Map (Maybe Var) [(Var, State)] +type ParentChildren = M.Map (Maybe Var) [(Var, (State, Bool))] emptyParentChildren :: ParentChildren emptyParentChildren = M.empty -addChild :: Maybe Var -> Var -> State -> ParentChildren -> ParentChildren -addChild mb_parent child child_state = M.alter (\mb_children -> Just ((child, child_state) : (mb_children `orElse` []))) mb_parent +addChild :: Maybe Var -> Var -> State -> Bool -> ParentChildren -> ParentChildren +addChild mb_parent child child_state gen = M.alter (\mb_children -> Just ((child, (child_state, gen)) : (mb_children `orElse` []))) mb_parent childrenSummary :: ParentChildren -> String childrenSummary parent_children = unlines [maybe "<root>" varString mb_parent ++ ": " ++ intercalate " " (map show child_counts) | (mb_parent, child_counts :: [Int]) <- ordered_counts] @@ -111,7 +111,7 @@ childrenSummary parent_children = unlines [maybe "<root>" varString mb_parent ++ -- NB: there may be many deepest paths, but this function only returns one of them deepestPath :: [(Var, FVedTerm)] -> ParentChildren -> SDoc deepestPath fulfils parent_children = maybe empty (\(_, states) -> show_meaning_chain M.empty states $$ show_fulfils_chain (map fst states)) (M.lookup Nothing deepest) - where deepest :: M.Map (Maybe Var) (Int, [(Var, State)]) + where deepest :: M.Map (Maybe Var) (Int, [(Var, (State, Bool))]) deepest = flip M.map parent_children $ \children -> maximumBy (comparing fst) [(depth + 1, (fun, state):states) | (fun, state) <- children, let (depth, states) = M.findWithDefault (0, []) (Just fun) deepest] fulfils_map :: M.Map Var FVedTerm @@ -120,10 +120,10 @@ deepestPath fulfils parent_children = maybe empty (\(_, states) -> show_meaning_ show_fulfils_chain :: [Var] -> SDoc show_fulfils_chain = flip (pPrintPrecLetRec noPrec) (PrettyDoc (text "...")) . mapMaybe (\x -> fmap ((,) x) $ M.lookup x fulfils_map) - show_meaning_chain :: M.Map Var Bool -> [(Var, State)] -> SDoc + show_meaning_chain :: M.Map Var Bool -> [(Var, (State, Bool))] -> SDoc show_meaning_chain _ [] = empty - show_meaning_chain known_bvs ((fun, state@(_, Heap h _, _, _)):states) - = hang (ppr fun) 2 (pPrintFullState (quietStatePrettiness { excludeBindings = unchanged_bvs }) state) $$ + show_meaning_chain known_bvs ((fun, (state@(_, Heap h _, _, _), gen)):states) + = hang (ppr fun <+> (if gen then text "(GENERALISED)" else empty)) 2 (pPrintFullState (quietStatePrettiness { excludeBindings = unchanged_bvs }) state) $$ show_meaning_chain known_bvs' states where known_bvs' = M.map (maybe False (termIsValue . snd) . heapBindingTerm) h unchanged_bvs = M.keysSet (M.filter id (M.intersectionWith (==) known_bvs known_bvs')) diff --git a/compiler/supercompile/Supercompile/Drive/Process3.hs b/compiler/supercompile/Supercompile/Drive/Process3.hs index b96eb30..1960b45 100644 --- a/compiler/supercompile/Supercompile/Drive/Process3.hs +++ b/compiler/supercompile/Supercompile/Drive/Process3.hs @@ -143,7 +143,7 @@ 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 -> (State -> ScpM (Deeds, FVedTerm)) -> State -> ScpM (Deeds, FVedTerm) +addParentM :: Promise -> (State -> ScpM (Bool, (Deeds, FVedTerm))) -> State -> ScpM (Deeds, FVedTerm) addParentM p opt state = ScpM $ StateT $ \s -> ReaderT $ add_parent s where add_parent s env @@ -152,9 +152,8 @@ addParentM p opt state = ScpM $ StateT $ \s -> ReaderT $ add_parent s = return ((deeds, e), s) | otherwise = trace ("depth: " ++ show (scpDepth env) ++ ' ' : showSDoc (parens (hsep (map ppr (scpParents env))))) $ - unReaderT (unStateT (unScpM (opt state)) - (s { scpParentChildren = addChild (safeHead (scpParents env)) (fun p) (meaning p) (scpParentChildren s) })) - (env { scpParents = fun p : scpParents env }) + unReaderT (unStateT (unScpM (opt state)) s) + (env { scpParents = fun p : scpParents env }) >>= \((gen, res), s') -> return (res, s' { scpParentChildren = addChild (safeHead (scpParents env)) (fun p) (meaning p) gen (scpParentChildren s') }) 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' }) @@ -175,7 +174,7 @@ speculateM state mcont = ScpM $ StateT $ \s -> ReaderT $ \env -> case speculate sc :: State -> ScpM (Deeds, FVedTerm) sc = memo sc' . gc -- Garbage collection necessary because normalisation might have made some stuff dead -sc' :: Maybe String -> State -> ScpM (Deeds, FVedTerm) +sc' :: Maybe String -> State -> ScpM (Bool, (Deeds, FVedTerm)) sc' mb_h state = case mb_h of Nothing -> speculateM (reduce state) $ \state -> my_split state sc Just h -> terminateM h state (speculateM (reduce state) $ \state -> my_split state sc) @@ -191,8 +190,8 @@ sc' mb_h state = case mb_h of (case unMatch (match' (reduceForMatch shallow_state) (reduceForMatch state)) of Left why -> text why)) trce1 state = pPrintFullState quietStatePrettiness state $$ pPrintFullState quietStatePrettiness (reduceForMatch state) - my_generalise gen = liftM (\splt -> insert_tags . splt) . generalise gen - my_split opt = insert_tags . split opt + my_generalise gen = liftM (\splt -> liftM ((,) True) . insert_tags . splt) . generalise gen + my_split opt = liftM ((,) False) . insert_tags . split opt --insert_tags = liftM (\(_, deeds, e') -> (deeds, e')) insert_tags mx = do (resid_tags, deeds, e') <- mx @@ -228,10 +227,10 @@ sc' mb_h state = case mb_h of -- So we should probably work out why the existing supercompiler never builds dumb loops like this, so -- we can carefully preserve that property when making the Arjan modification. -memo :: (Maybe String -> State -> ScpM (Deeds, FVedTerm)) +memo :: (Maybe String -> State -> ScpM (Bool, (Deeds, FVedTerm))) -> State -> ScpM (Deeds, FVedTerm) memo opt state - | skip_tieback = opt Nothing state + | skip_tieback = liftM snd $ opt Nothing state | otherwise = join $ ScpM $ StateT $ \(ScpState ms hist fs resid_tags parent_children) -> -- NB: If tb contains a dead PureHeap binding (hopefully impossible) then it may have a free variable that -- I can't rename, so "rename" will cause an error. Not observed in practice yet. _______________________________________________ Cvs-ghc mailing list Cvs-ghc@haskell.org http://www.haskell.org/mailman/listinfo/cvs-ghc