feat(phi): Phase 26-F-2 - 箱理論による責務分離(IfBodyLocalMergeBox新設)

**箱理論による問題解決**:
-  問題: LoopVarClassBox(ループスコープ分析)とif-merge処理が混在
-  解決: if-merge専用箱を新設して責務分離

**新箱: IfBodyLocalMergeBox**:
- 責務: if-merge専用のbody-local φ候補決定
- ロジック:
  - 両腕に存在する変数を検出
  - pre_ifと比較して値が変わった変数のみ
  - empty elseは空リスト返す
- 特徴: LocalScopeInspector不要、LoopVarClassBox不使用

**変更ファイル**:
- src/mir/phi_core/if_body_local_merge.rs: 新規作成(IfBodyLocalMergeBox)
- src/mir/phi_core/phi_builder_box.rs: IfBodyLocalMergeBox使用に切り替え
- src/mir/phi_core/body_local_phi_builder.rs: filter_if_merge_candidates()削除
- src/mir/loop_builder.rs: BodyLocalPhiBuilder setup削除
- src/mir/phi_core/mod.rs: if_body_local_merge追加

**テスト結果**:
- Passed: 353→354 (+1) 
- Failed: 14→14 (退行なし)

**既知の問題**:
- domination error依然残存(%48 in bb48 from bb52)
- 次フェーズで調査・修正予定

技術詳細:
- ChatGPT箱理論分析による設計
- A案ベースのシンプル実装
- 責務明確化: ループスコープ分析 vs if-merge専用処理
This commit is contained in:
nyash-codex
2025-11-22 11:03:21 +09:00
parent cbe6bf0140
commit 948f22a03a
15 changed files with 634 additions and 353 deletions

View File

@ -1147,22 +1147,14 @@ impl<'a> LoopBuilder<'a> {
let mut ops = Ops(self);
// Phase 26-F: BodyLocalPhiBuilder setup for if-merge PHI filtering
// Purpose: Filter out BodyLocalInternal variables (defined in only some branches)
let inspector = crate::mir::phi_core::local_scope_inspector::LocalScopeInspectorBox::new();
let classifier = crate::mir::phi_core::loop_var_classifier::LoopVarClassBox::new();
let body_local_builder =
crate::mir::phi_core::body_local_phi_builder::BodyLocalPhiBuilder::new(
classifier,
inspector,
);
// Phase 26-F-2: BodyLocalPhiBuilder削除、IfBodyLocalMergeBox使用
// 理由: 箱理論による責務分離(ループスコープ分析 vs if-merge専用処理
// Phase 26-E: PhiBuilderBox SSOT統合If PHI生成
// Legacy: merge_modified_with_control() → New: PhiBuilderBox::generate_phis()
let mut phi_builder = crate::mir::phi_core::phi_builder_box::PhiBuilderBox::new();
// Phase 26-F: Set BodyLocal filter for PHI generation
phi_builder.set_body_local_filter(body_local_builder);
// Phase 26-F-2: IfBodyLocalMergeBox は phi_builder_box.rs 内で直接使用
let post_snapshots = if let Some(ref else_map) = else_var_map_end_opt {
vec![then_var_map_end.clone(), else_map.clone()]