diff --git a/src/mir/loop_builder.rs b/src/mir/loop_builder.rs index 55cb9f9c..17301daa 100644 --- a/src/mir/loop_builder.rs +++ b/src/mir/loop_builder.rs @@ -312,7 +312,7 @@ impl<'a> LoopBuilder<'a> { // // ⚠️ 重要: このモードでは MIR は不完全(φ 抜け)であり、VM で実行できない。 // JoinIR runner 専用モードであることに注意。 - if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() { + if crate::mir::phi_core::loopform_builder::is_loopform_debug_enabled() { eprintln!("[loopform/27.4-C] Header φ bypass active for: {}", fn_name); eprintln!("[loopform/27.4-C] Skipping emit_header_phis() - using preheader values directly"); } @@ -321,7 +321,7 @@ impl<'a> LoopBuilder<'a> { loopform.emit_header_phis(self)?; } - if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() { + if crate::mir::phi_core::loopform_builder::is_loopform_debug_enabled() { eprintln!("[loopform] variable_map after emit_header_phis:"); for (name, value) in self.get_current_variable_map().iter() { eprintln!(" {} -> {:?}", name, value); diff --git a/src/mir/phi_core/header_phi_builder.rs b/src/mir/phi_core/header_phi_builder.rs index ae1cadd9..f86c11c1 100644 --- a/src/mir/phi_core/header_phi_builder.rs +++ b/src/mir/phi_core/header_phi_builder.rs @@ -22,42 +22,25 @@ use crate::mir::{BasicBlockId, ValueId}; use std::collections::HashMap; -/// Phase 27.4-B: JoinIR 実験モードが有効かチェック +/// Phase 27.4C Cleanup: この関数は削除され、get_loop_bypass_flags() に統合されました。 +/// 直接 get_loop_bypass_flags() を使用してください。 /// -/// 環境変数 `NYASH_JOINIR_HEADER_EXP=1` のときに true を返す。 -/// このフラグが有効な場合、将来的に Header φ 生成をスキップする経路が追加される。 -/// -/// **現在の挙動**: フラグの読み取りとログ出力のみ(no-op) -fn joinir_header_experiment_enabled() -> bool { - std::env::var("NYASH_JOINIR_HEADER_EXP") - .ok() - .as_deref() - == Some("1") -} +/// 理由: 単一の呼び出し元しかなく、API サーフェスを縮小するため。 -/// Phase 27.4-C: JoinIR Header φ バイパスが有効かチェック +/// Phase 27.4C Cleanup: JoinIR Header φ バイパス対象関数リスト /// -/// 条件: NYASH_JOINIR_EXPERIMENT=1 AND NYASH_JOINIR_HEADER_EXP=1 の両方が必要 +/// Phase 27.4-C のスコープは以下の 2 関数のみ: +/// - `Main.skip/1` (minimal_ssa_skip_ws.hako) +/// - `FuncScannerBox.trim/1` (funcscanner_trim_min.hako) /// -/// **用途**: JoinIR 実験経路限定で Header φ 生成をスキップする場合に true を返す。 -/// 本線(MIR/LoopForm→VM)には一切影響しない。 -pub(crate) fn joinir_header_bypass_enabled() -> bool { - // JoinIR がそもそも実験モードか - let joinir_exp = crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_EXPERIMENT"); - // Header 実験フラグが ON か - let header_exp = joinir_header_experiment_enabled(); - joinir_exp && header_exp -} +/// **重要**: 他の関数では Header φ を絶対にスキップしないこと。 +const JOINIR_HEADER_BYPASS_TARGETS: &[&str] = &["Main.skip/1", "FuncScannerBox.trim/1"]; /// Phase 27.4-C: JoinIR Header φ バイパス対象関数かチェック /// -/// Phase 27.4-C のスコープは以下の 2 関数のみ: -/// - Main.skip/1 (minimal_ssa_skip_ws.hako) -/// - FuncScannerBox.trim/1 (funcscanner_trim_min.hako) -/// -/// **重要**: 他の関数では Header φ を絶対にスキップしないこと。 +/// `JOINIR_HEADER_BYPASS_TARGETS` に含まれる関数のみ true を返す。 pub(crate) fn is_joinir_header_bypass_target(fn_name: &str) -> bool { - matches!(fn_name, "Main.skip/1" | "FuncScannerBox.trim/1") + JOINIR_HEADER_BYPASS_TARGETS.contains(&fn_name) } /// Phase 27.4-C Refactor: JoinIR Loop φ バイパスフラグ統合 @@ -91,12 +74,12 @@ pub(crate) struct LoopBypassFlags { /// } /// ``` pub(crate) fn get_loop_bypass_flags(fn_name: &str) -> LoopBypassFlags { + // Phase 27.4C Cleanup: joinir_header_experiment_enabled() をインライン化 let joinir_exp = crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_EXPERIMENT"); + let header_exp = crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_HEADER_EXP"); LoopBypassFlags { - header: joinir_exp - && joinir_header_experiment_enabled() - && is_joinir_header_bypass_target(fn_name), + header: joinir_exp && header_exp && is_joinir_header_bypass_target(fn_name), // Phase 27.6-2: Exit φ バイパスは将来的に追加予定 exit: false, } @@ -196,8 +179,8 @@ impl HeaderPhiBuilder { /// let builder = HeaderPhiBuilder::new(); /// ``` pub fn new() -> Self { - // Phase 27.4-B: JoinIR 実験フラグのチェック(ログ出力のみ、挙動変更なし) - if joinir_header_experiment_enabled() { + // Phase 27.4-B/27.4C Cleanup: JoinIR 実験フラグのチェック(ログ出力のみ、挙動変更なし) + if crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_HEADER_EXP") { eprintln!("[HeaderPhiBuilder] JoinIR experiment flag is ON (NYASH_JOINIR_HEADER_EXP=1)"); } Self::default() diff --git a/src/mir/phi_core/loopform_builder.rs b/src/mir/phi_core/loopform_builder.rs index 1a299d5e..bc47b095 100644 --- a/src/mir/phi_core/loopform_builder.rs +++ b/src/mir/phi_core/loopform_builder.rs @@ -13,6 +13,15 @@ use crate::mir::phi_core::phi_input_collector::PhiInputCollector; use crate::mir::{BasicBlockId, ValueId}; use std::collections::BTreeMap; +/// Phase 27.4C Cleanup: LoopForm デバッグログが有効かチェック +/// +/// 環境変数 `NYASH_LOOPFORM_DEBUG` が設定されている場合に true を返す。 +/// 複数箇所での重複チェックを避けるためのヘルパー関数。 +#[inline] +pub(crate) fn is_loopform_debug_enabled() -> bool { + std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() +} + /// 📦 LoopForm Context - Box-First理論に基づくパラメータ予約明示化 /// /// ValueId割り当ての境界を明確にし、パラメータ予約を明示的に管理。 @@ -355,7 +364,7 @@ impl LoopFormBuilder { continue_snapshots: &[(BasicBlockId, BTreeMap)], header_bypass: bool, ) -> Result<(), String> { - let debug = std::env::var("NYASH_LOOPFORM_DEBUG").is_ok(); + let debug = is_loopform_debug_enabled(); for pinned in &self.pinned { if header_bypass { @@ -419,7 +428,7 @@ impl LoopFormBuilder { continue_snapshots: &[(BasicBlockId, BTreeMap)], header_bypass: bool, ) -> Result<(), String> { - let debug = std::env::var("NYASH_LOOPFORM_DEBUG").is_ok(); + let debug = is_loopform_debug_enabled(); for carrier in &mut self.carriers { if header_bypass {