feat(phi): Phase 41-1 delete dead PHI code (147 lines)

Delete pure dead code identified by Task agent investigation:

**if_phi.rs (-99 lines)**
- merge_modified_at_merge_with (70 lines) - zero external callsites
  Superseded by PhiBuilderBox::generate_if_phis()
- merge_with_reset_at_merge_with (29 lines) - wrapper for above

**conservative.rs (-48 lines)**
- get_conservative_values (48 lines) - zero callsites
  Superseded by PhiBuilderBox::get_conservative_if_values()

Tests: Phase 40 5/5 PASS, conservative 3/3 PASS
No regression (14 pre-existing failures unchanged)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-11-28 12:02:52 +09:00
parent b53a2972db
commit 43df7aeede
3 changed files with 118 additions and 2506 deletions

File diff suppressed because it is too large Load Diff

View File

@ -84,55 +84,8 @@ impl ConservativeMerge {
}
}
/// Conservative フォールバック値取得
///
/// # Returns
/// * `Some((then_v, else_v))` - 両ブランチの値void emission 含む)
/// * `None` - どこにも定義されていない変数(スキップ)
///
/// # Conservative Rules
/// 1. Both defined: use both values
/// 2. Only then: use then + void
/// 3. Only else: use void + else
/// 4. Neither: skip (return None)
pub fn get_conservative_values<F>(
&self,
name: &str,
pre_if: &BTreeMap<String, ValueId>, // Phase 25.1: BTreeMap化
then_end: &BTreeMap<String, ValueId>, // Phase 25.1: BTreeMap化
else_end_opt: &Option<BTreeMap<String, ValueId>>, // Phase 25.1: BTreeMap化
emit_void: F,
) -> Option<(ValueId, ValueId)>
where
F: Fn() -> ValueId,
{
let pre_val_opt = pre_if.get(name).copied();
// Fallback to predecessor value if not defined in a branch
let then_v_opt = then_end.get(name).copied().or(pre_val_opt);
let else_v_opt = else_end_opt
.as_ref()
.and_then(|m| m.get(name).copied())
.or(pre_val_opt);
match (then_v_opt, else_v_opt) {
(Some(tv), Some(ev)) => Some((tv, ev)),
(Some(tv), None) => {
// Variable exists in then branch but not else or predecessor
// Emit a 'const void' instruction to represent undefined value
Some((tv, emit_void()))
}
(None, Some(ev)) => {
// Variable exists in else branch but not then or predecessor
// Emit a 'const void' instruction to represent undefined value
Some((emit_void(), ev))
}
(None, None) => {
// Variable doesn't exist anywhere - skip
None
}
}
}
// Phase 41-1削除済み2025-11-29
// - get_conservative_values (48行) - PhiBuilderBox::get_conservative_if_values()に置き換え済み
/// Debug trace 出力Conservative PHI生成の可視化
pub fn trace_if_enabled(

View File

@ -22,35 +22,27 @@
* - **置換**: `collect_assigned_vars_via_joinir()` (JoinIR Frontend経由)
* - **理由**: A/Bテストで退行なし確認、むしろ2テスト改善
*
* ## 🔜 Phase 40で削除予定Level 2-B、80行)
* ## Phase 41-1で削除済みデッドコード、99行)
*
* - `merge_modified_at_merge_with` (70行) → **削除完了 2025-11-29**
* - **理由**: 外部callsiteゼロ、PhiBuilderBox::generate_if_phis()に置き換え済み
*
* - `merge_with_reset_at_merge_with` (29行) → **削除完了 2025-11-29**
* - **理由**: 上記のwrapper、同様にデッドコード
*
* ## 🔜 Phase 40で削除予定Level 2-B、56行
*
* - `compute_modified_names` (26行)
* - **削除条件**: JoinIR Verifier conservative migration完了
* - **置換**: `JoinIrConservativeAnalyzer`
* - **callsites**: conservative.rs:42
* - **Phase**: Phase 40-2
*
* - `merge_with_reset_at_merge_with` (27行)
* - **削除条件**: Full IfMerge with reset semantics実装
* - **置換**: IfMerge reset extension
* - **Phase**: Phase 40-3
* - **callsites**: conservative.rs:78
*
* - conservative.rs struct inline (30行)
* - **Phase**: Phase 40-4
*
* **予想**: if_phi.rs: 225行 → 110行51%削減)
* ## 現在の状態
*
* ## ⏳ Phase 41+で削除予定Level 3、約300行
*
* - `merge_modified_at_merge_with` (63行, コアPHI生成ロジック)
* - **削除条件**: Stage-1/Stage-B/selfhost完全JoinIRカバレッジ
* - **難易度**: HIGH
* - **依存**: 全If/Loop統合、PhiMergeOps trait置換
*
* - その他複雑PHI生成関数約237行
* - **削除条件**: Level 3基準達成JoinIR 92%カバレッジ)
*
* **予想**: if_phi.rs: 110行 → ほぼ削除 or 最小ユーティリティのみ
* - **if_phi.rs**: 451行 → 321行Phase 41-1後、29%削減
* - **累計削減**: 315行Phase 38: 90行, Phase 40-4.1: 35行, Phase 41-1: 99行+ conservative 48行
*
* ## 参照ドキュメント
*
@ -313,139 +305,8 @@ pub trait PhiMergeOps {
}
// ========================================
// Phase 41+削除予定Level 3、HIGH難易度
// Phase 41-1削除済み2025-11-29
// ========================================
/// 複雑PHI生成コアロジック
///
/// Merge variables modified in branches at the merge block using provided ops.
/// Handles both two-pred and single-pred (reachable) cases gracefully.
///
/// # Purpose
/// If/Loop統合時の複雑なPHI生成。PhiMergeOps traitのコア実装。
///
/// # Phase 41+削減計画
///
/// - **削除予定**: Phase 41+Stage-1/Stage-B/selfhost完全カバレッジ後
/// - **難易度**: HIGH
/// - **削除条件**:
/// - ❌ JoinIR Frontend 92%カバレッジ達成
/// - ❌ PhiMergeOps trait完全置換
/// - ❌ Stage-1/Stage-B/selfhost大半のIf/Loop動作
/// - **削減効果**: 63行
///
/// # Migration Path
///
/// Phase 41+でJoinIR Frontend完全実装後に設計予定。
pub fn merge_modified_at_merge_with<O: PhiMergeOps>(
ops: &mut O,
merge_bb: crate::mir::BasicBlockId,
_then_block: crate::mir::BasicBlockId,
_else_block: crate::mir::BasicBlockId,
then_pred_opt: Option<crate::mir::BasicBlockId>,
else_pred_opt: Option<crate::mir::BasicBlockId>,
pre_if_snapshot: &BTreeMap<String, ValueId>,
then_map_end: &BTreeMap<String, ValueId>,
else_map_end_opt: &Option<BTreeMap<String, ValueId>>,
skip_var: Option<&str>,
) -> Result<(), String> {
// TODO(Phase 41+): Stage-1/Stage-B完全実装が前提
// JoinIR Frontend完全カバレッジ後に削除
let trace = std::env::var("NYASH_IF_TRACE").ok().as_deref() == Some("1");
let changed = compute_modified_names(pre_if_snapshot, then_map_end, else_map_end_opt);
for name in changed {
if skip_var.map(|s| s == name).unwrap_or(false) {
continue;
}
let pre = match pre_if_snapshot.get(name.as_str()) {
Some(v) => *v,
None => continue,
};
let then_v = then_map_end.get(name.as_str()).copied().unwrap_or(pre);
let else_v = else_map_end_opt
.as_ref()
.and_then(|m| m.get(name.as_str()).copied())
.unwrap_or(pre);
if trace {
eprintln!(
"[if-trace] merge var={} pre={:?} then_v={:?} else_v={:?} then_pred={:?} else_pred={:?}",
name, pre, then_v, else_v, then_pred_opt, else_pred_opt
);
}
// Build incoming pairs from reachable predecessors only
let mut inputs: Vec<(crate::mir::BasicBlockId, ValueId)> = Vec::new();
// Only include reachable predecessors; do not synthesize else_block when unreachable.
if let Some(tp) = then_pred_opt {
inputs.push((tp, then_v));
}
if let Some(ep) = else_pred_opt {
inputs.push((ep, else_v));
}
match inputs.len() {
0 => {}
1 => {
let (_pred, v) = inputs[0];
if trace {
eprintln!("[if-trace] merge bind var={} v={:?} (single pred)", name, v);
}
ops.update_var(name, v);
}
_ => {
ops.debug_verify_phi_inputs(merge_bb, &inputs);
let dst = ops.new_value();
ops.emit_phi_at_block_start(merge_bb, dst, inputs)?;
if trace {
eprintln!("[if-trace] merge phi var={} dst={:?}", name, dst);
}
ops.update_var(name, dst);
}
}
}
Ok(())
}
/// PHI生成reset semantics付き
///
/// Convenience wrapper: reset variable map (via a caller-provided closure)
/// then perform merge at the merge block. Keeps caller simple while
/// avoiding tying phi_core to concrete builder internals.
///
/// # Phase 40削減計画
///
/// - **削除予定**: Phase 40-3Full IfMerge with reset実装後
/// - **置換先**: IfMerge reset extension
/// - **削減効果**: 27行
pub fn merge_with_reset_at_merge_with<O: PhiMergeOps>(
ops: &mut O,
merge_bb: crate::mir::BasicBlockId,
then_block: crate::mir::BasicBlockId,
else_block: crate::mir::BasicBlockId,
then_pred_opt: Option<crate::mir::BasicBlockId>,
else_pred_opt: Option<crate::mir::BasicBlockId>,
pre_if_snapshot: &BTreeMap<String, ValueId>,
then_map_end: &BTreeMap<String, ValueId>,
else_map_end_opt: &Option<BTreeMap<String, ValueId>>,
reset_vars: impl FnOnce(),
skip_var: Option<&str>,
) -> Result<(), String> {
// TODO(Phase 40-3): IfMerge reset semantics拡張で置き換え
reset_vars();
merge_modified_at_merge_with(
ops,
merge_bb,
then_block,
else_block,
then_pred_opt,
else_pred_opt,
pre_if_snapshot,
then_map_end,
else_map_end_opt,
skip_var,
)
}
// - merge_modified_at_merge_with (70行) - PhiBuilderBox::generate_if_phis()に置き換え済み
// - merge_with_reset_at_merge_with (29行) - 上記のwrapper、同様にデッドコード