pub mod const_fold;
pub mod copy_prop;
pub mod cse;
pub mod dce;
pub mod inline;
pub mod loop_invariant;
pub mod simplify_cfg;
use std::collections::HashSet;
use crate::compiler::ir::block::ControlFlowGraph;
use crate::compiler::ir::dom::DominatorTree;
use crate::compiler::ir::inst::IrInst;
use crate::compiler::ir::types::IrVar;
pub use crate::compiler::value_tracking::value_tracking_cfg;
pub use const_fold::constant_propagation;
pub use copy_prop::{copy_propagation, copy_propagation_cfg};
pub use cse::{common_subexpression_elimination, common_subexpression_elimination_cfg};
pub use dce::{dead_code_elimination, dead_code_elimination_cfg};
pub use inline::inline_functions;
pub use loop_invariant::loop_invariant_code_motion;
pub use simplify_cfg::simplify_cfg;
pub fn captured_vars(cfg: &ControlFlowGraph) -> HashSet<IrVar> {
let mut captured = HashSet::new();
for block in &cfg.blocks {
for inst in &block.instructions {
if let IrInst::Closure { captures, .. } = inst {
captured.extend(captures.iter().flatten().copied());
}
}
}
captured
}
pub fn optimize_cfg(cfg: &mut ControlFlowGraph) {
const MAX_FIXPOINT_ROUNDS: usize = 16;
for _ in 0..MAX_FIXPOINT_ROUNDS {
let mut changed = false;
let dom = DominatorTree::build(cfg);
if loop_invariant_code_motion(cfg, &dom) {
changed = true;
}
if common_subexpression_elimination_cfg(cfg) {
changed = true;
}
if copy_propagation_cfg(cfg) {
changed = true;
}
if value_tracking_cfg(cfg) {
changed = true;
}
if dead_code_elimination_cfg(cfg) {
changed = true;
}
if simplify_cfg(cfg) {
changed = true;
}
if !changed {
break;
}
}
}