fix(mir): conservative PHI box for If/Loop and Stage1 resolver SSA

This commit is contained in:
nyash-codex
2025-11-18 09:26:39 +09:00
parent fa087eeeea
commit 8b37e9711d
6 changed files with 181 additions and 19 deletions

View File

@ -96,3 +96,20 @@ Status: planning構造バグ切り出しフェーズ・挙動は変えない
- 小さいテストを書く → verifier で赤を出す → LoopBuilder / IfForm / MirBuilder を直す → 緑になるまで繰り返す。
- これにより、StageB / Stage1 / selfhost の土台となる Rust MIR 層が安定し、その上に Nyash selfhost 側の MirBuilder を載せやすくする。
- なお、StageB 最小ハーネス(`stageb_min_sample.hako`については、Rust MIR builder 経由の直接 VM / MIR verify は既に緑であり、残っている stack overflow は `compiler_stageb.hako` 側の Nyash ボックス連鎖に起因するものと考えられる。Rust 層では `emit_unified_call` / BoxCall / legacy 警戒の再入防止フラグと再帰深度カウンタを導入済みであり、以降は Nyash 側に浅い再帰ガードを置いて原因ボックスを特定するフェーズへ引き継ぐ。
### 実績メモConservative PHI Box 完了)
- IfForm / LoopForm v2 の PHI 生成は「Conservative PHI Box」実装により根治済み:
- If については `merge_modified_vars``src/mir/builder/phi.rs`)が **全変数の union に対して PHI を張る保守的実装**に切り替わり、
- 片側の branch でしか定義されない変数(`then` のみ / `else` のみ)についても、
- pre_if スナップショットまたは `const void` を使った安全な SSA 定義に統一。
- Loop については LoopForm v2`LoopFormBuilder`)側で header/exit PHI の扱いを整理し、
- Carrier / Pinned / Invariant に分離したうえで exit PHI から `variable_map` を一貫して再束縛する構造に寄せた。
- Box 理論の観点では:
- Conservative Box: まず「安全側」に全変数に PHI を張る(正しさ優先)。
- Elimination Box: 将来の最適化フェーズで、使われない PHI を削る(効率最適化)。
- この Conservative PHI 実装により、Stage1 using resolver 一式の代表テスト:
- `mir_parserbox_parse_program2_harness_parses_minimal_source`
- `mir_stage1_using_resolver_min_fragment_verifies`
- `mir_stage1_using_resolver_full_collect_entries_verifies`
がすべて緑になっており、「片側 branch だけで定義された変数の nondominating use」系のバグは Rust 側では止血済み。***