packages feed

hLLVM-0.5.0.0: src/Llvm/Pass/NormalGraph.hs

module Llvm.Pass.NormalGraph where
import Compiler.Hoopl (Graph,C,analyzeAndRewriteFwd,MaybeC(..),mapInsert,mapEmpty,LabelMap,CheckpointMonad, FuelMonad) 
import Llvm.Data.Ir
import Llvm.Pass.PhiFixUp
import Llvm.Pass.Dominator

idom :: (CheckpointMonad m, FuelMonad m) => Label -> Graph (Node a) C C -> m (LabelMap Label)
idom entry g = do { (_,fact,_) <- analyzeAndRewriteFwd domPass (JustC [entry]) g
                                   (mapInsert entry domEntry mapEmpty)
                  ; return $ immediateDominators fact
                  }

fixUpPhi :: (CheckpointMonad m, FuelMonad m) => () -> Label -> Graph (Node a) C C -> m (Graph (Node a) C C)
fixUpPhi _ entry g = do { labelMap <- idom entry g
                        ; g' <- phiFixUp labelMap entry g
                        ; return g'
                        }