refactor(phi): Phase 27.4C Refactor - seal_phis分割 + トグル条件一元化

推奨アクション 1 & 2 実装完了

## Action 1: seal_phis メソッド分割

**目的**: 150行超の seal_phis を責任ごとに分割、可読性・保守性向上

**実装**:
- seal_pinned_phis() 追加 (loopform_builder.rs:347-407)
  - Pinned 変数専用 φ seal 処理を抽出
  - Header φ バイパス時の early return 含む
- seal_carrier_phis() 追加 (loopform_builder.rs:409-477)
  - Carrier 変数専用 φ seal 処理を抽出
  - Header φ バイパス時の early return 含む
- seal_phis() を委譲パターンに簡素化 (loopform_builder.rs:340-342)

**効果**:
- メソッド長: 150行 → 3行(委譲) + 60行(Pinned) + 68行(Carrier)
- 責任の明確化: Pinned/Carrier 処理が独立
- 将来の拡張が容易(Exit φ バイパス追加時など)

## Action 2: トグル条件ヘルパー一元化

**目的**: Header φ バイパス条件判定の重複排除、保守性向上

**実装**:
- LoopBypassFlags 構造体追加 (header_phi_builder.rs:18-24)
  - header/exit バイパスフラグを統合管理
- get_loop_bypass_flags() 関数追加 (header_phi_builder.rs:26-38)
  - 関数名からバイパスフラグを一元計算
  - NYASH_JOINIR_EXPERIMENT/HEADER_EXP チェック
  - Main.skip/1 & FuncScannerBox.trim/1 判定
- loop_builder.rs で 2箇所から呼び出し (lines 299-307, 609-612)
- fn_name を String として取得 (loop_builder.rs:299-304)
  - 借用問題回避(&str → String)

**効果**:
- 重複削減: 3箇所 → 1箇所の定義
- バグ防止: 条件判定ロジックの不一致を防止
- 借用問題解決: fn_name String 化で Rust 借用チェッカー通過
- 将来対応: Exit φ バイパス(Phase 27.6-2)追加が容易

## テスト結果

**コンパイル**:  0 errors, 19 warnings
**ベースライン**:  370 passed; 11 failed (退行なし、+10テスト通過)

## 修正ファイル

- src/mir/phi_core/loopform_builder.rs
  - seal_pinned_phis() 追加
  - seal_carrier_phis() 追加
  - seal_phis() 委譲化
- src/mir/phi_core/header_phi_builder.rs
  - LoopBypassFlags 構造体追加
  - get_loop_bypass_flags() 関数追加
- src/mir/loop_builder.rs
  - fn_name String 化
  - get_loop_bypass_flags() 呼び出し (2箇所)
- docs/private/roadmap2/phases/phase-27.4C-refine-sealphis/README.md
  - リファクタリング詳細ドキュメント追加
This commit is contained in:
nyash-codex
2025-11-23 13:16:08 +09:00
parent 64b71f5b12
commit 9ea8bb34f6
3 changed files with 131 additions and 60 deletions

View File

@ -295,18 +295,18 @@ impl<'a> LoopBuilder<'a> {
// Ensure header block exists before emitting PHIs
self.parent_builder.ensure_block_exists(header_id)?;
// Phase 27.4-C: JoinIR Header φ バイパスチェック
// Phase 27.4-C Refactor: JoinIR Loop φ バイパスフラグ統一取得
let fn_name = self
.parent_builder
.current_function
.as_ref()
.map(|f| f.signature.name.as_str())
.unwrap_or("");
.map(|f| f.signature.name.clone())
.unwrap_or_default();
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);
let bypass_flags =
crate::mir::phi_core::header_phi_builder::get_loop_bypass_flags(&fn_name);
if header_bypass {
if bypass_flags.header {
// Phase 27.4-C: JoinIR 実験経路では Header φ を生成しない。
// Pinned/Carrier の値は preheader の copy をそのまま使う。
//
@ -605,8 +605,21 @@ impl<'a> LoopBuilder<'a> {
snaps
};
// Phase 27.4C Refactor: Header φ バイパスフラグを統一取得seal_phis に渡す)
// Note: fn_name は既に line 299-304 で取得済み、String として保持されている
let bypass_flags_for_seal =
crate::mir::phi_core::header_phi_builder::get_loop_bypass_flags(&fn_name);
// Step 5-1/5-2: Pass writes 集合 for PHI縮約
loopform.seal_phis(self, actual_latch_id, &continue_snaps, &writes)?;
// Phase 27.4C: header_bypass フラグも渡す
loopform.seal_phis(
self,
actual_latch_id,
&continue_snaps,
&writes,
bypass_flags_for_seal.header,
)?;
// Step 3: seal body-local PHIs (complete the inputs)
// Step 5-5-A: REMOVED - PHIs now created complete with both inputs upfront