mod bounds;
mod call_path;
mod correctness;
mod cross_function;
pub mod escape_analysis;
mod hof_inline;
pub mod licm;
mod loop_lowering;
mod numeric_arrays;
mod table_queryable;
mod typed_mir;
pub(crate) mod vectorization;
use std::collections::{HashMap, HashSet};
use shape_vm::bytecode::BytecodeProgram;
use crate::loop_analysis::LoopInfo;
pub use bounds::{AffineGuardArraySource, AffineSquareGuard, LinearBoundGuard};
pub use call_path::CallPathPlan;
pub use cross_function::Tier2CacheKey;
pub use escape_analysis::EscapeAnalysisPlan;
pub use hof_inline::{HofInlinePlan, HofInlineSite};
pub use licm::LicmPlan;
pub use loop_lowering::LoopLoweringPlan;
pub use numeric_arrays::NumericArrayPlan;
pub use table_queryable::TableQueryablePlan;
pub use typed_mir::TypedMirFunction;
pub use vectorization::SIMDPlan;
#[derive(Debug, Clone, Default)]
pub struct FunctionOptimizationPlan {
#[allow(dead_code)]
pub typed_mir: TypedMirFunction,
pub loops: HashMap<usize, LoopLoweringPlan>,
pub trusted_array_get_indices: HashSet<usize>,
pub trusted_array_set_indices: HashSet<usize>,
pub non_negative_array_get_indices: HashSet<usize>,
pub non_negative_array_set_indices: HashSet<usize>,
pub non_negative_iv_guards_by_loop: HashMap<usize, Vec<u16>>,
pub non_negative_step_guards_by_loop: HashMap<usize, Vec<u16>>,
pub linear_bound_guards_by_loop: HashMap<usize, Vec<LinearBoundGuard>>,
pub affine_square_guards_by_loop: HashMap<usize, Vec<AffineSquareGuard>>,
pub vector_width_by_loop: HashMap<usize, u8>,
pub simd_plans: HashMap<usize, SIMDPlan>,
pub numeric_arrays: NumericArrayPlan,
pub call_path: CallPathPlan,
#[allow(dead_code)]
pub table_queryable: TableQueryablePlan,
pub hof_inline: HofInlinePlan,
pub licm: LicmPlan,
pub escape_analysis: EscapeAnalysisPlan,
}
pub fn build_function_plan(
program: &BytecodeProgram,
loop_info: &HashMap<usize, LoopInfo>,
) -> FunctionOptimizationPlan {
let typed_mir = typed_mir::build_typed_mir(program);
let loops = loop_lowering::plan_loops(program, loop_info, &typed_mir);
let bounds = bounds::analyze_bounds(program, loop_info, &loops);
let numeric_arrays = numeric_arrays::analyze_numeric_arrays(
program,
&bounds.trusted_get_indices,
&bounds.non_negative_get_indices,
&bounds.trusted_set_indices,
&bounds.non_negative_set_indices,
);
let vector_width_by_loop =
vectorization::analyze_vectorization(program, loop_info, &loops, &typed_mir);
let simd_plans = vectorization::analyze_simd(program, loop_info, &loops);
let call_path = call_path::analyze_call_path(program, &loops);
let table_queryable = table_queryable::analyze_table_queryable(program);
let hof_inline = hof_inline::analyze_hof_inline(program);
let licm = licm::analyze_licm(program, loop_info);
let escape_analysis = escape_analysis::analyze_escape(program);
let plan = FunctionOptimizationPlan {
typed_mir,
loops,
trusted_array_get_indices: bounds.trusted_get_indices,
trusted_array_set_indices: bounds.trusted_set_indices,
non_negative_array_get_indices: bounds.non_negative_get_indices,
non_negative_array_set_indices: bounds.non_negative_set_indices,
non_negative_iv_guards_by_loop: bounds.non_negative_iv_guards_by_loop,
non_negative_step_guards_by_loop: bounds.non_negative_step_guards_by_loop,
linear_bound_guards_by_loop: bounds.linear_bound_guards_by_loop,
affine_square_guards_by_loop: bounds.affine_square_guards_by_loop,
vector_width_by_loop,
simd_plans,
numeric_arrays,
call_path,
table_queryable,
hof_inline,
licm,
escape_analysis,
};
correctness::validate_plan(program, &plan);
plan
}