diff --git a/docs/development/current/main/01-JoinIR-Selfhost-INDEX.md b/docs/development/current/main/01-JoinIR-Selfhost-INDEX.md index 105c6096..9948df06 100644 --- a/docs/development/current/main/01-JoinIR-Selfhost-INDEX.md +++ b/docs/development/current/main/01-JoinIR-Selfhost-INDEX.md @@ -70,17 +70,19 @@ JoinIR の箱構造と責務、ループ/if の lowering パターンを把握 - `docs/development/current/main/phases/phase-115/README.md` 18. Phase 116: if-only keep+call merge parity(片側元値保持、片側 call merge) - `docs/development/current/main/phases/phase-116/README.md` -19. Phase 104: loop(true) break-only digits(VM + LLVM EXE) +19. Phase 117: if-only nested-if + call merge parity(ネストif + call merge) + - `docs/development/current/main/phases/phase-117/README.md` +20. Phase 104: loop(true) break-only digits(VM + LLVM EXE) - `docs/development/current/main/phases/phase-104/README.md` -20. Phase 107: json_cur find_balanced_* depth scan(VM + LLVM EXE) +21. Phase 107: json_cur find_balanced_* depth scan(VM + LLVM EXE) - `docs/development/current/main/phases/phase-107/README.md` -21. Phase 108: Pattern2 policy router SSOT(入口の薄さを固定) +22. Phase 108: Pattern2 policy router SSOT(入口の薄さを固定) - `docs/development/current/main/phases/phase-108/README.md` -22. Phase 109: error_tags hints SSOT(Fail-Fast + hint の語彙固定) +23. Phase 109: error_tags hints SSOT(Fail-Fast + hint の語彙固定) - `docs/development/current/main/phases/phase-109/README.md` -23. MIR Builder(Context 分割の入口) +24. MIR Builder(Context 分割の入口) - `src/mir/builder/README.md` -24. Scope/BindingId(shadowing・束縛同一性の段階移行) +25. Scope/BindingId(shadowing・束縛同一性の段階移行) - `docs/development/current/main/phase73-scope-manager-design.md` - `docs/development/current/main/PHASE_74_SUMMARY.md` - `docs/development/current/main/PHASE_75_SUMMARY.md` diff --git a/docs/development/current/main/10-Now.md b/docs/development/current/main/10-Now.md index 13fb1cf3..4840333c 100644 --- a/docs/development/current/main/10-Now.md +++ b/docs/development/current/main/10-Now.md @@ -1,5 +1,14 @@ # Self Current Task — Now (main) +## 2025-12-18:Phase 117 完了 ✅ + +**Phase 117: if-only nested-if + call merge parity** +- ネストしたif-only(内側if + 外側else)で call 結果 merge を VM/LLVM で固定 +- Fixture: phase117_if_only_nested_if_call_merge_min.hako (expected: 2, 3, 4) +- Smoke: VM + LLVM EXE parity 検証済み +- 回帰: Phase 116 維持確認 +- 入口: `docs/development/current/main/phases/phase-117/README.md` + ## 2025-12-18:Phase 116 完了 ✅ **Phase 116: if-only keep+call merge parity** diff --git a/docs/development/current/main/phases/phase-117/README.md b/docs/development/current/main/phases/phase-117/README.md new file mode 100644 index 00000000..47d22353 --- /dev/null +++ b/docs/development/current/main/phases/phase-117/README.md @@ -0,0 +1,78 @@ +# Phase 117: if-only nested-if + call merge parity + +**Status**: ✅ DONE (2025-12-18) + +## 背景 + +Phase 116で「keep + call merge」を固定した後、**ネストされたif内部でのcall merge**が正しく動作するか検証が必要。 + +特に以下のパターンを検証: +- 外側if (a == 1) の中に内側if (b == 1) +- 内側if の両分岐で異なる引数でf()を呼び出し +- 外側else でも別引数でf()を呼び出し +- すべてのcall結果をvに集約してprint + +これはJoinIR Pattern3(if-only)+ call mergeの**ネスト版**であり、VM/LLVM EXE両方で同じ動作をすることが品質保証の要件。 + +## 実装 + +### Fixture +- **ファイル**: `apps/tests/phase117_if_only_nested_if_call_merge_min.hako` +- **構造**: static box Main パターン + - `f(x)`: 単純な関数(x + 1を返す) + - `g(a, b)`: ネストif + call merge + - a == 1 かつ b == 1 → f(1) → 2 + - a == 1 かつ b != 1 → f(2) → 3 + - a != 1 → f(3) → 4 + - `main()`: 3パターンを順次実行 +- **期待出力**: `2\n3\n4` + +### VM Smoke Test +- **ファイル**: `tools/smokes/v2/profiles/integration/apps/phase117_if_only_nested_if_call_merge_vm.sh` +- **実行条件**: `NYASH_DISABLE_PLUGINS=1 HAKO_JOINIR_STRICT=1` +- **検証**: `validate_numeric_output 3 "2\n3\n4"` + +### LLVM EXE Smoke Test +- **ファイル**: `tools/smokes/v2/profiles/integration/apps/phase117_if_only_nested_if_call_merge_llvm_exe.sh` +- **Required plugins**: FileBox, MapBox, StringBox, ConsoleBox, IntegerBox (Phase 115/116と同じ) +- **検証**: numeric output `2\n3\n4` (3 lines) + +## 検証コマンド + +```bash +# VM smoke test +bash tools/smokes/v2/profiles/integration/apps/phase117_if_only_nested_if_call_merge_vm.sh + +# LLVM EXE smoke test +bash tools/smokes/v2/profiles/integration/apps/phase117_if_only_nested_if_call_merge_llvm_exe.sh + +# 回帰確認(Phase 116) +bash tools/smokes/v2/profiles/integration/apps/phase116_if_only_keep_plus_call_llvm_exe.sh +``` + +## 技術的詳細 + +### JoinIR Pattern3(if-only)のネスト +- **外側if**: a == 1 の分岐 +- **内側if**: b == 1 の分岐(外側then内部にネスト) +- **Call merge**: 3箇所のf()呼び出しが最終的に1つのvに集約 + +### MIR生成の観点 +- ネストしたif-onlyが正しくPattern3として認識される +- 各分岐でのcall命令が適切にマージされる +- PHI nodeが正しく生成される(ネスト構造を反映) + +### LLVM EXE固有の検証ポイント +- プラグイン(StringBox, IntegerBox, ConsoleBox)の正しいリンク +- ネストしたcall mergeのLLVM IR生成 +- 実行時のメモリ安全性(segfault無し) + +## 成果 + +✅ VM/LLVM EXE両方でparity達成 +✅ ネストif + call mergeパターンの品質固定 +✅ Phase 115/116の退行なし + +## Next Steps + +Phase 118以降でさらに複雑なネストパターン(if-else nested, loop内if等)を段階的に固定していく。