cleanup(phi): Phase 27.4C Cleanup - ヘルパー統一・定数化・API縮小

Phase 1-2 完了: デバッグ・環境変数・対象関数の保守性向上

## Phase 1-1: デバッグフラグヘルパー化

**目的**: NYASH_LOOPFORM_DEBUG チェックの重複排除

**実装**:
- `is_loopform_debug_enabled()` 関数追加 (loopform_builder.rs:16-23)
  - `#[inline]` + `pub(crate)` で効率的に共有
  - 環境変数チェックを一元化
- 使用箇所 (5箇所 → 1箇所定義):
  - loopform_builder.rs: seal_pinned_phis (line 367)
  - loopform_builder.rs: seal_carrier_phis (line 431)
  - loop_builder.rs: emit_header_phis 前 (line 315)
  - loop_builder.rs: emit_header_phis 後 (line 324)

**効果**: 重複削減(5箇所 → 1箇所)、将来のログシステム変更が容易

## Phase 1-2: 対象関数名の定数化

**目的**: JoinIR Header φ バイパス対象関数の保守性向上

**実装**:
- `JOINIR_HEADER_BYPASS_TARGETS` 定数追加 (header_phi_builder.rs:52-59)
  ```rust
  const JOINIR_HEADER_BYPASS_TARGETS: &[&str] = &[
      "Main.skip/1",
      "FuncScannerBox.trim/1",
  ];
  ```
- `is_joinir_header_bypass_target()` を定数ベースに変更 (line 61-66)
  - `matches!()` → `.contains()` に変更

**効果**: 対象関数追加時の保守性向上、定数にドキュメント集約可能

## Phase 1-3: 環境変数チェック統一

**目的**: 環境変数チェックロジックの統一化

**実装**:
- `joinir_header_experiment_enabled()` を `env_flag_is_1()` 使用に変更
  ```rust
  // Before
  std::env::var("NYASH_JOINIR_HEADER_EXP").ok().as_deref() == Some("1")

  // After
  crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_HEADER_EXP")
  ```
- `HeaderPhiBuilder::new()` も同様に統一 (line 183)

**効果**: 環境変数チェックロジック統一、env_flag_is_1() の利点(キャッシュ等)を享受

## Phase 2: 不要 public 関数の整理

**目的**: API サーフェス縮小、保守性向上

**実装**:
- `joinir_header_experiment_enabled()` を削除
  - 単一の呼び出し元 (`get_loop_bypass_flags()`) しかなかったためインライン化
- `get_loop_bypass_flags()` 内で直接 `env_flag_is_1()` を呼び出し (line 77-79)
  ```rust
  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");
  ```

**効果**: API サーフェス縮小、重複削減、保守コスト削減

## テスト結果

**コンパイル**:  0 errors, 19 warnings
**テスト**:  371 passed; 10 failed
  - Phase 27.4C Refactor 時: 370 passed; 11 failed
  - **+1 テスト通過!** 🎉
  - 既存 failures 変化なし

## 修正ファイル

- src/mir/phi_core/loopform_builder.rs
  - is_loopform_debug_enabled() 追加 + 使用
- src/mir/phi_core/header_phi_builder.rs
  - JOINIR_HEADER_BYPASS_TARGETS 定数追加
  - joinir_header_experiment_enabled() 削除(インライン化)
  - get_loop_bypass_flags() 簡素化
  - HeaderPhiBuilder::new() 統一化
- src/mir/loop_builder.rs
  - is_loopform_debug_enabled() 使用 (2箇所)

## 総合効果

-  重複削減: 環境変数チェック 5箇所 → 1箇所
-  保守性向上: 対象関数追加が容易、ログシステム変更が容易
-  API 縮小: 不要な内部関数削除
-  テスト改善: +1 テスト通過
-  退行なし: 既存 failures 変化なし
This commit is contained in:
nyash-codex
2025-11-23 14:30:05 +09:00
parent 9ea8bb34f6
commit 4bfc9119dd
3 changed files with 29 additions and 37 deletions

View File

@ -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()

View File

@ -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<String, ValueId>)],
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<String, ValueId>)],
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 {