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