)
where
-import Cmm
+import BlockId
import CmmExpr
import CmmTx
import DFMonad
+import Monad
import PprCmm()
import PprCmmZ()
+import ZipCfg
import ZipDataflow
import ZipCfgCmmRep
-----------------------------------------------------------------------------
-- | 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.
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 (MidAddToContext ra args) = gen ra . gen args
+ middle (MidAddToContext ra args) = gen ra . gen args
middle (CopyIn _ formals _) = kill formals
middle (CopyOut _ actuals) = gen actuals