mod const_folding;
mod passes;
mod value_replacement;
use crate::{Const, Function, Value};
use std::collections::HashMap;
#[derive(Default)]
pub struct Optimizer {
value_replace_map: HashMap<Value, Value>,
const_map: HashMap<Value, Const>,
}
impl Optimizer {
pub fn optimize(&mut self, mut func: Function) -> Function {
for block in func.blocks.values_mut() {
let insts = std::mem::take(&mut block.insts);
let insts = self.elim_store_load(insts);
let insts = self.fold_ptr_add(insts);
self.collect_consts(&insts);
block.insts = insts;
}
for block in func.blocks.values_mut() {
let insts = std::mem::take(&mut block.insts);
let insts = self.replace_values_in_block(insts);
let insts = self.fold_consts(insts);
block.insts = insts;
}
func
}
}