perf: 常量折叠加位运算与比较 C 组加池溢出守卫

This commit is contained in:
2026-10-12 15:19:09 +00:00
parent 9dd19bb46a
commit 36575c3aa0
6 changed files with 371 additions and 34 deletions
+7 -5
View File
@@ -3,7 +3,8 @@
//! `fold` 对每个函数(递归 nested,每个 nested 函数有独立常量池与指令流,独立前扫)
//! 运行单向前扫:维护 per-register known 表记录各虚拟寄存器的已知常量值,命中
//! 改写表即就地改写——A 组一元与算术常量折叠改写为 `LOAD_CONST`(新常量入池),
//! B 组逻辑短路改写为 `MOV`(无新常量)。
//! C 组位运算与比较常量折叠改写为 `LOAD_CONST`(新常量入池),B 组逻辑短路
//! 改写为 `MOV`(无新常量)。
//!
//! 不变量:
//! - 不删指令、不重映射 `label_pos`:改写只改变指令的 op 与操作数,不改变跳转
@@ -12,12 +13,13 @@
//! 跨汇合的陈旧知识不用于折叠。
//! - 负零守卫:算术折叠做实际运算(f64 加),不取恒等捷径——`-0.0 + 0.0` 得
//! `+0.0`(`Object.is` 可区分)。
//! - 池溢出守卫:常量池满(`u16::MAX`)时 A 组改写禁用(不新增常量),B 组
//! (MOV)不受影响。
//! - 池溢出守卫:常量池满(`u16::MAX`)时 A 组与 C 组改写禁用(不新增常量),
//! B 组(MOV)不受影响;`const_overflow` 已被 emit 层置位时整个 pass 跳过。
//!
//! 折值计算复用 `oxide_runtime_api::coercion` 的纯函数族(`to_number` /
//! `to_int32` / `to_boolean`),与 emit 层字面量折叠同源,杜绝两层折叠各自镜像
//! 运行时语义的漂移风险。
//! `to_int32` / `to_uint32` / `to_boolean` / `relational_compare` /
//! `abstract_eq_primitives` / `strict_equality`),与 emit 层字面量折叠同源,
//! 杜绝两层折叠各自镜像运行时语义的漂移风险。
mod fold_log;
mod fold_table;