#[allow(dead_code)] pub mod alias;
pub mod const_prop;
pub mod copy_prop;
pub mod dce;
pub mod display;
pub mod heap;
pub mod invariants;
#[allow(dead_code)]
pub mod ir;
pub mod lower;
pub mod param_points_to;
pub mod pointsto;
pub mod static_map;
pub mod type_facts;
#[allow(unused_imports)]
pub use ir::*;
pub use lower::lower_to_ssa;
pub use lower::lower_to_ssa_scoped_nop;
pub use lower::lower_to_ssa_with_params;
use crate::cfg::Cfg;
use crate::ssa::type_facts::TypeKind;
use crate::symbol::Lang;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct OptimizeResult {
pub const_values: HashMap<SsaValue, const_prop::ConstLattice>,
pub type_facts: type_facts::TypeFactResult,
pub alias_result: alias::BaseAliasResult,
pub points_to: heap::PointsToResult,
pub module_aliases: HashMap<SsaValue, smallvec::SmallVec<[String; 2]>>,
pub branches_pruned: usize,
pub copies_eliminated: usize,
pub dead_defs_removed: usize,
}
pub fn optimize_ssa(body: &mut SsaBody, cfg: &Cfg, lang: Option<Lang>) -> OptimizeResult {
optimize_ssa_with_param_types(body, cfg, lang, &[])
}
pub fn optimize_ssa_with_param_types(
body: &mut SsaBody,
cfg: &Cfg,
lang: Option<Lang>,
param_types: &[Option<TypeKind>],
) -> OptimizeResult {
let cp = const_prop::const_propagate(body);
let branches_pruned = const_prop::apply_const_prop(body, &cp);
let (copies_eliminated, copy_map) = copy_prop::copy_propagate(body, cfg);
let alias_result = alias::compute_base_aliases(©_map, body);
let dead_defs_removed = dce::eliminate_dead_defs(body, cfg);
let type_facts =
type_facts::analyze_types_with_param_types(body, cfg, &cp.values, lang, param_types);
let points_to = heap::analyze_points_to(body, cfg, lang);
let module_aliases = if matches!(lang, Some(Lang::JavaScript) | Some(Lang::TypeScript)) {
const_prop::collect_module_aliases(body, &cp.values)
} else {
HashMap::new()
};
OptimizeResult {
const_values: cp.values,
type_facts,
alias_result,
points_to,
module_aliases,
branches_pruned,
copies_eliminated,
dead_defs_removed,
}
}