# 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) -> LoopFormBox` - `build_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 へ統一。