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:
2402
CURRENT_TASK.md
2402
CURRENT_TASK.md
File diff suppressed because it is too large
Load Diff
@ -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(
|
||||
|
||||
@ -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-3(Full 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、同様にデッドコード
|
||||
|
||||
|
||||
Reference in New Issue
Block a user