Phase 10.7 (NYASH_JIT_PHI_MIN=1): Minimal PHI support for single-diamond via block params; extend IRBuilder with block-param/jump-args APIs; implement in CraneliftBuilder; update LowerCore two-pass for PHI wiring.

This commit is contained in:
Moe Charm
2025-08-27 17:52:37 +09:00
parent 6bfb38949c
commit 633a073a30
13 changed files with 706 additions and 45 deletions

View File

@ -2,14 +2,15 @@
フェーズ10はJIT実用化へCore-1 Lowerの雛形を固めつつ、呼出/フォールバック導線を整えるよ。
## ⏱️ 今日のサマリ10_c実行経路の堅牢化GC/スケジューラ導線)
## ⏱️ 今日のサマリ10_c実行経路の堅牢化10_7分岐配線GC/スケジューラ導線)
- 目的: JIT実行を安全に通す足場を仕上げつつ、GC/スケジューラ導線を整備し回帰検出力を上げる。
- 10_c: panic→VMフォールバック`catch_unwind`/ JIT経路のroot区域化 / Core-1 i64 param minimal pass`emit_param_i64` + LowerCoreで供給
- 10_c: panic→VMフォールバック`catch_unwind`/ JIT経路のroot区域化 / Core-1 i64 param minimal pass`emit_param_i64` + LowerCoreで供給✅ 完了
- 10_4a/10_4b: GC導線 + Write-Barrier挿入ArraySet/RefSet/BoxCall、root APIenter/pin/leave
- 10_4c: CountingGcカウンタ出力roots/BoxRef内訳、depth2リーチャビリティ観測`NYASH_GC_TRACE=1/2/3`)✅ 完了
- 10_4d: STRICTバリア検証CountingGc前後比較で漏れ即検出✅ 完了(`NYASH_GC_BARRIER_STRICT=1`
- 10_6b: シングルスレ・スケジューラspawn/spawn_after/poll、Safepointで`poll()`連携、`NYASH_SCHED_POLL_BUDGET`対応 ✅ 完了
- ベンチ: CLIベンチへJIT比較追加ウォームアップあり、スクリプト版`examples/ny_bench.nyash`追加TimerBoxでops/sec
- 10_7: JIT分岐配線Cranelift— MIR Branch/Jump→CLIFブロック配線、条件b1保持、分岐b1/`i64!=0`両対応feature: `cranelift-jit`
- ベンチ: CLIベンチへJIT比較追加ウォームアップあり`branch_return`ケース追加、スクリプト版`examples/ny_bench.nyash`追加TimerBoxでops/sec
### 直近タスク(小さく早く)
1) 10_b: Lower/Core-1 最小化(進行中 → ほぼ完了)
@ -25,12 +26,17 @@
- JIT実行→`VMValue`返却、panic時VMフォールバック ✅(`engine.execute_handle``catch_unwind`
- Core-1最小: i64 param/return、Const(i64/bool→0/1)、BinOp/Compare/Return ✅
- HostCall最小Array/Map: len/get/set/push/sizeゲート`NYASH_JIT_HOSTCALL=1`
- Branch/Jumpは統計カウントまでCLIFブロック配線は後続フェーズで拡張
- Branch/JumpはCranelift配線導入済みfeature `cranelift-jit`。副作用命令は未lowerのためVMへフォールバック
3) 10_7: 分岐配線Cranelift— 進捗中
- LowerCore: BB整列・マッピング→builderの`prepare_blocks/switch/seal/br_if/jump`呼出 ✅
- CraneliftBuilder: ブロック配列管理、`brif/jump`実装、条件b1/`i64!=0`両対応 ✅
- 残: 最小PHI単純ダイアモンド導入`NYASH_JIT_PHI_MIN=1`ガード)/ 副作用命令の扱い方針当面VMへ
備考(制限と次の着手点)
- 返り値はi64VMValue::Integerに限定。f64はconst最小emit、boolはi64 0/1へ正規化分岐条件入力に対応
- 引数はi64のみ最小パス。複数引数はparamマッピングで通過、非i64は未対応 → 次対応
- Branch/JumpのCLIF配線は準備済み(ビルダー側は統計カウント。CLIFブロック配線は後続で実装。
- Branch/JumpのCLIF配線は導入済み(feature `cranelift-jit`。条件はb1で保持し、必要に応じて`i64!=0`で正規化
- 副作用命令print等はJIT未対応のためVMへ委譲安全性優先
- JIT/VM統合統計フォールバック率/時間の一括出力)未統合 → 次対応
### すぐ試せるコマンド
@ -45,6 +51,12 @@ NYASH_JIT_STATS=1 NYASH_JIT_DUMP=1 NYASH_JIT_EXEC=1 \
# 任意Craneliftを含めてビルド今は最小初期化のみ
cargo build --release -j32 --features cranelift-jit
# JIT分岐デモfeature有効時
NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 \
./target/release/nyash --backend vm examples/jit_branch_demo.nyash
NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 \
./target/release/nyash --backend vm examples/jit_loop_early_return.nyash
# スクリプトベンチTimerBox版
./target/release/nyash examples/ny_bench.nyash
./target/release/nyash --backend vm examples/ny_bench.nyash
@ -92,6 +104,11 @@ NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 ./target/release/nyash --backend vm examp
- STRICTモードのCI導入CountingGc前提/ goldenベンチ導入
- 10_6b:
- スケジューラ: poll予算の設定ファイル化、将来のscript API検討継続
- 10_7:
- 最小PHI単純ダイアモンドの導入`NYASH_JIT_PHI_MIN=1`ガード)
- IRBuilder APIの整理block param/分岐引数の正式化とCranelift実装の安定化
- 副作用命令のJIT扱い方針: 当面VMへ、将来はHostCall化
- CFG検証と`NYASH_JIT_DUMP=1`でのCFG可視化
- ベンチ:
- `examples/ny_bench.nyash`のケース追加(関数呼出/Map set-getとループ回数のenv化