From 2a07ec4a5d8e40153872b8e299f1052af7108e99 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Thu, 17 Sep 2026 17:02:16 +0000 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=94=B9=E5=86=99=E6=B4=BB=E8=B7=83?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E5=88=86=E6=9E=90=E6=B3=A8=E9=87=8A=E7=9A=84?= =?UTF-8?q?=E7=BC=96=E5=8F=B7=E4=B8=8E=E8=A1=8C=E5=8F=B7=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_liveness/src/dataflow.rs | 14 +++++++------- crates/oxide_liveness/src/ranges.rs | 5 +++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/crates/oxide_liveness/src/dataflow.rs b/crates/oxide_liveness/src/dataflow.rs index 87ba9739..b9b559a9 100644 --- a/crates/oxide_liveness/src/dataflow.rs +++ b/crates/oxide_liveness/src/dataflow.rs @@ -3,7 +3,7 @@ //! gen/kill 直接消费 `oxide_ir::contract` 的 `def_reg`/`use_regs`, //! None→0 / This→254 / NewTarget→255 / CALL 隐式 reg0 全内置,不重复建。 //! Exception 边当普通边参与迭代;Exception 目标块入口 reg 0 隐式 def -//! (异常展开写 regs[0],vm_runtime.rs:204-205)在此建模:gen.remove(0)+kill.insert(0)。 +//! (异常展开由 VM 派发循环写入 regs[0])在此建模:gen.remove(0)+kill.insert(0)。 //! //! 位集为 `u64` 压缩(1 字 64 位,密度为 `Vec` 的 8 倍);不动点迭代 //! 复用 out/input 两块缓冲(clear + 覆盖),不逐块逐迭代分配。 @@ -16,7 +16,7 @@ use crate::live_info::{bitset_clear, bitset_set}; /// 块级 liveness:返回 (block_live_in, block_live_out, reg_count)。 /// reg_count = 全部 def/use 最大 reg 号(bitset 容量 = reg_count+1)。 pub(super) fn block_liveness(f: &IRFunction, cfg: &Cfg) -> (Vec>, Vec>, usize) { - // 1. reg_count 上界扫描(不信任 f.n_registers,动态求上界,照 iter_sweep 先例) + // 上界扫描:f.n_registers 在 emit 阶段未必填准,故不信任它,逐 inst 取 def/use 最大 reg 号作 bitset 容量上界。 let mut reg_count = 255usize; // 兜底 This/NewTarget 254/255 for inst in &f.insts { if let Some(d) = inst.def_reg() { @@ -30,12 +30,12 @@ pub(super) fn block_liveness(f: &IRFunction, cfg: &Cfg) -> (Vec>, Vec> = vec![vec![0u64; words]; n]; let mut kill: Vec> = vec![vec![0u64; words]; n]; for (b, block) in cfg.blocks.iter().enumerate() { // gen:块内反向扫描,kill 先于 gen(`live = (live − def) ∪ use`)。 - // 顺序理由:COMPOUND_ADD 等读-写同寄存器指令 use 含 rd(contract.rs:137), + // 顺序理由:COMPOUND_ADD 等读-写同寄存器指令的 uses 含 Rd(见 oxide_ir::contract 的 def/use 约定), // gen 先于 kill 会把 rd 旧值从 live_before 错误剔除。 let mut live = vec![0u64; words]; for i in block.inst_range.clone().rev() { @@ -68,10 +68,10 @@ pub(super) fn block_liveness(f: &IRFunction, cfg: &Cfg) -> (Vec>, Vec