feat(phi): Phase 47-2 compute_modified_names削除(33行削減)

- if_phi.rs から compute_modified_names を削除
- conservative.rs::ConservativeMerge::analyze 内にロジックをインライン化
- if_phi.rs 累計削減: 348行(Phase 38: 90行, 40-4.1: 35行, 41-1: 99行, 47: 33行)

テスト: conservative 3/3 PASS

🤖 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 18:40:47 +09:00
parent ac921b4188
commit 8dc1d3bb99
3 changed files with 43 additions and 78 deletions

View File

@ -34,7 +34,7 @@
//! - Phase 39設計: `docs/.../phase-39-if-phi-level2/joinir_extension_design.md`
use crate::mir::ValueId;
use std::collections::{BTreeMap, HashSet}; // Phase 25.1: BTreeMap化
use std::collections::{BTreeMap, BTreeSet, HashSet}; // Phase 25.1: BTreeMap化, Phase 47: BTreeSet追加
/// Conservative PHI 戦略による変数マージ分析
///
@ -74,9 +74,29 @@ impl ConservativeMerge {
all_vars.extend(else_map.keys().cloned());
}
let changed =
crate::mir::phi_core::if_phi::compute_modified_names(pre_if, then_end, else_end_opt);
let changed_vars = changed.into_iter().collect();
// Phase 47: compute_modified_names インライン化if_phi.rs から削除)
// 決定的順序のためBTreeSet使用
let mut names: BTreeSet<&str> = BTreeSet::new();
for k in then_end.keys() {
names.insert(k.as_str());
}
if let Some(emap) = else_end_opt.as_ref() {
for k in emap.keys() {
names.insert(k.as_str());
}
}
let mut changed_vars = HashSet::new();
// アルファベット順で決定的にイテレート
for &name in &names {
let pre = pre_if.get(name);
let t = then_end.get(name);
let e = else_end_opt.as_ref().and_then(|m| m.get(name));
if (t.is_some() && Some(*t.unwrap()) != pre.copied())
|| (e.is_some() && Some(*e.unwrap()) != pre.copied())
{
changed_vars.insert(name.to_string());
}
}
Self {
all_vars,

View File

@ -30,19 +30,16 @@
* - `merge_with_reset_at_merge_with` (29行) → **削除完了 2025-11-29**
* - **理由**: 上記のwrapper、同様にデッドコード
*
* ## 🔜 Phase 40で削除予定Level 2-B、56行)
* ## Phase 47で削除済みLevel 2-B、33行)
*
* - `compute_modified_names` (26行)
* - **削除条件**: JoinIR Verifier conservative migration完了
* - **置換**: `JoinIrConservativeAnalyzer`
* - **callsites**: conservative.rs:78
*
* - conservative.rs struct inline (30行)
* - `compute_modified_names` (33行) → **削除完了 2025-11-29**
* - **置換**: conservative.rs::ConservativeMerge::analyze 内にインライン化
* - **理由**: callsite 1箇所のみ、if_phi.rs責務縮小
*
* ## 現在の状態
*
* - **if_phi.rs**: 451行 → 321Phase 41-1後、29%削減)
* - **累計削減**: 315Phase 38: 90行, Phase 40-4.1: 35行, Phase 41-1: 99行+ conservative 48行
* - **if_phi.rs**: 321行 → 288Phase 47後、33行削減)
* - **累計削減**: 348Phase 38: 90行, Phase 40-4.1: 35行, Phase 41-1: 99行, Phase 47: 33行+ conservative 48行
*
* ## 参照ドキュメント
*
@ -220,70 +217,18 @@ fn extract_vars_from_json_stmt(
}
}
/// 保守的修正名前計算
///
/// Compute the set of variable names whose values changed in either branch
/// relative to the pre-if snapshot.
///
/// # Purpose
/// Conservative PHI生成戦略で修正される変数名を計算。
/// 非対称分岐else なしでのvoid emission用。
///
/// # Phase 40削減計画
///
/// - **削除予定**: Phase 40-2JoinIR Verifier conservative migration後
/// - **置換先**: `JoinIrConservativeAnalyzer`
/// - **削除条件**:
/// - ✅ ConservativeMerge logic → JoinIR Verifier migration完了
/// - ✅ Conservative value propagation in JoinIR実装
/// - **callsites**: 1箇所
/// - conservative.rs:42 (ConservativeMerge::analyze)
/// - **削減効果**: 26行
///
/// # Migration Path
///
/// ```rust,ignore
/// // Before
/// let modified = if_phi::compute_modified_names(if_expr);
///
/// // After (Phase 40)
/// // JoinIR Verifier内でconservative分析
/// let analyzer = JoinIrConservativeAnalyzer::new();
/// let modified = analyzer.compute_modified_names(join_ir_func);
/// ```
pub fn compute_modified_names(
pre_if_snapshot: &BTreeMap<String, ValueId>,
then_map_end: &BTreeMap<String, ValueId>,
else_map_end_opt: &Option<BTreeMap<String, ValueId>>,
) -> Vec<String> {
// TODO(Phase 40-2): JoinIR Verifierに移行予定
// JoinIrConservativeAnalyzerに置き換え
use std::collections::BTreeSet;
// 決定的順序のためBTreeSet使用
let mut names: BTreeSet<&str> = BTreeSet::new();
for k in then_map_end.keys() {
names.insert(k.as_str());
}
if let Some(emap) = else_map_end_opt.as_ref() {
for k in emap.keys() {
names.insert(k.as_str());
}
}
let mut changed: Vec<String> = Vec::new();
// アルファベット順で決定的にイテレート
for &name in &names {
let pre = pre_if_snapshot.get(name);
let t = then_map_end.get(name);
let e = else_map_end_opt.as_ref().and_then(|m| m.get(name));
if (t.is_some() && Some(*t.unwrap()) != pre.copied())
|| (e.is_some() && Some(*e.unwrap()) != pre.copied())
{
changed.push(name.to_string());
}
}
changed
}
// ========================================
// Phase 47: compute_modified_names削除完了2025-11-29
// ========================================
//
// 削除日: 2025-11-29
// 削除行数: 33行関数本体 + docコメント
// 置換先: conservative.rs::ConservativeMerge::analyze 内にインライン化
//
// 旧関数は以下の理由で削除:
// - callsite 1箇所conservative.rs:78のみ
// - ロジックをconservative.rs内にインライン化完了
// - if_phi.rsの責務縮小JoinIR移行準備
/// Operations required for emitting a PHI or direct binding at a merge point.
pub trait PhiMergeOps {