70 lines
4.4 KiB
Markdown
70 lines
4.4 KiB
Markdown
|
|
# 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<JoinFunction>`
|
|||
|
|
- [ ] ルールは 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… の形で足していく想定だよ。
|