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:
@ -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()]
|
||||
|
||||
Reference in New Issue
Block a user