feat(ir): 实现 is_pure 精确纯表(Pattern 1 全表 + LOAD_VAR/STORE_VAR 特判)

This commit is contained in:
爱特每羊队
2026-08-06 10:50:18 +08:00
parent c7b5df23ea
commit d33ec31532
+32 -6
View File
@@ -271,18 +271,18 @@ impl Inst {
OpCode::CALL | OpCode::CALL_NATIVE => {
push_operand(&mut uses, &self.rd);
push_operand(&mut uses, &self.a);
let nargs = self.ext.first().copied().unwrap_or(0) as u32;
let nargs = self.ext.first().copied().unwrap_or(0);
push_range(&mut uses, reg_of(&self.b), nargs);
}
// NEW_EXPRESSION:a=ctor, b..b+nargs
OpCode::NEW_EXPRESSION => {
push_operand(&mut uses, &self.a);
let nargs = self.ext.first().copied().unwrap_or(0) as u32;
let nargs = self.ext.first().copied().unwrap_or(0);
push_range(&mut uses, reg_of(&self.b), nargs);
}
// SUPER_CALL:a..a+nargs
OpCode::SUPER_CALL => {
let nargs = self.ext.first().copied().unwrap_or(0) as u32;
let nargs = self.ext.first().copied().unwrap_or(0);
push_range(&mut uses, reg_of(&self.a), nargs);
}
// GET_PROP 系:结果写 a/b 槽,rd=obj 是 use(Pitfall 3)
@@ -444,9 +444,35 @@ fn push_range(uses: &mut SmallVec<[u32; 4]>, first: Option<u32>, nargs: u32) {
impl Inst {
/// 本指令是否无观察副作用(Pattern 1 纯表;LOAD_VAR 的 This+derived 特判需 &IRFunction)。
pub fn is_pure(&self, _f: &IRFunction) -> bool {
// TODO: Pattern 1 表逐 opcode 实现
false
///
/// 纯 = 结果未用时可删。表外 opcode 一律有副作用(D-05 精确表,宁少删不错删)。
pub fn is_pure(&self, f: &IRFunction) -> bool {
match self.op {
// 算术 / 比较 / 位 / 逻辑:coerce 对象路径有抛错风险,D-05 决策算纯(运行时等价兜底)
OpCode::ADD | OpCode::SUB | OpCode::MUL | OpCode::DIV | OpCode::MOD | OpCode::NEG
| OpCode::UNARY_PLUS | OpCode::EQ | OpCode::NEQ | OpCode::LT | OpCode::GT
| OpCode::LTE | OpCode::GTE | OpCode::STRICT_EQ | OpCode::STRICT_NEQ
| OpCode::BIT_AND | OpCode::BIT_OR | OpCode::BIT_XOR | OpCode::SHL | OpCode::SHR
| OpCode::USHR | OpCode::BIT_NOT | OpCode::AND | OpCode::OR | OpCode::NOT
| OpCode::NULLISH => true,
// 分配 / 常量 / 空操作(a 槽非寄存器)
OpCode::NOP | OpCode::LOAD_CONST | OpCode::VOID | OpCode::TYPEOF | OpCode::NEW_OBJECT
| OpCode::NEW_ARRAY => true,
// 闭包 / cell 读取:无抛错路径(D-07)
OpCode::CREATE_CLOSURE | OpCode::LOAD_UPVALUE | OpCode::CELL_GET => true,
// 模板字符串:纯拼接写 rd,无抛错(use 统计覆盖其 ext)
OpCode::TEMPLATE_STR => true,
// LOAD_VAR:仅 a==This 且 derived 构造函数读 this 可能抛 ReferenceError(misc.rs:52-63)
OpCode::LOAD_VAR => {
!(self.a == Operand::This && f.is_derived_constructor)
}
// STORE_VAR:b==None/Imm(0) 纯拷贝无 guard;b==Imm(1) const guard 运行时判定(Pitfall 5)
OpCode::STORE_VAR => {
matches!(self.b, Operand::None | Operand::Imm(0))
}
// 其余全部有副作用(getter/调用/控制流/迭代器/复合更新/写共享状态/占位防御)
_ => false,
}
}
}