hLLVM-0.5.0.0: src/Llvm/Pass/Optimizer.hs
module Llvm.Pass.Optimizer where
import Llvm.Data.Ir
import qualified Compiler.Hoopl as H
import qualified Data.Set as Ds
type Optimization m a u = a -> H.Label -> H.Graph (Node u) H.C H.C -> m (H.Graph (Node u) H.C H.C)
opt :: (H.CheckpointMonad m, H.FuelMonad m) => a -> Optimization m a u -> (Toplevel u) -> m (Toplevel u)
opt _ _ (ToplevelTriple s) = return $ ToplevelTriple s
opt _ _ (ToplevelDataLayout s) = return $ ToplevelDataLayout s
opt _ _ (ToplevelAlias s) = return $ ToplevelAlias s
opt _ _ (ToplevelDbgInit s) = return $ ToplevelDbgInit s
opt _ _ (ToplevelStandaloneMd s) = return $ ToplevelStandaloneMd s
opt _ _ (ToplevelNamedMd v) = return $ ToplevelNamedMd v
opt _ _ (ToplevelDeclare fn) = return $ ToplevelDeclare fn
opt gs f (ToplevelDefine (TlDefine fn entry graph)) = do { graph' <- f gs entry graph
; return $ ToplevelDefine $ TlDefine fn entry graph'
}
opt _ _ (ToplevelGlobal s) = return $ ToplevelGlobal s
opt _ _ (ToplevelTypeDef a) = return $ ToplevelTypeDef a
opt _ _ (ToplevelDepLibs qs) = return $ ToplevelDepLibs qs
opt _ _ (ToplevelUnamedType i) = return $ ToplevelUnamedType i
opt _ _ (ToplevelModuleAsm s) = return $ ToplevelModuleAsm s
opt _ _ (ToplevelComdat s) = return $ ToplevelComdat s
opt _ _ (ToplevelAttribute s) = return $ ToplevelAttribute s
optModule :: (H.CheckpointMonad m, H.FuelMonad m) => Optimization m (Ds.Set (Dtype, GlobalId)) u -> Module u -> m (Module u)
optModule f (Module l) =
let gs = globalIdOfModule (Module l)
in mapM (opt gs f) l >>= return . Module
optModule1 :: (H.CheckpointMonad m, H.FuelMonad m) => a -> Optimization m a u -> Module u -> m (Module u)
optModule1 a f (Module l) =
mapM (opt a f) l >>= return . Module