feat(phi): Phase 27.4-C - HeaderPhiBuilder bypass for JoinIR experiment

JoinIR 実験経路限定で Header φ 生成をスキップ可能に。

実装内容:
- トグルシステム: joinir_header_bypass_enabled() / is_joinir_header_bypass_target()
- バイパス実装: loop_builder.rs で関数名チェック後に emit_header_phis() をスキップ
- ターゲット関数: Main.skip/1, FuncScannerBox.trim/1 のみ
- テスト更新: JoinIR テストファイルに Phase 27.4-C 対応コメント追加

環境変数:
- NYASH_JOINIR_EXPERIMENT=1 AND NYASH_JOINIR_HEADER_EXP=1 の両方が必要

本線影響: ゼロ(MIR/LoopForm→VM 経路は完全に影響なし)
This commit is contained in:
nyash-codex
2025-11-23 10:08:48 +09:00
parent c7bd5a5465
commit df2248d3c1
5 changed files with 63 additions and 2 deletions

View File

@ -295,7 +295,31 @@ impl<'a> LoopBuilder<'a> {
// Ensure header block exists before emitting PHIs
self.parent_builder.ensure_block_exists(header_id)?;
loopform.emit_header_phis(self)?;
// Phase 27.4-C: JoinIR Header φ バイパスチェック
let fn_name = self
.parent_builder
.current_function
.as_ref()
.map(|f| f.signature.name.as_str())
.unwrap_or("");
let header_bypass = crate::mir::phi_core::header_phi_builder::joinir_header_bypass_enabled()
&& crate::mir::phi_core::header_phi_builder::is_joinir_header_bypass_target(fn_name);
if header_bypass {
// Phase 27.4-C: JoinIR 実験経路では Header φ を生成しない。
// Pinned/Carrier の値は preheader の copy をそのまま使う。
//
// ⚠️ 重要: このモードでは MIR は不完全(φ 抜けであり、VM で実行できない。
// JoinIR runner 専用モードであることに注意。
if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() {
eprintln!("[loopform/27.4-C] Header φ bypass active for: {}", fn_name);
eprintln!("[loopform/27.4-C] Skipping emit_header_phis() - using preheader values directly");
}
} else {
// 従来どおり HeaderPhiBuilder を使って φ を準備
loopform.emit_header_phis(self)?;
}
if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() {
eprintln!("[loopform] variable_map after emit_header_phis:");