# Phase‑31.3 — Selfhost LoopForm 実装計画(Hakorne Script) 目的 - Rust 側で安定化した LoopFormBox(ヘッダ/条件/ボディ/ラッチ/出口の正規形)を、Selfhost(Hakorne Script)にも導入し、IR/MIR/VM の“ループの顔”を一本化する。 - PHI の生成位置・支配関係・continue/break の意味論をドキュメント+スモークで固定し、Fail‑Fast を徹底する。 範囲 - Selfhost VM/Builder/Emitter の最小セット(while/continue/break/if 内分岐)。 - 依存箱(LoopCarrierAnalyzerBox, PhiBuilderBox, LoopTraceBox)の薄実装または委譲。 - LLVM ハーネスはパリティ確認のみ(機能追加なし)。 非対象(本フェーズ外) - for/foreach 糖衣の拡張(次期) - 例外伝播/try‑finally のループ内整合(次期) 受け入れ基準(Definition of Done) - MIR 形状 - Loop は Header/Cond/Body/Latch/Exit を持つ単純 CFG に正規化。 - PHI はブロック先頭のみ。Exit の ret 値は Exit 内定義または Exit‑PHI を必須。 - 継続/脱出 - continue は Latch に、break は Exit にジャンプ。PHI 入力は continue/break を統合。 - Fail‑Fast - 未定義のレガシー命令(BoxCall/ExternCall/NewBox/Print/旧Loop 等)は Verifier が拒否。 - パリティ - VM↔LLVM で代表ループ(while/continue/break/分岐)出力が一致(数本)。 - スモーク - quick/integration で緑(Loop 関連)。MIR スナップショットで PHI 形状を固定。 参考(最小 MIR 形状スナップショット) ``` { "functions": [ { "name": "main", "blocks": [ {"id": 0, "instructions": [ {"op":"jump", "target": 1} ]}, {"id": 1, "instructions": [ {"op":"phi", "dst": 10, "values": [{"block":0,"value":1},{"block":2,"value":11}]}, {"op":"branch", "cond": 3, "then": 2, "else": 3} ]}, {"id": 2, "instructions": [ {"op":"jump", "target": 1} ]}, {"id": 3, "instructions": [ {"op":"phi", "dst": 20, "values": [{"block":1,"value":10},{"block":2,"value":12}]}, {"op":"ret", "value": 20} ]} ] } ] } ``` 要点 - ヘッダ/Exit の先頭にのみ `op:"phi"` が現れる。 - `ret.value` は Exit 内で定義された `dst`(例では `20`)を参照する。 進め方(小さく段階導入) - P1: LoopFormBox の最小実装(構造生成+Exit‑PHI 生成) - P2: continue/break の値スナップショット統合+if 内分岐の merge 処理 - P3: Verifier 強化(Exit 支配/PHI 先頭限定/Latch→Header のみ許可) - P4: Selfhost Compiler への接続(while 糖衣→LoopForm 降下)+ Env Gate 撤退(既定ON) 関連ドキュメント - call 統一: `docs/reference/mir/call-unified.md` - 旧ループ撤退: `docs/private/roadmap/phases/phase-31.2/`