feat(liveness): 新增 oxide_liveness crate,CFG 数据流 liveness + 逐指令 live range(D-15)

This commit is contained in:
爱特每羊队
2026-08-06 16:41:57 +08:00
parent fc4924c2c9
commit de558f7a99
8 changed files with 556 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
//! liveness 分析 pass:IRFunction + CFG → LiveInfo(只读,D-15)。
//!
//! 消费 `oxide_ir::IRFunction`(只读)与 `oxide_cfg::Cfg`(preds/succs + exit 哨兵,D-12),
//! 产出 LiveInfo 分析视图(D-01:pass 输出不住进 IR)。两阶段:`dataflow`(块级
//! liveIn/liveOut 不动点)→ `ranges`(块内反向扫描逐指令 live 集)。gen/kill 直接消费
//! contract.rs def_reg/use_regs(D-22),None→0 / This→254 / NewTarget→255 零重复映射。
mod dataflow;
mod live_info;
mod ranges;
pub use live_info::LiveInfo;
use oxide_cfg::Cfg;
use oxide_ir::IRFunction;
/// 计算 liveness:`&IRFunction + &Cfg → LiveInfo`。纯函数,只读 IR(D-15)。
/// 空 IRFunction 退化:返回 LiveInfo::new()(照 oxide_dce 空函数先例)。
pub fn liveness(f: &IRFunction, cfg: &Cfg) -> LiveInfo {
if f.insts.is_empty() {
return LiveInfo::new();
}
let (block_in, block_out, reg_count) = dataflow::block_liveness(f, cfg);
let (inst_before, inst_after) = ranges::inst_liveness(f, cfg, &block_out, &block_in, reg_count);
LiveInfo {
block_live_in: block_in,
block_live_out: block_out,
inst_live_before: inst_before,
inst_live_after: inst_after,
}
}