diff --git a/docs/private b/docs/private index 4b138e22..6709df29 160000 --- a/docs/private +++ b/docs/private @@ -1 +1 @@ -Subproject commit 4b138e223c3726809ce003371a43460fce07b57b +Subproject commit 6709df29021a036ca1d757b6fe9a89e29946199f diff --git a/src/mir/phi_core/conservative.rs b/src/mir/phi_core/conservative.rs index f02a08c6..0e9d30d3 100644 --- a/src/mir/phi_core/conservative.rs +++ b/src/mir/phi_core/conservative.rs @@ -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, diff --git a/src/mir/phi_core/if_phi.rs b/src/mir/phi_core/if_phi.rs index 3d229be8..2b2a848e 100644 --- a/src/mir/phi_core/if_phi.rs +++ b/src/mir/phi_core/if_phi.rs @@ -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行 → 321行(Phase 41-1後、29%削減) - * - **累計削減**: 315行(Phase 38: 90行, Phase 40-4.1: 35行, Phase 41-1: 99行)+ conservative 48行 + * - **if_phi.rs**: 321行 → 288行(Phase 47後、33行削減) + * - **累計削減**: 348行(Phase 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-2(JoinIR 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, - then_map_end: &BTreeMap, - else_map_end_opt: &Option>, -) -> Vec { - // 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 = 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 {