Phase 80/81 Implementation Summary: - Phase 80 (c61f4bc7): JoinIR 本線統一(代表 if/loop) - should_try_joinir_mainline() 等の SSOT ヘルパー実装 - NYASH_JOINIR_CORE=1 で JoinIR→MIR が既定に - Phase 81 (a9e10d2a): selfhost Strict + Fail-Fast - selfhost_build.sh に --core/--strict オプション追加 - 環境変数自動伝播(NYASH_JOINIR_CORE/STRICT) - Phase 82 (93f51e40): JOINIR_TARGETS SSOT 化 - is_loop_lowered_function() テーブル参照統一 Documentation Updates: - docs/private/roadmap2/phases/phase-80-joinir-mainline/README.md - Section 80-2: 実装完了マーク追加 - Section 80-5: commit hash 付きメモ更新 - docs/private/roadmap2/phases/phase-81-joinir-strict/README.md - Section 81-4: Done/TODO チェックボックス更新 - Section 81-4-A: selfhost_build.sh 統合実装詳細追加 - CURRENT_TASK.md - Phase 80/81 完了マーク追加(今後の優先タスク順) - Phase 82 次の焦点として明記 Next Focus: - Phase 82-if-phi-retire: if_phi.rs 削除準備開始
18 KiB
Current Task — JoinIR / PHI 削減スナップショット(2025-11-29 時点)
このファイルは「今どこまで終わっていて、次に何をやるか」を 1000 行以内でざっくり把握するためのスナップショットだよ。
過去の詳細ログはdocs/private/roadmap2/CURRENT_TASK_2025-11-29_full.mdや各 Phase の README/TASKS を見てね。
0. 現在地ざっくり
-
✅ JoinIR ラインは Phase 68 で一旦 Chapter Close!
- Phase 27-67 で JoinIR の「第1章(構造 + PHI + 型ヒント SSOT)」が完了。
- 4つの柱(Structure / Scope / JoinIR / Type Hints)が確立。
- Trio 削除ライン(Phase 70 完了)を経て、wasm/Web デモラインと最適化ラインに分岐。
- 詳細: phase-30-final-joinir-world/README.md
-
最終ゴール
- 制御構造と PHI の意味論は JoinIR(+LoopScopeShape/IfPhiContext 等の薄い箱) に一本化する。
- 実行の SSOT は VM / LLVM ラインとし、JoinIR→MIR→VM/LLVM は「構造 SSOT → 実行 SSOT」への変換として扱う。
- 既存の PHI 箱(if_phi.rs / PhiBuilderBox / conservative.rs / Trio 等)は、JoinIR 側のカバレッジが十分になったところから順に削っていく。
-
Stage-3 parser デフォルトON化(Phase 30.1 完了):
config::env::parser_stage3_enabled()で NYASH_FEATURES=stage3 をSSOT化し、legacy env は明示OFF専用の互換に縮退。 -
JoinIR Strict 着手(Phase 81):
NYASH_JOINIR_STRICT=1で代表パスのフォールバックを禁止(JoinIR失敗は即エラー)。dev/trace は観測のみ継続。 -
これから(Phase 69+)
- wasm/Web デモライン: JoinIR ベースの軽量デモ実装。
- 最適化ライン: JoinIR の最適化パスと LLVM/ny-llvmc 統合。
- Trio 削除ライン: 完了(Phase 70、LoopScopeShape SSOT)
- JoinIR Strict ライン(Phase 81): 代表 If/Loop/VM ブリッジについては
NYASH_JOINIR_STRICT=1で常に JoinIR 経路のみを通すようにし、レガシー if_phi / LoopBuilder / 旧 MIR Builder は「未対応関数専用」に縮退。
1. JoinIR 第1章完了までの道のり(Phase 33–67 簡潔版)
Phase 33-62: 構造 + PHI + スコープの基盤構築 ✅ 完了
- Phase 33-34: IfSelect/IfMerge lowering 実装、AST→JoinIR Frontend 設計・実装(If/Loop/Break/Continue)
- Phase 35-36: PHI 箱削減 HIGH/MEDIUM(537行削減: if_body_local_merge / phi_invariants / LoopSnapshotMergeBox 縮退)
- Phase 37-40: If 側 PHI Level 1/2(設計+array_ext.filter 移行、collect_assigned_vars 削除)
- Phase 41-46: If 側 PHI Level 3(NestedIfMerge、read_quoted_from、IfMerge 拡張)
- Phase 49-56: JoinIR Frontend 本線統合(print_tokens / filter)
- Phase 57-62: If 側 PHI 本体削減(conservative.rs 縮退、If Handler 箱化、PHI Core Cleanup)
詳細: 各 Phase の README を参照(docs/private/roadmap2/phases/phase-*/README.md)
Phase 63-67: 型ヒントライン完全実装 ✅ 完了(2025-11-30)
Phase 63-3: JoinIR 型ヒント最小配線
JoinInst::SelectとMergePairにtype_hint: Option<MirType>追加- 13ファイル更新、全 JoinIR テスト PASS
Phase 63-4: infer_type_from_phi 縮退設計
- 型ヒント優先+従来ロジックフォールバック仕様を docs 化
- 削除条件 5/5 を定義(P1: IfSelectTest, P2: read_quoted/IfMerge, P3: Method/Box)
Phase 63-5: infer_type_from_phi 縮退実装
infer_type_from_phi_with_hint()実装(+44行)- lifecycle.rs で呼び出し経路統一
- 削除条件達成率: 3/5(60%)
Phase 63-6: P1 ケース型ヒント完全実装
MirInstruction::Phiにtype_hint追加(21ファイル修正)- JoinIR→MIR Bridge で型ヒント伝播実装
- P1 ケース(IfSelectTest.*)で JoinIR 型ヒントのみで型決定
- 削除条件達成率: 4/5(80%)
Phase 64: P2 型ヒント拡大
- P2 ケース(read_quoted_from, IfMerge)型ヒント実装
is_type_hint_target()箱化(TypeHintPolicy 萌芽)- 削除条件達成率: 4.5/5(90%)
Phase 65: P3-A/B 型ヒント実装
- P3-A:
type_inference.rs新設、JoinInst::MethodCallに型ヒント(StringBox メソッド) - P3-B:
JoinInst::NewBoxに型ヒント(Box コンストラクタ) - 代表ケースベースで削除条件 5/5 達成
Phase 66: P3-C ジェネリック型推論箱化
generic_type_resolver.rs新設(180行)TypeHintPolicy::is_p3c_target()追加- ArrayBox.get / MapBox.get 等のジェネリック型推論基盤確立
Phase 67: P3-C 実利用への一歩
phase67_generic_type_resolver.rsテスト追加(3テスト全 PASS)- lifecycle.rs に P3-C 経路フック追加(GenericTypeResolver 優先使用)
- A/B テストで旧経路との一致確認(11 tests PASS)
技術的成果:
- JoinIR が構造 + PHI + 型ヒントの SSOT として確立
- infer_type_from_phi は P3-C フォールバック専用に縮退
- 4つの柱(Structure / Scope / JoinIR / Type Hints)完成
Phase 69: MIR 決定性 & Trio 経路の整理 ✅ 一部完了(2025-11-30)
- 目的: LoopSnapshotMergeBox / LoopForm 周辺の Inspector/Trio 依存を整理しつつ、MIR の predecessor 順を決定的にしてフラッキーテストを解消する。
- 実績:
- 69-1: LoopSnapshotMergeBox と Trio 経路の現状を確認し、merge_exit_with_classification が LocalScopeInspectorBox を引き回しているだけであり、情報自体は LoopScopeShape/ExitAnalysis 側に揃っていることを整理。
- 69-2:
merge_exit_with_classificationから Inspector 引数を削除し、LoopScopeShape/ExitAnalysis 経由で必要な情報を取る形に縮退(約 42 行削減)。既存の 3 テストはすべて PASS。 - 69-3:
BasicBlock.predecessorsをHashSet→BTreeSetに変更するなど、MIR の predecessor イテレーションを決定的にし、これまで非決定性でフラッキーだった 2 つのループ系テストを安定化。loopform 14/14 / merge_exit 3/3 を含む関連テストはすべて PASS。
- 未了:
- 69-5: conservative.rs の docs/ 移設も今後の小フェーズとして残しておく。
- 追加完了 (Phase 70):
- 69-4: Trio 3 箱(LoopVarClassBox / LoopExitLivenessBox / LocalScopeInspectorBox)を削除し、LoopScopeShape を SSOT とする構成に移行。2025-12-01 時点でコードベース再スキャン済みで、Trio 本体ファイルおよび Trio Box 直接参照は src/mir/ から完全に除去されていることを確認(名称としての「Trio」は docs の歴史メモ内にのみ残存)。
2. 次の一手(Phase 69+)
直近の候補タスク
-
P3-C 拡大 / If PHI 本体削除(Phase 70+ 候補)
- GenericTypeResolver 経由で全 P3-C ケースをカバー
infer_type_from_phi本体削除と if_phi.rs 大掃除
-
Phase 71: Self‑Hosting 再ブートストラップ(初回観測完了! 2025-12-02) ✅
docs/private/roadmap2/phases/phase-71-selfhost-reboot/README.mdで代表パス 1 本(Stage‑3 + JoinIR 前提)と ENV 方針を整理済み。- 代表パス(確定):
NYASH_FEATURES=stage3 NYASH_USE_NY_COMPILER=1 NYASH_NY_COMPILER_EMIT_ONLY=1 NYASH_SELFHOST_KEEP_RAW=1 ./tools/selfhost/selfhost_build.sh --in apps/tests/stage1_run_min.hako --run - Phase 71初回実行成果 (2025-12-02):
- ✅ Phase 70完了直後にPhase 71代表パス実行成功
- ✅ RAW観測レイヤ活用成功 (
logs/selfhost/stageb_20251202_101623_2665649.log707K) - ✅ 根本原因特定: SSA undef (4件) + dev verify (1件) が Program JSON emit失敗を引き起こしている
- ✅ JoinIR/プラグイン初期化は 問題なし (JoinIR経路正常動作、プラグイン成功確認)
- SSA undef詳細 (初回観測時):
ParserCommonUtilsBox.trim/1- ValueId(272)未定義ParserBox.trim/1- ValueId(272)未定義Main._parse_number/1- ValueId(12)未定義ParserBox.parse_block2/2- ValueId(440)未定義
→ Phase 71-SSA での.hako側整理により、現在はいずれも解消済み(SSA undef 13件→0件)。
- dev verify警告 (初回観測時):
StageBDriverBoxNewBox直後にbirth()未呼び出し
→ StageBDriverBox が static box であることを考慮し、lifecycle.rs 側の特例で警告は解消済み。 - 完了判定基準: 観測窓としてのPhase 71は完了。代表 selfhost パスで JSON v0 emit→VM 実行(出力
abc)まで通ることを確認済みで、
SSA 修正は今後 Stage‑B 他ケースと s3/parity 系にフォーカスする。 - 詳細レポート:
docs/development/current/main/phase71-findings-20251202.mdと Phase 71-SSA 追加レポート - quick プロファイルでは JoinIR/VM 系は緑維持を目標としつつ、selfhost_minimal / stageb_min_emit は「SSA ラインの観測窓」として赤許容。Stage‑B/SSA 起因の赤は Phase 71-SSA 側でハンドルする。
-
Phase 72: JoinIR dev フラグ棚卸し ✅
config::env::joinir_core_enabled()/joinir_dev_enabled()を追加し、Core/DevOnly/Deprecated の区分を整理。NYASH_JOINIR_EXPERIMENTやHAKO_JOINIR_IF_SELECTを含む JoinIR 関連フラグの読み書きを、
src/config/env/joinir_dev.rs/src/tests/helpers/joinir_env.rs経由の SSOT に統一(本体コードからのstd::env直読みを排除)。- docs/private/roadmap2/phases/phase-72-joinir-dev-flags/README.md に一覧表と実装状況メモを追加済み。
-
Phase 73: ENV 整理・不要フラグ削除(JoinIR+Stage‑3 周辺)
- docs/private/roadmap2/phases/phase-73-env-cleanup/README.md に Stage‑3 / JoinIR / その他 ENV の棚卸しと Dead/Alias/Keep の分類方針を追加
- 実コードからは
parser_stage3_enabled()/joinir_core_enabled()/joinir_dev_enabled()経由で判定し、legacy/env 名は Alias-only 扱いとして段階的に削除候補へ寄せていく - Stage‑3 旧 ENV は tools/selfhost/hako_check + JoinIR/LoopForm/PHI テスト + Stage‑1/SSA 代表テスト(Batch‑C)からは排除済みで、残りは dev/perf 用や一部 SSA/Stage‑B 系テストと docs の歴史メモに限定されている(Phase 73‑11 で現状を棚卸し済み)
-
Phase 73-7: Stage‑3 旧 ENV の縮退
- tools/selfhost/hako_check から
NYASH_PARSER_STAGE3/HAKO_PARSER_STAGE3を順次削除し、Stage‑3 gate をNYASH_FEATURES=stage3ベースに移行開始 - Rust tests 側の Stage‑3 alias は次フェーズでグループごとに
NYASH_FEATURES=stage3へ寄せる予定
- tools/selfhost/hako_check から
-
Phase 73-8: Rust tests Batch‑A の Stage‑3 ENV 縮退
- JoinIR/PHI 周辺の代表テスト(mir_loopform_* / mir_joinir_* の一部)を対象に、
NYASH_PARSER_STAGE3/HAKO_PARSER_STAGE3をNYASH_FEATURES=stage3に置き換え開始
- JoinIR/PHI 周辺の代表テスト(mir_loopform_* / mir_joinir_* の一部)を対象に、
-
Phase 73-9: Rust tests Batch‑B の Stage‑3 ENV 縮退
- 残りの JoinIR 系テスト(joinir_runner_min / mir_joinir_* / joinir_json_min / joinir_vm_bridge_* / joinir/mainline_phase49)についても、Stage‑3 旧 ENV を廃止し
NYASH_FEATURES=stage3ベースに統一
- 残りの JoinIR 系テスト(joinir_runner_min / mir_joinir_* / joinir_json_min / joinir_vm_bridge_* / joinir/mainline_phase49)についても、Stage‑3 旧 ENV を廃止し
-
wasm/Web デモライン(Phase 71 候補)
- JoinIR ベースの軽量デモ実装
- ブラウザで動く最小構成
-
最適化ライン(Phase 72+ 候補)
- JoinIR 最適化パス実装
- LLVM/ny-llvmc 統合強化
今後の優先タスク順(selfhost + hack_check 観点の整理)
- Phase 71-SSA/selfhost 再ブートストラップの収束
- 代表パス(selfhost_build + stage1_run_min.hako)が JSON v0 emit→VM 実行まで通ることは確認済みとし、 以降は Stage‑B 他ケースと s3/parity 系を「SSA ラインの観測窓」として整理していく。
- この段階では JoinIR Strict は代表 if/loop/VM ブリッジに限定し、selfhost_minimal/stageb_min_emit の赤は SSA 側の課題として扱う。
- Phase 72–73: ENV / JoinIR dev フラグの集約完了 ✅
joinir_core_enabled()/joinir_dev_enabled()/parser_stage3_enabled()を SSOT として使い切り、tools/selfhost/hako_check/tests から旧 ENV を整理する。- ここまでで「selfhost / hack_check / tests が同じ Stage‑3 + JoinIR/ENV ポリシー上に乗る」状態を目指す。
- Phase 80: VM/LLVM 本線の JoinIR 統一 ✅ 完了(2025-12-02 c61f4bc7)
- 代表 if/loop の本線化を実装。
joinir_core_enabled()時は JoinIR→MIR 経路が既定となり、レガシー経路は JoinIR 未対応ケース専用に縮退。 - SSOT ヘルパー(
should_try_joinir_mainline()/should_panic_on_joinir_failure())を実装。 - Phase 82: JOINIR_TARGETS テーブル SSOT 化(93f51e40)完了。
- 代表 if/loop の本線化を実装。
- Phase 81: selfhost 用 JoinIR Strict+fail-fast の確立 ✅ 完了(2025-12-02 a9e10d2a)
- selfhost_build.sh に
--core/--strictオプション追加。環境変数NYASH_JOINIR_CORE/NYASH_JOINIR_STRICTを子プロセスに自動伝播。 - 代表パス(skip_ws / trim / resolve / print_tokens / filter / Stage‑1/Stage‑B 代表)が JoinIR 経由でのみ通る Strict モード実装完了。
- hack_check ラインは引き続き「Stage‑3 + 旧 MIR Builder + VM」の安定ルートとして維持。
- selfhost_build.sh に
- Phase 82-if-phi-retire: P3-C 完了+if_phi.rs 削除 ← 次の焦点
- P3-C 代表ケースを含む型決定を GenericTypeResolver で食い切り、
lifecycle.rsからinfer_type_from_phi*呼び出しを排除する。 collect_assigned_vars_via_joinirを JoinIR/AST 側の分析モジュールに移し、phi_core::if_phiへの参照をゼロにした上でif_phi.rsを削除する。- 必要であれば、後続フェーズで hack_check 側も JoinIR/型ヒントラインに徐々に寄せていく(ただし現時点では「selfhost を先に Strict 化、hack_check は安定 VM ライン維持」を優先)。
- P3-C 代表ケースを含む型決定を GenericTypeResolver で食い切り、
バックログ
-
Stage‑B/selfhost smokes の扱い整理(Phase 30.1 フォロー)
- quick プロファイルで
stage1_launcher_*/phase251*系が Stage‑3 デフォルト環境で不安定。今後、quick では SKIP にするか、Stage‑B emit 抽出ロジックを安定化するかを決める。 MirFunction.blocks: HashMap→BTreeMapで非決定的テスト解消- Phase 25.1 同様のパターン適用
- selfhost Stage‑B 子プロセスへのソース渡し経路の簡素化(
--source "$SRC_CONTENT"で argv を肥大化させず、HAKO_SRC 環境変数や一時ファイル経由に統一する設計を将来フェーズで検討)。
- quick プロファイルで
-
Phase 71-SSA: Stage‑B / selfhost ラインは「SSA デバッグ用の観測窓」として切り出し、
代表パス(selfhost_build + stage1_run_min.hako)が JSON v0 emit まで通るかどうかを別フェーズで追う。
詳細:docs/private/roadmap2/phases/phase-71-ssa-debug/README.md -
Phase 81-JoinIR-Strict: JoinIR を「if/loop/PHI の真」として扱い、
JoinIR 対象関数ではif_phi/LoopBuilder/ 旧 MIR Builder にフォールバックしない Strict モードを導入する。
代表 If/Loop(mir_joinir_if_select / mir_stage1_staticcompiler_receiver / mir_joinir_stage1_using_resolver_min)は
NYASH_JOINIR_CORE=1 NYASH_JOINIR_STRICT=1で全て green を確認済み(Strict で lowering 失敗なし)。
代表パス(skip_ws / trim / resolve / print_tokens / filter / read_quoted / Stage‑1/Stage‑B 代表)では、
JoinIR lowering / VM ブリッジ失敗を即エラー扱いとし、レガシー経路は「未対応関数専用」に縮退させる。 -
Phase 82-if-phi-retire(予定): P3-C ジェネリック型推論ラインを拡張し、
lifecycle.rsからinfer_type_from_phi*呼び出しを完全に排除する(P3-C まで GenericTypeResolver で食い切る)。
あわせてcollect_assigned_vars_via_joinirを JoinIR/AST 側の分析モジュールに移動し、
phi_core::if_phiへの実コードからの参照をゼロにした上でif_phi.rs本体を削除する(歴史メモは docs 側にのみ保持)。 -
Phase 74-SSA-static-delegation(将来フェーズ候補): Phase 71-SSA で判明した「static box 委譲時に ValueId マッピングが壊れる」
Rust MIR ビルダー側の根本バグを正式に修正するライン。
現 HEAD では.hako層で ParserBox → ParserStringUtilsBox などの委譲を外すことで SSA undef は 13件→0件に根治しており、
最小 .hako ではバグを再現できないため、MIR Builder の修正は 再現用テストを用意できる将来フェーズに委譲する。
当面は「box→static box への薄い委譲メソッドを増やさない」というコーディング規約で安全運用し、
Phase 74 では commit13ce9e68以前の形を元にした再現用テスト+MIR Builder 修正+委譲パターンの復活をまとめて扱う。
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 画面で把握できる軽さを維持する方針だよ。***