From b0cad668398c0102b726336871bac28ddfac347c Mon Sep 17 00:00:00 2001 From: Johannes Stoelp Date: Thu, 16 Sep 2021 21:13:16 +0200 Subject: ch4: add function optimization passes --- src/codegen.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/codegen.rs') diff --git a/src/codegen.rs b/src/codegen.rs index 866aab7..0a7893e 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -use crate::llvm::{Builder, FnValue, Module, Value}; +use crate::llvm::{Builder, FnValue, FunctionPassManager, Module, Value}; use crate::parser::{ExprAST, FunctionAST, PrototypeAST}; use crate::Either; @@ -10,6 +10,7 @@ type CodegenResult = Result; pub struct Codegen<'llvm, 'a> { module: &'llvm Module, builder: &'a Builder<'llvm>, + fpm: &'a FunctionPassManager<'llvm>, } impl<'llvm, 'a> Codegen<'llvm, 'a> { @@ -21,6 +22,7 @@ impl<'llvm, 'a> Codegen<'llvm, 'a> { let cg = Codegen { module, builder: &Builder::with_ctx(module), + fpm: &FunctionPassManager::with_ctx(module), }; let mut variables = HashMap::new(); @@ -127,6 +129,7 @@ impl<'llvm, 'a> Codegen<'llvm, 'a> { if let Ok(ret) = self.codegen_expr(body, named_values) { self.builder.ret(ret); assert!(the_function.verify()); + self.fpm.run(the_function); Ok(the_function) } else { todo!("Failed to codegen function body, erase from module!"); -- cgit v1.2.3