module DFMonad
( OptimizationFuel
, DFTx, runDFTx, lastTxPass, txDecrement, txRemaining, txExhausted
+ , functionalDFTx
, DataflowLattice(..)
, DataflowAnalysis
import PprCmm()
import UniqFM
import UniqSupply
-import ZipCfg hiding (freshBlockId)
+import ZipCfg
import qualified ZipCfg as G
import Outputable
-- XXX DFTx really needs to be in IO, so we can dump programs in
-- intermediate states of optimization ---NR
+functionalDFTx :: String -> (OptimizationFuel -> (a, OptimizationFuel)) -> DFTx a
+functionalDFTx name pass = DFTx f
+ where f s = let (a, fuel) = pass (df_txlimit s)
+ in (a, DFTxState fuel name)
+
runDFTx :: OptimizationFuel -> DFTx a -> a --- should only be called once per program!
runDFTx lim (DFTx f) = fst $ f $ DFTxState lim "<none>"
where f _ s = ((), s {df_rewritten = SomeChange})
freshBlockId :: String -> DFM f BlockId
-freshBlockId s = liftUSM $ G.freshBlockId s
+freshBlockId _s = liftUSM $ getUniqueUs >>= return . BlockId
liftUSM :: UniqSM a -> DFM f a
liftUSM uc = DFM f