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:
@ -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);
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user