Merging in the new codegen branch
[ghc-hetmet.git] / compiler / cmm / CmmLiveZ.hs
index 9b2fa56..b239ae3 100644 (file)
@@ -7,12 +7,14 @@ module CmmLiveZ
     ) 
 where
 
-import Cmm
+import BlockId
 import CmmExpr
 import CmmTx
 import DFMonad
+import Monad
 import PprCmm()
 import PprCmmZ()
+import ZipCfg
 import ZipDataflow
 import ZipCfgCmmRep
 
@@ -39,14 +41,14 @@ type BlockEntryLiveness = BlockEnv CmmLive
 -----------------------------------------------------------------------------
 -- | Calculated liveness info for a CmmGraph
 -----------------------------------------------------------------------------
-cmmLivenessZ :: CmmGraph -> BlockEntryLiveness
-cmmLivenessZ g = env
-    where env = runDFA liveLattice $ do { run_b_anal transfer g; allFacts }
-          transfer     = BComp "liveness analysis" exit last middle first
-          exit         = emptyUniqSet
-          first live _ = live
-          middle       = flip middleLiveness
-          last         = flip lastLiveness
+cmmLivenessZ :: CmmGraph -> FuelMonad BlockEntryLiveness
+cmmLivenessZ g = liftM zdfFpFacts $ (res :: FuelMonad (CmmBackwardFixedPoint CmmLive))
+  where res = zdfSolveFrom emptyBlockEnv "liveness analysis" liveLattice transfers
+                           emptyUniqSet (graphOfLGraph g)
+        transfers = BackwardTransfers first middle last
+        first live _ = live
+        middle       = flip middleLiveness
+        last         = flip lastLiveness
 
 -- | The transfer equations use the traditional 'gen' and 'kill'
 -- notations, which should be familiar from the dragon book.
@@ -56,20 +58,18 @@ kill a live = foldRegsUsed delOneFromUniqSet live a
 
 middleLiveness :: Middle -> CmmLive -> CmmLive
 middleLiveness m = middle m
-  where middle (MidNop)                      = id
-        middle (MidComment {})               = id
+  where middle (MidComment {})               = id
         middle (MidAssign lhs expr)          = gen expr . kill lhs
         middle (MidStore addr rval)          = gen addr . gen rval
         middle (MidUnsafeCall tgt ress args) = gen tgt . gen args . kill ress
-        middle (CopyIn _ formals _)          = kill formals
-        middle (CopyOut _ actuals)           = gen actuals
+        middle (MidAddToContext ra args)     = gen ra . gen args
 
 lastLiveness :: Last -> (BlockId -> CmmLive) -> CmmLive
 lastLiveness l env = last l
-  where last (LastReturn)            = emptyUniqSet
-        last (LastJump e)            = gen e $ emptyUniqSet
-        last (LastBranch id)         = env id
-        last (LastCall tgt (Just k)) = gen tgt $ env k
-        last (LastCall tgt Nothing)  = gen tgt $ emptyUniqSet
-        last (LastCondBranch e t f)  = gen e $ unionUniqSets (env t) (env f)
+  where last (LastReturn _)            = emptyUniqSet
+        last (LastJump e _)            = gen e $ emptyUniqSet
+        last (LastBranch id)           = env id
+        last (LastCall tgt (Just k) _) = gen tgt $ env k
+        last (LastCall tgt Nothing _)  = gen tgt $ emptyUniqSet
+        last (LastCondBranch e t f)    = gen e $ unionUniqSets (env t) (env f)
         last (LastSwitch e tbl) = gen e $ unionManyUniqSets $ map env (catMaybes tbl)