mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
perf: DCE 管线复用,零删除免重建 CFG 与活集
This commit is contained in:
@@ -10,7 +10,7 @@ use oxide_ir::IRFunction;
|
||||
#[test]
|
||||
fn empty_function_unchanged() {
|
||||
let mut f = IRFunction::new();
|
||||
dce(&mut f);
|
||||
let _ = dce(&mut f);
|
||||
assert!(f.insts.is_empty());
|
||||
assert!(f.label_pos.is_empty());
|
||||
assert_eq!(f.label_count, 0);
|
||||
@@ -29,10 +29,10 @@ fn dce_is_idempotent() {
|
||||
.push(Inst::new(OpCode::RETURN, Operand::Reg(5), Operand::None, Operand::None)); // 4
|
||||
f.label_pos = vec![Some(0)];
|
||||
|
||||
dce(&mut f);
|
||||
let _ = dce(&mut f);
|
||||
let once_insts = f.insts.clone();
|
||||
let once_labels = f.label_pos.clone();
|
||||
dce(&mut f);
|
||||
let _ = dce(&mut f);
|
||||
assert_eq!(f.insts, once_insts, "二次 dce 后 insts 不变");
|
||||
assert_eq!(f.label_pos, once_labels, "二次 dce 后 label_pos 不变");
|
||||
}
|
||||
@@ -50,7 +50,7 @@ fn if_else_both_branches_reachable_kept() {
|
||||
f.label_pos = vec![Some(3), Some(4)];
|
||||
f.label_count = 2;
|
||||
|
||||
dce(&mut f);
|
||||
let _ = dce(&mut f);
|
||||
assert_eq!(f.insts.len(), 5, "双分支全保留");
|
||||
assert_eq!(f.label_pos, vec![Some(3), Some(4)], "存活 label 重映射到新下标");
|
||||
assert_eq!(f.label_count, 2, "label_count 保持原值,不参与重建");
|
||||
@@ -71,7 +71,7 @@ fn all_live_function_unchanged() {
|
||||
|
||||
let before_insts = f.insts.clone();
|
||||
let before_labels = f.label_pos.clone();
|
||||
dce(&mut f);
|
||||
let _ = dce(&mut f);
|
||||
assert_eq!(f.insts, before_insts, "全存活时 insts 逐位不变");
|
||||
assert_eq!(f.label_pos, before_labels, "全存活时 label_pos 逐位不变");
|
||||
assert_eq!(f.label_count, 1, "label_count 保持原值");
|
||||
|
||||
@@ -17,7 +17,7 @@ fn run_source(src: &str, precise: bool) -> Result<JsValue, String> {
|
||||
let mut ir = oxide_emit::Emitter::new()
|
||||
.emit_program(&program, false, false)
|
||||
.expect("emit failed");
|
||||
oxide_dce::dce(&mut ir); // 保守轮恒定(两跑一致)
|
||||
let _ = oxide_dce::dce(&mut ir); // 保守轮恒定(两跑一致)
|
||||
if precise {
|
||||
let cfg = oxide_cfg::build_cfg(&ir);
|
||||
let live = oxide_liveness::liveness(&ir, &cfg);
|
||||
@@ -78,7 +78,7 @@ fn top_level_store_var_survives_precise() {
|
||||
let mut ir = oxide_emit::Emitter::new()
|
||||
.emit_program(&program, false, false)
|
||||
.expect("emit failed");
|
||||
oxide_dce::dce(&mut ir);
|
||||
let _ = oxide_dce::dce(&mut ir);
|
||||
let cfg = oxide_cfg::build_cfg(&ir);
|
||||
let live = oxide_liveness::liveness(&ir, &cfg);
|
||||
oxide_dce::dce_precise(&mut ir, &live);
|
||||
@@ -104,7 +104,7 @@ fn precise_removes_dead_local_store() {
|
||||
.expect("emit failed");
|
||||
assert_eq!(ir.nested.len(), 1);
|
||||
let mut sub = ir.nested[0].clone();
|
||||
oxide_dce::dce(&mut sub);
|
||||
let _ = oxide_dce::dce(&mut sub);
|
||||
let cfg = oxide_cfg::build_cfg(&sub);
|
||||
let live = oxide_liveness::liveness(&sub, &cfg);
|
||||
oxide_dce::dce_precise(&mut sub, &live);
|
||||
|
||||
@@ -17,7 +17,7 @@ fn run_source(src: &str, dce: bool) -> Result<JsValue, String> {
|
||||
.emit_program(&program, false, false)
|
||||
.expect("emit failed");
|
||||
if dce {
|
||||
oxide_dce::dce(&mut ir);
|
||||
let _ = oxide_dce::dce(&mut ir);
|
||||
}
|
||||
let module = oxide_ir::lower::lower(&ir).expect("lower failed");
|
||||
let mut vm = Vm::new();
|
||||
@@ -80,7 +80,7 @@ fn top_level_store_var_kept() {
|
||||
let mut ir = oxide_emit::Emitter::new()
|
||||
.emit_program(&program, false, false)
|
||||
.expect("emit failed");
|
||||
oxide_dce::dce(&mut ir);
|
||||
let _ = oxide_dce::dce(&mut ir);
|
||||
let module = oxide_ir::lower::lower(&ir).expect("lower failed");
|
||||
let has_store_var = module
|
||||
.bytecode
|
||||
|
||||
Reference in New Issue
Block a user