2025-11-28 12:02:52 +09:00
|
|
|
|
# Current Task — JoinIR / PHI 削減スナップショット(2025-11-29 時点)
|
2025-11-15 00:02:13 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
> このファイルは「今どこまで終わっていて、次に何をやるか」を 1000 行以内でざっくり把握するためのスナップショットだよ。
|
2025-11-28 12:02:52 +09:00
|
|
|
|
> 過去の詳細ログは `docs/private/roadmap2/CURRENT_TASK_2025-11-29_full.md` や各 Phase の README/TASKS を見てね。
|
2025-11-15 05:42:32 +09:00
|
|
|
|
|
2025-11-15 00:02:13 +09:00
|
|
|
|
---
|
|
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
## 0. 現在地ざっくり
|
2025-11-13 16:40:58 +09:00
|
|
|
|
|
2025-11-28 12:02:52 +09:00
|
|
|
|
- **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`
|
|
|
|
|
|
|
2025-11-28 17:13:52 +09:00
|
|
|
|
### 1-00f. Phase 41 — If-Side PHI Level 3 Reduction ✅ 完了(2025-11-28)
|
2025-11-28 12:02:52 +09:00
|
|
|
|
|
|
|
|
|
|
- 目的:
|
2025-11-28 17:13:52 +09:00
|
|
|
|
- if_phi.rs / conservative.rs に残る「Level 3 本体ロジック」を JoinIR 経路に移すための設計と代表ケース実装。
|
|
|
|
|
|
- 実績:
|
|
|
|
|
|
- Level 3 関数の再インベントリとデッドコード 147 行削除。
|
|
|
|
|
|
- 代表 If 関数として `ParserControlBox.parse_loop()` を選定。
|
|
|
|
|
|
- NestedIfMerge JoinInst 設計+実装(mod.rs, json.rs)。
|
|
|
|
|
|
- AST→JoinIR Frontend に `lower_nested_if_pattern()` 追加(dev flag: `HAKO_JOINIR_NESTED_IF=1`)。
|
|
|
|
|
|
- JoinIR→MIR Bridge に NestedIfMerge 展開ロジック追加(多段 Branch + Copy)。
|
|
|
|
|
|
- Route B(NestedIfMerge 経由)の A/B テスト 7 ケース全 PASS(parse_loop 代表ケース)。
|
|
|
|
|
|
- 実削除(if_phi.rs / conservative.rs 本体の縮退・削除)は Phase 42 に繰り越し。
|
2025-11-28 12:02:52 +09:00
|
|
|
|
- docs:
|
|
|
|
|
|
- `docs/private/roadmap2/phases/phase-41-if-phi-level3/README.md`
|
|
|
|
|
|
- `docs/private/roadmap2/phases/phase-41-if-phi-level3/TASKS.md`
|
|
|
|
|
|
|
2025-11-28 17:13:52 +09:00
|
|
|
|
### 1-00g. Phase 45 — read_quoted_from JoinIR 実装 ✅ 完了(2025-11-28)
|
|
|
|
|
|
|
|
|
|
|
|
- 目的:
|
|
|
|
|
|
- `MiniJsonCur.read_quoted_from(s, pos)` を JoinIR Frontend/Bridge で実装し、Guard if + Loop with break + accumulator パターンの PHI 削減を実証。
|
|
|
|
|
|
- 実績:
|
|
|
|
|
|
- **45-1**: フィクスチャ `apps/tests/phase45_read_quoted_fixture.hako` 作成(T1-T4 Route A で PASS)。
|
|
|
|
|
|
- **45-2**: AST→JoinIR Frontend `lower_read_quoted_pattern()` 実装(`ast_lowerer.rs`)。
|
|
|
|
|
|
- **45-3**: JoinIR→MIR Bridge 確認(既存 bridge で変更不要)。
|
|
|
|
|
|
- **45-4**: Route B E2E テスト `test_read_quoted_from_route_b_e2e()` 追加、T1-T4 全 PASS。
|
|
|
|
|
|
- **45-5**: PHI_BOX_INVENTORY.md / CURRENT_TASK.md 更新。
|
|
|
|
|
|
- 既知の制限:
|
|
|
|
|
|
- **T5(エスケープ処理)**: 変数再代入 inside if-block が PHI を生成しない問題 → **Phase 46 で解決済み**。
|
|
|
|
|
|
- Dev Flag: `HAKO_JOINIR_READ_QUOTED=1`
|
|
|
|
|
|
- JoinIR 構造: entry → k_guard_fail / loop_step → k_exit(4 関数構造)
|
|
|
|
|
|
- docs:
|
|
|
|
|
|
- `docs/private/roadmap2/phases/phase-30-final-joinir-world/PHI_BOX_INVENTORY.md` (Phase 45 セクション)
|
|
|
|
|
|
|
|
|
|
|
|
### 1-00h. Phase 46 — IfMerge 拡張(ループ内 if での変数再代入 PHI 問題)✅ 完了(2025-11-28)
|
|
|
|
|
|
|
|
|
|
|
|
- 目的:
|
|
|
|
|
|
- ループ内の `if (cond) { x = expr; }` パターンで、if-body での変数再代入が merge ブロックで PHI に反映されない問題を修正。
|
|
|
|
|
|
- 実績:
|
|
|
|
|
|
- **46-1**: 現状 MIR の問題点を CFG 図で固定(T5 専用)。
|
|
|
|
|
|
- **46-2**: JoinIR レベルでの「正しい形」を IfMerge で設計(Option A 採用)。
|
|
|
|
|
|
- **46-3**: `lower_read_quoted_pattern()` に IfMerge 拡張を設計・実装。
|
|
|
|
|
|
- **46-4**: Route B E2E テスト T1-T5 全 PASS。
|
|
|
|
|
|
- テスト結果:
|
|
|
|
|
|
- T1-T4: ✅ PASS(Phase 45 と同じ)
|
|
|
|
|
|
- **T5(エスケープ処理)**: ✅ PASS(`"a\"b"` → `a"b`)
|
|
|
|
|
|
- Dev Flag: `HAKO_JOINIR_READ_QUOTED_IFMERGE=1`(Phase 46 IfMerge 拡張有効化)
|
|
|
|
|
|
- 修正ファイル:
|
|
|
|
|
|
- `src/mir/join_ir/frontend/ast_lowerer.rs`: IfMerge による escape 処理追加
|
|
|
|
|
|
- `src/mir/join_ir_vm_bridge.rs`: T5 テストケース追加
|
|
|
|
|
|
- docs:
|
|
|
|
|
|
- `docs/private/roadmap2/phases/phase-46-ifmerge-loop-reassign/README.md`
|
|
|
|
|
|
|
2025-11-28 12:02:52 +09:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 2. 中期 TODO(ざっくり)
|
|
|
|
|
|
|
2025-11-28 17:13:52 +09:00
|
|
|
|
- **Phase 42: PHI Workaround 条件付きスキップ** ✅ 完了(2025-11-28)
|
|
|
|
|
|
- ✅ 42-1: PHI workaround 内容の文書化完了(README.md に記録)
|
|
|
|
|
|
- ✅ 42-2: `parser_control_box.hako:85-139` に条件付きスキップ実装
|
|
|
|
|
|
- Route A(default): workaround 使用(後方互換性維持)
|
|
|
|
|
|
- Route B(`HAKO_JOINIR_NESTED_IF=1`): workaround スキップ
|
|
|
|
|
|
- Route B テスト 3/3 PASS、Route A テスト 13/13 PASS
|
|
|
|
|
|
- ✅ 42-3: callsite 再分析・Phase 43 候補リスト作成完了
|
|
|
|
|
|
- if_phi.rs: 4残存関数(全て parse_loop 以外からも呼ばれる)
|
|
|
|
|
|
- conservative.rs: ConservativeMerge::analyze が phi_merge.rs/phi.rs から使用中
|
|
|
|
|
|
- Phase 43 推奨: NestedIfMerge 適用範囲拡大 → phi_merge.rs JoinIR 移行
|
|
|
|
|
|
- docs: `docs/private/roadmap2/phases/phase-42-if-phi-level3-removal/README.md`
|
|
|
|
|
|
- **Phase 43+: If 側 PHI 本体削除**
|
|
|
|
|
|
- if_phi.rs / conservative.rs の残存関数は全て parse_loop 以外からも呼ばれている
|
|
|
|
|
|
- 他の関数(print_tokens 等)も JoinIR 経路に乗せてから本体削除
|
2025-11-28 12:02:52 +09:00
|
|
|
|
- **Classifier Trio**
|
2025-11-28 17:13:52 +09:00
|
|
|
|
- LoopVarClassBox / LoopExitLivenessBox / LocalScopeInspectorBox を LoopScopeShape に吸収し、JoinIR lowering / LoopForm 側から直接 LoopScopeShape を見る構造に整理。
|
2025-11-28 12:02:52 +09:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 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 画面で把握できる軽さを維持する方針だよ。***
|