2.7 KiB
2.7 KiB
PLAN — Selfhost LoopForm 実装(Phase‑31.3)
0. 背景と狙い
- 既に Rust 側では LoopFormBox を標準化(ヘッダ/条件/ボディ/ラッチ/出口)。
- Selfhost 側も同形へ統一し、MIR 形状・Verifier・VM/LLVM パリティを一本化する。
1. 要件(技術)
- 形状: Header → Cond → Branch(Body/Exit), Body → Latch → Header, Exit → ret
- PHI: ブロック先頭のみ。Exit‑PHI は break/正常脱出の統合。
- continue: Latch へ。break: Exit へ。いずれも値スナップショットを Exit‑PHI 入力に追加。
- ret 支配: ret が参照する値は Exit 内定義 or Exit‑PHI(Fail‑Fast)。
2. 箱設計(箱言語)
- LoopFormBox
new(preheader_bb) -> LoopFormBoxbuild_loop(loop_builder, condition, preheader_vars, body) -> LoopStructure
- LoopStructure
header_bb, condition_bb, body_bb, latch_bb, exit_bb
- 依存 / 委譲
- LoopCarrierAnalyzerBox: ループキャリア変数(preheader∩body assigns)検出
- PhiBuilderBox: Exit‑PHI の一元生成
- LoopTraceBox: 最小トレース
3. 実装ステップ
- P1: 構造だけ(Exit‑PHI 生成まで)。continue/break は Latch/Exit へジャンプのみ。
- P2: continue/break のスナップショット統合。if 内分岐の merge 処理(then/else から merge へ)。
- P3: Verifier 強化(Exit 支配/PHI先頭限定/許可エッジ)+ MIR スナップショットテスト。
- P4: Selfhost Compiler(while 糖衣)の降下・接続。Gate 撤退(既定ON)。
4. 失敗時方針(Fail‑Fast)
- 形状破れ(ヘッダ/ラッチ/出口欠落): 検出時に即エラー。
- PHI 不正(先頭以外/Incoming 欠落): Verifier で拒否。
- continue/break の未設定(latch/exit 無): 検出時に即エラー。
5. ENV/Gate(開発用)
HAKO_USE_LOOPFORM_BOX=1(既定ON)HAKO_VERIFY_PHI_STRICT=1(dev/profile 限定)HAKO_LOOP_TRACE=1(最小トレース)
6. テスト(最低限)
- quick
- while 最小: 0→5 加算、最終結果
- continue: 3 をスキップ
- break: 3 で脱出
- if 内分岐+continue/break 混在
- MIR スナップショット: Exit‑PHI 形状、ret 値支配
- integration
- VM↔LLVM パリティ: while/continue/break の代表
7. ロールアウト
- dev で Gate ON(既定)。quick/integration 緑維持で既定ON継続。
- 旧レガシー撤退済(31.2)。影響点は Selfhost 側のみ。
8. リスクと対策
- 例外/throw が導入された後の整合 → 次フェーズで try‑finally ガードを設計。
- ループ内に複数の return → 現行仕様は Exit 統一。早期 return は禁止または正規化で Exit へ統一。