Files
hakorune/CURRENT_TASK.md
nyash-codex d3eff1fceb feat(joinir): Phase 45-46 read_quoted_from IfMerge implementation
Phase 45: read_quoted_from JoinIR Frontend/Bridge
- Implement lower_read_quoted_pattern() for Guard if + Loop with break + accumulator pattern
- Add T1-T4 Route B E2E tests (all PASS)
- Create phase45_read_quoted_fixture.hako for Route A testing

Phase 46: IfMerge extension for loop-internal if-body reassignment
- Add escape handling: if ch == "\\" { i = i+1; ch = s.substring(...) }
- Use IfMerge to merge i and ch after if-body (speculative execution)
- T5 PASS: "a\"b" → 'a"b' (escape handling works!)

Dev flags:
- HAKO_JOINIR_READ_QUOTED=1: Enable Phase 45 JoinIR route
- HAKO_JOINIR_READ_QUOTED_IFMERGE=1: Enable Phase 46 IfMerge escape handling

Test results (Route B):
- T1: "abc" → 'abc' 
- T2: "" → '' 
- T3: abc → '' 
- T4: xx"def" → 'def' 
- T5: "a\"b" → 'a"b' 

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 17:13:52 +09:00

173 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Current Task — JoinIR / PHI 削減スナップショット2025-11-29 時点)
> このファイルは「今どこまで終わっていて、次に何をやるか」を 1000 行以内でざっくり把握するためのスナップショットだよ。
> 過去の詳細ログは `docs/private/roadmap2/CURRENT_TASK_2025-11-29_full.md` や各 Phase の README/TASKS を見てね。
---
## 0. 現在地ざっくり
- **JoinIR ライン**
- Phase 2731: Loop→JoinIR loweringskip_ws / trim / append_defs / Stage1 minimalで、ループの制御構造を関数継続だけで表現できることを実証済み。
- Phase 3334: IfSelect / IfMerge / JoinIR FrontendIf/Loop/Break/Continue実装。AST→JoinIR→MIR→VM まで tiny ケースが通る。
- **PHI 削減ライン**
- Phase 3536: HIGH/MEDIUM 安全度の PHI 箱if_body_local_merge / phi_invariants / LoopSnapshotMergeBoxの削除・縮退で 537 行削減。
- Phase 3740: If 側 PHIif_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 3341
### 1-00a. Phase 33 — IfSelect / IfMerge + PHI 設計原則
- IfSelect / IfMerge lowering 実装simple/local, 23 変数パターン)。
- 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 FrontendAST→JoinIR
- 目的: ASTProgram 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 3536 — PHI 箱削減HIGH/MEDIUM
- Phase 35HIGH:
- `if_body_local_merge.rs` / `phi_invariants.rs` 削除(合計 430 行)。
- PHI_BOX_INVENTORY.md で PHI 箱の一覧と削除順を整理。
- Phase 36MEDIUM:
- 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 3739 — 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 の ifinloop PHI を JoinIR Frontend + JoinFuncMeta + Bridge 経由に移し、collect_assigned_vars を削除する。
- 実績:
- JoinFuncMeta / JoinFuncMetaMap / convert_join_module_to_mir_with_meta 実装。
- AST→JoinIR Frontend で ifinloop の modified 変数集合を解析し、JoinIR→MIR Bridge で PHI 生成。
- loop_builder.rs に HAKO_JOINIR_ARRAY_FILTER 経路を追加し、Route BJoinIR 経路)をデフォルト化。
- `collect_assigned_vars` を削除し、JSON ベースの `collect_assigned_vars_via_joinir` に置き換えPhase 40-4.1)。
- デッドな env フラグ等をクリーンアップ40-4.1.1)。
- 削減実績Phase 40 時点):
- 35 行collect_assigned_vars16 行(デッドコード)= 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 ✅ 完了2025-11-28
- 目的:
- 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 BNestedIfMerge 経由)の A/B テスト 7 ケース全 PASSparse_loop 代表ケース)。
- 実削除if_phi.rs / conservative.rs 本体の縮退・削除)は Phase 42 に繰り越し。
- docs:
- `docs/private/roadmap2/phases/phase-41-if-phi-level3/README.md`
- `docs/private/roadmap2/phases/phase-41-if-phi-level3/TASKS.md`
### 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_exit4 関数構造)
- 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: ✅ PASSPhase 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`
---
## 2. 中期 TODOざっくり
- **Phase 42: PHI Workaround 条件付きスキップ** ✅ 完了2025-11-28
- ✅ 42-1: PHI workaround 内容の文書化完了README.md に記録)
- ✅ 42-2: `parser_control_box.hako:85-139` に条件付きスキップ実装
- Route Adefault: 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 経路に乗せてから本体削除
- **Classifier Trio**
- LoopVarClassBox / LoopExitLivenessBox / LocalScopeInspectorBox を LoopScopeShape に吸収し、JoinIR lowering / LoopForm 側から直接 LoopScopeShape を見る構造に整理。
---
## 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 2732 — JoinIR 初期実験〜汎用化
- LoopToJoinLowerer / LoopScopeShape / JoinIR VM Bridge を minimal ケースから Stage1 / StageB へ広げていくライン。
- docs: `docs/private/roadmap2/phases/phase-27-joinir*`, `phase-31-looptojoin-lowerer`, `phase-32-joinir-complete-migration` など。
CURRENT_TASK.md 自体は「いまどこを触っているか」と「次に何をやるか」を
1 画面で把握できる軽さを維持する方針だよ。***