I figure this might be slightly controversial, so I'd like to run it by you guys. Suggestions for: type renamings, constructor renamings, etc? We need a polymorphic CmmGraph to deal with decorated nodes, as discussed with Hoopl.
Edward Excerpts from Edward Z. Yang's message of Wed Apr 13 06:23:32 -0400 2011: > Signed-off-by: Edward Z. Yang <[email protected]> > --- > compiler/cmm/Cmm.hs | 21 +++++++++++++-------- > 1 files changed, 13 insertions(+), 8 deletions(-) > > diff --git a/compiler/cmm/Cmm.hs b/compiler/cmm/Cmm.hs > index 2e9f952..0749ca1 100644 > --- a/compiler/cmm/Cmm.hs > +++ b/compiler/cmm/Cmm.hs > @@ -9,10 +9,11 @@ > #endif > > module Cmm > - ( CmmGraph(..), CmmBlock > + ( CmmGraph, CmmGraphPoly(..), CmmBlock > , CmmStackInfo(..), CmmTopInfo(..), Cmm, CmmTop > , CmmReplGraph, CmmFwdRewrite, CmmBwdRewrite > > + , modifyGraph > , lastNode, replaceLastNode, insertBetween > , ofBlockMap, toBlockMap, insertBlock > , ofBlockList, toBlockList, bodyToBlockList > @@ -41,7 +42,8 @@ import Panic > ------------------------------------------------- > -- CmmBlock, CmmGraph and Cmm > > -data CmmGraph = CmmGraph { g_entry :: BlockId, g_graph :: Graph CmmNode C C } > +type CmmGraph = CmmGraphPoly CmmNode > +data CmmGraphPoly n = CmmGraph { g_entry :: BlockId, g_graph :: Graph n C C } > type CmmBlock = Block CmmNode C C > > type CmmReplGraph e x = FuelUniqSM (Maybe (Graph CmmNode e x)) > @@ -56,6 +58,9 @@ type CmmTop = GenCmmTop CmmStatic CmmTopInfo CmmGraph > ------------------------------------------------- > -- Manipulating CmmGraphs > > +modifyGraph :: (Graph n C C -> Graph n' C C) -> CmmGraphPoly n -> > CmmGraphPoly n' > +modifyGraph f g = CmmGraph {g_entry=g_entry g, g_graph=f (g_graph g)} > + > toBlockMap :: CmmGraph -> LabelMap CmmBlock > toBlockMap (CmmGraph {g_graph=GMany NothingO body NothingO}) = body > > @@ -150,26 +155,26 @@ insertBetween b ms succId = insert $ lastNode b > -- Running dataflow analysis and/or rewrites > > -- Constructing forward and backward analysis-only pass > -analFwd :: Monad m => DataflowLattice f -> FwdTransfer CmmNode f -> > FwdPass m CmmNode f > -analBwd :: Monad m => DataflowLattice f -> BwdTransfer CmmNode f -> > BwdPass m CmmNode f > +analFwd :: Monad m => DataflowLattice f -> FwdTransfer n f -> FwdPass m n > f > +analBwd :: Monad m => DataflowLattice f -> BwdTransfer n f -> BwdPass m n > f > > analFwd lat xfer = analRewFwd lat xfer noFwdRewrite > analBwd lat xfer = analRewBwd lat xfer noBwdRewrite > > -- Constructing forward and backward analysis + rewrite pass > -analRewFwd :: Monad m => DataflowLattice f -> FwdTransfer CmmNode f -> > FwdRewrite m CmmNode f -> FwdPass m CmmNode f > -analRewBwd :: Monad m => DataflowLattice f -> BwdTransfer CmmNode f -> > BwdRewrite m CmmNode f -> BwdPass m CmmNode f > +analRewFwd :: Monad m => DataflowLattice f -> FwdTransfer n f -> FwdRewrite > m n f -> FwdPass m n f > +analRewBwd :: Monad m => DataflowLattice f -> BwdTransfer n f -> BwdRewrite > m n f -> BwdPass m n f > > analRewFwd lat xfer rew = FwdPass {fp_lattice = lat, fp_transfer = xfer, > fp_rewrite = rew} > analRewBwd lat xfer rew = BwdPass {bp_lattice = lat, bp_transfer = xfer, > bp_rewrite = rew} > > -- Running forward and backward dataflow analysis + optional rewrite > -dataflowPassFwd :: CmmGraph -> [(BlockId, f)] -> FwdPass FuelUniqSM CmmNode > f -> FuelUniqSM (CmmGraph, BlockEnv f) > +dataflowPassFwd :: NonLocal n => CmmGraphPoly n -> [(BlockId, f)] -> FwdPass > FuelUniqSM n f -> FuelUniqSM (CmmGraphPoly n, BlockEnv f) > dataflowPassFwd (CmmGraph {g_entry=entry, g_graph=graph}) facts fwd = do > (graph, facts, NothingO) <- analyzeAndRewriteFwd fwd (JustC [entry]) graph > (mkFactBase (fp_lattice fwd) facts) > return (CmmGraph {g_entry=entry, g_graph=graph}, facts) > > -dataflowPassBwd :: CmmGraph -> [(BlockId, f)] -> BwdPass FuelUniqSM CmmNode > f -> FuelUniqSM (CmmGraph, BlockEnv f) > +dataflowPassBwd :: NonLocal n => CmmGraphPoly n -> [(BlockId, f)] -> BwdPass > FuelUniqSM n f -> FuelUniqSM (CmmGraphPoly n, BlockEnv f) > dataflowPassBwd (CmmGraph {g_entry=entry, g_graph=graph}) facts bwd = do > (graph, facts, NothingO) <- analyzeAndRewriteBwd bwd (JustC [entry]) graph > (mkFactBase (bp_lattice bwd) facts) > return (CmmGraph {g_entry=entry, g_graph=graph}, facts) _______________________________________________ Cvs-ghc mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-ghc
