diff --git a/Cargo.toml b/Cargo.toml index 3b611b4..15fc2ce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ members = [ "crates/oxide_emit", "crates/oxide_ir", "crates/oxide_cfg", + "crates/oxide_dce", "crates/oxide_types", "crates/oxide_vm", "crates/oxide_kernel", diff --git a/crates/oxide_dce/Cargo.toml b/crates/oxide_dce/Cargo.toml new file mode 100644 index 0000000..37f1f8b --- /dev/null +++ b/crates/oxide_dce/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "oxide_dce" +version.workspace = true +edition.workspace = true +license.workspace = true +rust-version.workspace = true +description = "OxideJS - dead code elimination pass over IR (reachability + use-count iteration + mark-sweep)" + +[dependencies] +oxide_ir = { path = "../oxide_ir" } +oxide_cfg = { path = "../oxide_cfg" } + +[dev-dependencies] +oxide_parser = { path = "../oxide_parser" } +oxide_emit = { path = "../oxide_emit" } +oxide_vm = { path = "../oxide_vm" } diff --git a/crates/oxide_dce/src/lib.rs b/crates/oxide_dce/src/lib.rs new file mode 100644 index 0000000..ac5bcbe --- /dev/null +++ b/crates/oxide_dce/src/lib.rs @@ -0,0 +1,20 @@ +//! DCE 改写 pass:IRFunction → 死代码消除后 compact 重建。 +//! +//! 改写 pass(D-09):`&mut IRFunction` 就地 compact(D-06 方案 A 索引关联保证无借用冲突), +//! 三 Pass——Pass A 块级可达性(消费 `oxide_cfg::build_cfg`,Exception 边保守,D-07/Pitfall 4)、 +//! Pass B 全函数 use 计数迭代删除死指令到不动点(D-01/D-02 连锁语义)、 +//! Pass C mark-sweep 一次性重建 insts + label_pos 重映射(D-13,不用就地逐删平移)。 +//! 本 pass 不碰 nested(D-03 不递归)、常量池(D-14 不清理)、n_registers(D-04 不收缩)、 +//! label_count(D-13 不读不改)。中间产物(keep/use_count)用局部 Vec 显式传参, +//! 不做 struct 状态持有(无共享可变状态约定)。零 unsafe。 + +use oxide_ir::IRFunction; + +/// 死代码消除:块级不可达删除 + 全函数 use 计数迭代删除到不动点 + mark-sweep 重建。 +pub fn dce(f: &mut IRFunction) { + // 空 IRFunction 退化形态:无指令可删(照 oxide_cfg empty_function 先例)。 + // 非空路径为 Task 2/3 骨架占位:Pass A 可达性 + Pass B use 计数迭代 + Pass C mark-sweep。 + if !f.insts.is_empty() { + // TODO(Task 2/3):Pass A/B/C 实现(当前骨架 no-op,等价于不改写)。 + } +}