# Current Task — JoinIR / PHI 削減スナップショット(2025-11-29 時点) > このファイルは「今どこまで終わっていて、次に何をやるか」を 1000 行以内でざっくり把握するためのスナップショットだよ。 > 過去の詳細ログは `docs/private/roadmap2/CURRENT_TASK_2025-11-29_full.md` や各 Phase の README/TASKS を見てね。 --- ## 0. 現在地ざっくり - **JoinIR ライン** - Phase 27–31: Loop→JoinIR lowering(skip_ws / trim / append_defs / Stage‑1 minimal)で、ループの制御構造を関数+継続だけで表現できることを実証済み。 - Phase 33–34: IfSelect / IfMerge / JoinIR Frontend(If/Loop/Break/Continue)実装。AST→JoinIR→MIR→VM まで tiny ケースが通る。 - **PHI 削減ライン** - Phase 35–36: HIGH/MEDIUM 安全度の PHI 箱(if_body_local_merge / phi_invariants / LoopSnapshotMergeBox)の削除・縮退で 537 行削減。 - Phase 37–40: If 側 PHI(if_phi.rs / conservative.rs)の Level 1/2 相当まで設計+一部削減。array_ext.filter については JoinIR Frontend + JoinFuncMeta に移行し、collect_assigned_vars を削除済み。 - **これから** - Phase 41: If 側 PHI Level 3(本体ロジック)の代表ケースを JoinIR 経路に載せる設計と最初の実装。 - 以降: If 側 PHI 本体削減 → Classifier Trio → AST→JoinIR Frontend 本線化 → LLVM / ny-llvmc の JoinIR 統合。 --- ## 1. 最近の主戦場(Phase 33–41) ### 1-00a. Phase 33 — IfSelect / IfMerge + PHI 設計原則 - IfSelect / IfMerge lowering 実装(simple/local, 2–3 変数パターン)。 - VM ラインへの If lowering ドライランを `IfLoweringDryRunner` に箱化し、VM パイプラインと解析ロジックを分離。 - 「JoinIR は PHI 生成器(SSOT)、既存 PHI の変換器にはしない」原則をコード+docs で固定。 - docs: `docs/private/roadmap2/phases/phase-33-joinir-if-phi-cleanup/if_joinir_design.md` ### 1-00b. Phase 34 — JoinIR Frontend(AST→JoinIR) - 目的: AST(Program JSON v0)→ JoinIR Frontend を設計・実装し、「PHI 意味論の SSOT を JoinIR 側に寄せる」。 - 実績: - If: simple/local/json_shape パターンを Select に正規化(同じ JoinIR 出力)。 - Loop: tiny while / break / continue を 3 関数構造(entry/loop_step/k_exit)+ Jump/Call/Select で表現。 - MethodCall: substring などを JoinInst::MethodCall として構造化し、JoinIR→MIR Bridge で BoxCall に変換。 - docs: `docs/private/roadmap2/phases/phase-34-joinir-frontend/README.md` ### 1-00c. Phase 35–36 — PHI 箱削減(HIGH/MEDIUM) - Phase 35(HIGH): - `if_body_local_merge.rs` / `phi_invariants.rs` 削除(合計 430 行)。 - PHI_BOX_INVENTORY.md で PHI 箱の一覧と削除順を整理。 - Phase 36(MEDIUM): - LoopSnapshotMergeBox を「Exit PHI マージ専用の純粋静的ユーティリティ」に縮退(470→363 行)。 - PhiBuilderBox に Loop/If/Common/Stub の責務マーカー追加(実装本体削減は Phase 38+)。 - docs: - `docs/private/roadmap2/phases/phi-reduction-series/INDEX.md` - `docs/private/roadmap2/phases/phase-36-phi-midrange/README.md` ### 1-00d. Phase 37–39 — If 側 PHI Level 1/2 設計と準備 - Phase 37: If 側 PHI 全体設計(docs-only)。 - if_phi.rs / conservative.rs の責務表、12 callsite の難易度分類。 - 削除基準(Level 1/2/3)の定義。 - Phase 38: if_phi.rs Level 1 削除(90 行)。 - `merge_modified_with_control`(dead code)と `extract_assigned_var`(JoinIR AST lowering で代替)を削除。 - Phase 39: Level 2 準備(array_ext.filter 選定と JoinIR 拡張設計)。 - array_ext.filter を代表 if-in-loop パターンに選定。 - JoinIR Frontend / JoinFuncMeta / Bridge 拡張と削除条件を設計。 - docs: - `docs/private/roadmap2/phases/phase-37-if-phi-reduction/README.md` - `docs/private/roadmap2/phases/phase-38-if-phi-level1/README.md` - `docs/private/roadmap2/phases/phase-39-if-phi-level2/README.md` ### 1-00e. Phase 40 — If 側 PHI Level 2 実装(array_ext.filter) - 目的: array_ext.filter の if‑in‑loop PHI を JoinIR Frontend + JoinFuncMeta + Bridge 経由に移し、collect_assigned_vars を削除する。 - 実績: - JoinFuncMeta / JoinFuncMetaMap / convert_join_module_to_mir_with_meta 実装。 - AST→JoinIR Frontend で if‑in‑loop の modified 変数集合を解析し、JoinIR→MIR Bridge で PHI 生成。 - loop_builder.rs に HAKO_JOINIR_ARRAY_FILTER 経路を追加し、Route B(JoinIR 経路)をデフォルト化。 - `collect_assigned_vars` を削除し、JSON ベースの `collect_assigned_vars_via_joinir` に置き換え(Phase 40-4.1)。 - デッドな env フラグ等をクリーンアップ(40-4.1.1)。 - 削減実績(Phase 40 時点): - 35 行(collect_assigned_vars)+16 行(デッドコード)= 51 行純減。 - docs: - `docs/private/roadmap2/phases/phase-40-if-phi-level2/README.md` - `docs/private/roadmap2/phases/phi-reduction-series/INDEX.md` ### 1-00f. Phase 41 — If-Side PHI Level 3 Reduction Planning - 目的: - if_phi.rs / conservative.rs に残る「Level 3 本体ロジック」を JoinIR 経路に移すための設計と代表ケース実装の入口を定義。 - **Phase 41-1 完了(2025-11-29)**: - ✅ Level 3 関数の再インベントリ・callsite 再分類完了 - ✅ デッドコード 147 行削除(ボーナス) - `merge_modified_at_merge_with` (70行) - `merge_with_reset_at_merge_with` (29行) - `get_conservative_values` (48行) - ✅ README.md に Level 3 Callsite Overview 追加 - 次: - Phase 41-2: 代表 If 関数選定(nested if / selfhost parser) - Phase 41-3: JoinIR Frontend / Bridge 拡張設計 - Phase 41-4: A/B 実装 & テスト - docs: - `docs/private/roadmap2/phases/phase-41-if-phi-level3/README.md` - `docs/private/roadmap2/phases/phase-41-if-phi-level3/TASKS.md` --- ## 2. 中期 TODO(ざっくり) - **If 側 PHI Level 2 残り** - compute_modified_names / merge_with_reset_at_merge_with / conservative.rs struct を JoinIrConservativeAnalyzer + JoinIR Verifier 側に寄せる実装(Phase 40-4.2〜)。 - **If 側 PHI Level 3** - Phase 41 で選ぶ代表 If 関数について JoinIR Frontend + Bridge で Route B を実装し、A/B テストを通す。 - その後、if_phi.rs / conservative.rs から該当パターン分のコード削減を検討(Phase 42)。 - **Classifier Trio** - LoopVarClassBox / LoopExitLivenessBox / LocalScopeInspectorBox を LoopScopeShape に吸収し、JoinIR lowering / LoopForm 側から直接 LoopScopeShape を見る構造に整理(Phase 39 計画の後続)。 --- ## 3. 旧フェーズ(過去ログへのポインタ) 古いフェーズの詳細な経緯やログは、以下のドキュメントと `docs/private/roadmap2/CURRENT_TASK_2025-11-29_full.md` を見てね。 - Phase 21.7 — Static Box Methodization - StaticMethodId / NamingBox で BoxName.method/arity 名前解決の SSOT 化。 - docs: `docs/development/current/main/phase-21.7-naming-ssot-checklist.md` など。 - Phase 25.x / 26.x — LoopForm v2 / LoopSSA v2 / Exit PHI / ExitLiveness - LoopForm v2 / LoopSSA v2 の整備と Exit PHI / ExitLiveness まわりの 4 箱構成。 - Phase 27–32 — JoinIR 初期実験〜汎用化 - LoopToJoinLowerer / LoopScopeShape / JoinIR VM Bridge を minimal ケースから Stage‑1 / Stage‑B へ広げていくライン。 - docs: `docs/private/roadmap2/phases/phase-27-joinir*`, `phase-31-looptojoin-lowerer`, `phase-32-joinir-complete-migration` など。 CURRENT_TASK.md 自体は「いまどこを触っているか」と「次に何をやるか」を 1 画面で把握できる軽さを維持する方針だよ。***