# 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等)を段階的に固定していく。