feat(mir): Phase 25.1g完了 - ControlForm導線追加(Rust側)

**実装内容**:
-  Task G-1: If PHI wrapper (`merge_modified_with_control`) 追加
-  Task G-2: Exit PHI wrapper (`build_exit_phis_for_control`) 追加
-  既存実装へのTODO/NOTEコメント追加(将来の統合導線確立)

**変更ファイル**:
- src/mir/phi_core/if_phi.rs: merge_modified_with_control() 追加
- src/mir/phi_core/loopform_builder.rs: build_exit_phis_for_control() 追加
- src/mir/loop_builder.rs: TODO/NOTEコメント追加(2箇所)

**テスト結果**:
-  mir_stage1_using_resolver_min_fragment_verifies
-  mir_stage1_using_resolver_full_collect_entries_verifies
-  mir_stageb_loop_break_continue (2 tests)
-  mir_loopform_exit_phi (4 tests)
- ⚠️ test_stageb_min.sh Test2は既知の問題(Phase 25.1g前から)

**設計方針**:
- Thin wrapper pattern: ControlFormを受け取り既存実装に委譲
- 挙動変更なし: SSA/PHI生成ロジックは完全に既存のまま
- 観測のみ: NYASH_IF_TRACE/NYASH_LOOPFORM_DEBUGでControlForm使用をログ
- 段階移行準備: 将来の統合時に切り替え導線が明確

🤖 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-18 19:05:46 +09:00
parent d3cbc71c9b
commit 67ee87be80
3 changed files with 98 additions and 0 deletions

View File

@ -368,6 +368,10 @@ impl<'a> LoopBuilder<'a> {
// Exit block
self.set_current_block(exit_id)?;
// NOTE(25.1g+): ControlForm 統合後は build_exit_phis_for_control(...) 経由で
// LoopShape から exit_id/branch_source_block を決める導線に寄せる予定。
// 現在は既存実装のまま(挙動変更なし)。
// Build exit PHIs for break statements
let exit_snaps = self.exit_snapshots.clone();
loopform.build_exit_phis(self, exit_id, branch_source_block, &exit_snaps)?;
@ -1176,6 +1180,10 @@ impl<'a> LoopBuilder<'a> {
// Reset to pre-if snapshot, then delegate to shared helper
self.parent_builder.variable_map = pre_if_var_map.clone();
let mut ops = Ops(self);
// TODO(25.1g+): ControlForm 統合版に切り替えるときは、
// IfShape から ControlForm を渡して merge_modified_with_control() を呼ぶ。
// 現在は既存実装のまま(挙動変更なし)。
crate::mir::phi_core::if_phi::merge_modified_at_merge_with(
&mut ops,
merge_bb,