Now that we have some LLVM IR generated, we can run PassManager on our
module to get a bunch of neat optimisations on it. Try it out with 3 + 2
to see some constant folding.
Note that the original tutorial uses FunctionPassManager which optimises
on a function per function basis: llvm-hs doesn't expose this yet (and
this is all using the legacy pass manager anyway), so for now we just
optimise the entire module at the end.
import LLVM.AST.FloatingPointPredicate hiding (False, True)
import LLVM.AST.Operand
import LLVM.AST.Type as Type
+import LLVM.Context
import LLVM.IRBuilder
+import LLVM.Module
+import LLVM.PassManager
import LLVM.Pretty
+import LLVM.Target
import System.IO
import System.IO.Error
import Text.Read (readMaybe)
main :: IO ()
-main = buildModuleT "main" repl >>= Text.hPutStrLn stderr . ("\n" <>) . ppll
+main = do
+ mdl' <- buildModuleT "main" repl
+ withContext $ \ctx -> withHostTargetMachine $ \tm ->
+ withModuleFromAST ctx mdl' $ \mdl -> do
+ let spec = defaultCuratedPassSetSpec { optLevel = Just 3 }
+ -- this returns true if the module was modified
+ withPassManager spec $ flip runPassManager mdl
+ Text.hPutStrLn stderr . ("\n" <>) . ppllvm =<< moduleAST mdl
repl :: ModuleBuilderT IO ()
repl = do