# Phase 26-H — JoinIR / 関数正規化 タスクチェックリスト このフェーズは「設計+ミニ実験」専用だよ。本線のスモーク/CI は既存の MIR/LoopForm 経路のまま維持しつつ、関数正規化(JoinIR/LoopFnIR)の足場を小さく固めることをゴールにする。 ## A. 設計ドキュメントまわり - [ ] A-1: join-ir 設計の骨格を固める - [ ] `docs/development/architecture/join-ir.md` に: - [ ] 命令セット(`call`, `ret`, 必要なら `jump`)の最小定義を明記する - [ ] if / loop / break / continue / return → JoinIR の変換規則を列挙する - [ ] φ = 関数引数 / merge = join 関数 / loop = 再帰 + exit 継続 の対応表を書く - [ ] 26-H で「実装として本当に増やす箱」と、「概念ラベルとしてだけ残す箱」を分けてコメントしておく - [ ] A-2: 26-H フェーズ README の整備 - [ ] `docs/development/roadmap/phases/phase-26-H/README.md` に: - [ ] 現在の箱群(LoopForm/PHI/解析系)の棚卸し - [ ] 最終的に残したい箱セット(LoopForm 前段 + LoopFnIR/JoinIR + 最小解析箱)を 1 セクションでまとめる - [ ] 「このフェーズでは設計+ミニ実験のみ、本線は既存ルート」というスコープ/制限を明記する ## B. JoinIR 型・変換の最小実装 - [ ] B-1: JoinIR 型定義ファイルの追加 - [ ] `src/mir/join_ir.rs` を追加し、以下を定義する(最小限でOK): - [ ] `JoinFunction`(名前・引数・ブロック一覧) - [ ] `JoinBlock`(ラベルと命令列) - [ ] `JoinInst`(call/ret などのバリアント) - [ ] `Debug`/`Display` などダンプに必要な実装だけ付ける(最初は `Debug` だけでも可) - [ ] B-2: LoopForm→JoinIR ミニ変換関数(1ケース用) - [ ] まずは **汎用変換ではなく、特定の小関数だけを対象にした試験的関数** を 1つ実装する: - 例: `fn lower_simple_loop_to_joinir(mir: &MirModule, func_name: &str) -> Option` - [ ] ルールは join-ir.md の「Loop→step/k_exit」変換に従って手作業気味でよい(このフェーズでは general solution を目指さない) ## C. 最小 .hako + テスト(カナリア) - [ ] C-1: 最小 JoinIR 用 .hako を追加 - [ ] `apps/tests/joinir_min_loop.hako`(例)を作成: - 例: `static box JoinIrMin { main() { var i = 0; loop(i < 3) { if i >= 2 { break } i = i + 1 } return i } }` - [ ] C-2: Rust テストで MIR→JoinIR ダンプを確認 - [ ] `src/tests/mir_joinir_min.rs`(仮ファイル)を追加し: - [ ] 上記 .hako を AST→MIR までコンパイル - [ ] `lower_simple_loop_to_joinir` を呼んで `JoinFunction` を生成 - [ ] `eprintln!("{:?}", join_fn)` などで形を確認(当面は assert よりも形の手動確認を重視) - [ ] テストは **デフォルト ON でも軽い** ことを確認(重ければ `#[ignore]` + 手動実行でもOK) ## D. トグル付き実験フック - [ ] D-1: 実験用トグルの追加 - [ ] `NYASH_JOINIR_EXPERIMENT=1` のときだけ JoinIR ダンプを有効にするパスを Runner 側に追加する(例: `--debug-joinir-min` に相乗りでも可) - [ ] トグル OFF のときは既存の MIR/LoopForm 経路しか走らないことを確認する ## E. ループ/PHI ラインとの関係メモ - [ ] E-1: 「どの箱が将来 JoinIR に吸収されるか」を一覧にする - [ ] `loopform_ssot.md` か 26-H README に: - [ ] Header/Exit PHI まわりの箱で、JoinIR 導入後に **不要or縮退** するもの - [ ] LoopForm / ControlForm は「前段の構造箱」として残すもの - [ ] 解析系(LoopVarClassBox / LoopExitLivenessBox など)のうち、JoinIR 後も必要なもの を簡易な表にして残す - [ ] E-2: 「今はここまで、27.x でここまで」を線引きする - [ ] 26-H のスコープ: 設計+最小 JoinIR ダンプ - [ ] 27.x 候補: JoinIR 経由で 1〜2 個の本番ループ(FuncScanner/Stage-B)を通す、PHI/ExitLiveness の一部を JoinIR 側に移す --- このファイルは「26‑H でやることを一覧で見たいときのチェックリスト」として使ってね。 タスクが増えたら、このファイルに A/B/C… の形で足していく想定だよ。