feat(phi): Option C実装完了 - 箱理論でPHI bug根本修正 + 完全共通化
🎯 **Option C - Box-First Design** **新規Box追加(2ファイル)**: - LocalScopeInspectorBox: 変数定義位置追跡(280行、13テスト) - LoopVarClassBox: 変数分類(Pinned/Carrier/BodyLocalExit/BodyLocalInternal)(220行、10テスト) **統合完了(3ファイル)**: - loop_snapshot_merge.rs: merge_exit_with_classification() でOption C分類適用 - loopform_builder.rs: build_exit_phis() でinspector統合、完全共通化達成 - loop_.rs (JSON Bridge): 重複コード削除、共通化された実装を使用 **技術的成果**: ✅ 266テスト通過(既存機能に影響なし) ✅ BodyLocalInternal変数の正しい分類(exit PHI生成スキップ) ✅ JSON/AST両経路の完全共通化(重複コード根絶) ✅ is_available_in_all() でPHI pred mismatch防止 **残課題**: - mir_funcscanner_skip_ws: 1テストのみ失敗(別変数で問題継続中) - 次: __mir__.log() でのトレース + 詳細調査 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -327,24 +327,15 @@ pub(super) fn lower_loop_stmt(
|
||||
loopform.seal_phis(&mut ops, latch_bb, &canonical_continue_snaps)?;
|
||||
|
||||
// 8) exit PHI(header fallthrough + break スナップショット)
|
||||
// Option C: Build LocalScopeInspectorBox from exit snapshots
|
||||
// Option C: Create inspector (build_exit_phis will populate it)
|
||||
use crate::mir::phi_core::local_scope_inspector::LocalScopeInspectorBox;
|
||||
let mut inspector = LocalScopeInspectorBox::new();
|
||||
|
||||
// Record header variable definitions (pinned + carriers)
|
||||
for pinned in &loopform.pinned {
|
||||
inspector.record_definition(&pinned.name, loopform.header_id);
|
||||
}
|
||||
for carrier in &loopform.carriers {
|
||||
inspector.record_definition(&carrier.name, loopform.header_id);
|
||||
}
|
||||
|
||||
// Record all variable definitions from exit snapshots
|
||||
for (block_id, snapshot) in &exit_snaps {
|
||||
inspector.record_snapshot(*block_id, snapshot);
|
||||
}
|
||||
|
||||
loopform.build_exit_phis(&mut ops, exit_bb, cend, &exit_snaps, &inspector)?;
|
||||
// build_exit_phis() now handles all inspector setup internally:
|
||||
// - Records pinned/carrier definitions in header
|
||||
// - Records filtered exit snapshots
|
||||
// - Records header snapshot if it's an exit predecessor
|
||||
loopform.build_exit_phis(&mut ops, exit_bb, cend, &exit_snaps, &mut inspector)?;
|
||||
|
||||
Ok(exit_bb)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user