# Legacy Loop Builder削除プラン **Phase**: 31.2 - Legacy Loop Builder経路の完全削除 **目的**: `build_loop_legacy()` (372行) および Legacy専用ヘルパー関数を削除し、LoopFormBox経路のみに統一 **背景**: Phase 31完了により、LoopFormBox経路が安定版として確立。Legacy経路は不要になった。 --- ## 1. 削除対象サマリー | ファイル | 関数/メソッド | 行数 | 使用箇所 | 削除可否 | |---------|-------------|------|---------|---------| | **build.rs** | `build_loop_legacy` | 372行 | 1箇所(build_loop Line 33のみ) | ✅ 削除 | | **build.rs** | `build_loop` の Legacy分岐 | 15行 | - | ✅ 削除 | | **phi.rs** | `prepare_loop_variables` | 29行 | 1箇所(build_loop_legacy Line 102のみ) | ✅ 削除 | | **phi.rs** | `seal_block` | 14行 | 1箇所(build_loop_legacy Line 214のみ) | ✅ 削除 | | **phi.rs** | `mark_block_unsealed` | 5行 | 1箇所(build_loop_legacy Line 89のみ) | ✅ 削除 | | **mod.rs** | `build_expression_with_phis` | 4行 | 1箇所(build_loop_legacy Line 127のみ) | ✅ 削除 | | **mod.rs** | `block_var_maps` フィールド | - | Legacy専用 | ✅ 削除 | | **mod.rs** | `incomplete_phis` フィールド | - | Legacy専用 | ✅ 削除 | | **phi_core/loop_phi.rs** | `prepare_loop_variables_with` | 21行 | 1箇所(prepare_loop_variables Line 35のみ) | ✅ 削除 | | **phi_core/loop_phi.rs** | `seal_incomplete_phis_with` | 26行 | 1箇所(seal_block Line 49のみ) | ✅ 削除 | | **phi_core/loop_phi.rs** | `save_block_snapshot` | 7行 | 2箇所(両方Legacy内) | ✅ 削除 | | **phi_core/loop_phi.rs** | `IncompletePhi` 型 | - | Legacy専用 | ✅ 削除 | **共通使用関数** (削除対象外): - `collect_carrier_assigns` - LoopCarrierAnalyzerBoxが使用(継続使用) - `build_exit_phis_with` - PhiBuilderBoxが使用(継続使用) **合計削除見込み**: **493行** (build.rs: 387行 + phi.rs: 48行 + mod.rs: 4行 + loop_phi.rs: 54行) --- ## 2. 詳細分析 ### 2.1 build_loop_legacy() (build.rs Line 45-417) **使用箇所**: `build_loop()` Line 33 のみ(`HAKO_FORCE_LEGACY_LOOP=1` 時) **依存関数**: - `prepare_loop_variables()` (phi.rs) - Legacy専用 - `seal_block()` (phi.rs) - Legacy専用 - `mark_block_unsealed()` (phi.rs) - Legacy専用 - `build_expression_with_phis()` (mod.rs) - Legacy専用 - `create_exit_phis()` (phi.rs) - 共通使用(PhiBuilderBox経由) - `materialize_branch_entry_phis()` (build.rs) - 共通使用(if-in-loop用) - `execute_branch_body()` (build.rs) - 共通使用(if-in-loop用) **削除可否**: ✅ **安全に削除可能** **理由**: 1. `HAKO_FORCE_LEGACY_LOOP=1` 環境変数でのみ有効化される非推奨パス 2. デフォルトは `build_loop_with_loopform()` を使用(Phase 31完了、安定版) 3. `#[deprecated]` アトリビュート付き(明示的な削除予定) --- ### 2.2 build_loop() のLegacy分岐 (build.rs Line 19-38) **現在のコード**: ```rust pub fn build_loop( &mut self, condition: ASTNode, body: Vec, ) -> Result { // P0 Refactoring: ロジック逆転(LoopFormBox = デフォルト、Legacy = 明示要求のみ) let force_legacy = crate::runtime::env_gate_box::bool_any(&[ "HAKO_FORCE_LEGACY_LOOP", "NYASH_FORCE_LEGACY_LOOP", ]); if force_legacy { // Legacy path (DEPRECATED, will be removed in future) eprintln!("[DEPRECATED] Using legacy loop builder (HAKO_FORCE_LEGACY_LOOP=1). This will be removed in future versions."); return self.build_loop_legacy(condition, body); } // Default: Use LoopFormBox path (Phase 31 stable) self.build_loop_with_loopform(condition, body) } ``` **削除後のコード**: ```rust pub fn build_loop( &mut self, condition: ASTNode, body: Vec, ) -> Result { // LoopFormBox経路のみ(Phase 31完了、Legacy経路削除済み) self.build_loop_with_loopform(condition, body) } ``` **削除可否**: ✅ **削除(15行削減)** --- ### 2.3 prepare_loop_variables() (phi.rs Line 14-43) **使用箇所**: `build_loop_legacy()` Line 102 のみ **依存関数**: - `crate::mir::phi_core::loop_phi::save_block_snapshot()` - Legacy専用 - `crate::mir::phi_core::loop_phi::prepare_loop_variables_with()` - Legacy専用 **削除可否**: ✅ **安全に削除可能** **理由**: `build_loop_legacy()` の内部でのみ呼ばれている。LoopFormBoxは独自のPHI生成ロジックを持つ(PhiBuilderBox経由)。 --- ### 2.4 seal_block() (phi.rs Line 46-59) **使用箇所**: `build_loop_legacy()` Line 214 のみ **依存関数**: - `crate::mir::phi_core::loop_phi::seal_incomplete_phis_with()` - Legacy専用 **削除可否**: ✅ **安全に削除可能** **理由**: `build_loop_legacy()` の内部でのみ呼ばれている。LoopFormBoxは事前確定PHI方式でsealing不要。 **注意**: LLVM backend (`src/backend/llvm/compiler/codegen/instructions/flow.rs`) に同名関数 `seal_block()` があるが、これは別物(LLVM SSA構築用)で削除対象外。 --- ### 2.5 mark_block_unsealed() (phi.rs Line 78-82) **使用箇所**: `build_loop_legacy()` Line 89 のみ **実装**: ```rust pub(super) fn mark_block_unsealed(&mut self, _block_id: BasicBlockId) -> Result<(), String> { // ブロックはデフォルトでunsealedなので、特に何もしない // (既にBasicBlock::newでsealed: falseに初期化されている) Ok(()) } ``` **削除可否**: ✅ **安全に削除可能** **理由**: no-op実装(何もしない)。Legacy経路でのみ呼ばれている。 --- ### 2.6 build_expression_with_phis() (mod.rs Line 333-336) **使用箇所**: `build_loop_legacy()` Line 127 のみ **実装**: ```rust pub(super) fn build_expression_with_phis(&mut self, expr: ASTNode) -> Result { // Phi nodeの結果を考慮しながら式を構築 self.parent_builder.build_expression(expr) } ``` **削除可否**: ✅ **安全に削除可能** **理由**: `parent_builder.build_expression()` への単純な委譲。Legacy経路でのみ呼ばれている。 --- ### 2.7 block_var_maps / incomplete_phis フィールド (mod.rs Line 34-36) **現在のコード**: ```rust /// ブロックごとの変数マップ(スコープ管理) #[allow(dead_code)] // TTL (Phase-20.5 finale): remove after LoopFormBox owns per-block maps pub(super) block_var_maps: HashMap>, /// ループ内で追跡する変数の不完全Phi node pub(super) incomplete_phis: HashMap>, ``` **使用箇所**: - `block_var_maps`: Legacy経路内のみ(continue snapshot用) - `incomplete_phis`: Legacy経路内のみ(PHI sealing用) **削除可否**: ✅ **安全に削除可能** **理由**: LoopFormBoxは独自の変数管理方式を持つ(事前確定PHI)。Legacy経路削除後は不要。 --- ### 2.8 phi_core/loop_phi.rs の Legacy専用関数 #### prepare_loop_variables_with() (Line 136-157) **使用箇所**: `prepare_loop_variables()` Line 35 のみ **削除可否**: ✅ **安全に削除可能** **理由**: `prepare_loop_variables()` がLegacy専用なので、この委譲先も削除可能。 --- #### seal_incomplete_phis_with() (Line 105-131) **使用箇所**: `seal_block()` Line 49 のみ **削除可否**: ✅ **安全に削除可能** **理由**: `seal_block()` がLegacy専用なので、この委譲先も削除可能。 --- #### save_block_snapshot() (Line 187-193) **使用箇所**: 2箇所(両方Legacy内) 1. `build_loop_legacy()` Line 185 (latch snapshot) 2. `prepare_loop_variables()` Line 30 (preheader snapshot) **削除可否**: ✅ **安全に削除可能** **理由**: すべての呼び出し元がLegacy経路内にある。 --- #### IncompletePhi 型 (Line 13-18) **定義**: ```rust #[derive(Debug, Clone)] pub struct IncompletePhi { pub phi_id: ValueId, pub var_name: String, pub known_inputs: Vec<(BasicBlockId, ValueId)>, } ``` **使用箇所**: Legacy経路のPHI sealing専用 **削除可否**: ✅ **安全に削除可能** **理由**: LoopFormBoxは事前確定PHI方式で `IncompletePhi` を使わない。 --- ### 2.9 共通使用関数(削除対象外) #### collect_carrier_assigns() (phi_core/loop_phi.rs Line 161-184) **使用箇所**: 1. `build_loop_legacy()` Line 56 (carrier hint用) 2. `LoopCarrierAnalyzerBox::analyze()` (carrier_analyzer.rs Line 75) ← **LoopFormBox経路で使用** **削除可否**: ❌ **保持(LoopFormBox経路で必要)** --- #### build_exit_phis_with() (phi_core/loop_phi.rs Line 55-101) **使用箇所**: 1. `PhiBuilderBox::build_exit_phis()` (phi_builder_box.rs) ← **LoopFormBox経路で使用** **削除可否**: ❌ **保持(LoopFormBox経路で必要)** --- ## 3. 削除手順 ### Step 1: build.rs の修正 #### 3.1 build_loop_legacy() メソッド削除(Line 40-417) ```diff - /// Legacy loop builder (DEPRECATED) - /// - /// This method will be removed after full migration to LoopFormBox. - /// To use legacy path, set `HAKO_FORCE_LEGACY_LOOP=1`. - #[deprecated(note = "Use build_loop_with_loopform instead. Legacy path will be removed.")] - fn build_loop_legacy( - &mut self, - condition: ASTNode, - body: Vec, - ) -> Result { - // ... 372行削除 ... - } ``` **削減**: **378行** (メソッド本体372行 + ドキュメント6行) --- #### 3.2 build_loop() メソッドの簡略化(Line 15-38) **Before**: ```rust /// SSA形式でループを構築 /// /// **デフォルト**: LoopFormBox経路を使用(Phase 31完了、安定版) /// **Legacy経路**: `HAKO_FORCE_LEGACY_LOOP=1` で明示的に有効化(非推奨、将来削除予定) pub fn build_loop( &mut self, condition: ASTNode, body: Vec, ) -> Result { // P0 Refactoring: ロジック逆転(LoopFormBox = デフォルト、Legacy = 明示要求のみ) let force_legacy = crate::runtime::env_gate_box::bool_any(&[ "HAKO_FORCE_LEGACY_LOOP", "NYASH_FORCE_LEGACY_LOOP", ]); if force_legacy { // Legacy path (DEPRECATED, will be removed in future) eprintln!("[DEPRECATED] Using legacy loop builder (HAKO_FORCE_LEGACY_LOOP=1). This will be removed in future versions."); return self.build_loop_legacy(condition, body); } // Default: Use LoopFormBox path (Phase 31 stable) self.build_loop_with_loopform(condition, body) } ``` **After**: ```rust /// SSA形式でループを構築(LoopFormBox経路) /// /// Phase 31.2以降、Legacy経路は削除され、LoopFormBox経路のみをサポート。 pub fn build_loop( &mut self, condition: ASTNode, body: Vec, ) -> Result { // LoopFormBox経路のみ(Legacy経路は削除済み) self.build_loop_with_loopform(condition, body) } ``` **削減**: **15行** (Legacy分岐コード + 環境変数チェック) --- ### Step 2: phi.rs の修正 #### 2.1 prepare_loop_variables() 削除(Line 14-43) ```diff - /// ループ変数の準備(事前検出または遅延生成) - pub(super) fn prepare_loop_variables( - &mut self, - header_id: BasicBlockId, - preheader_id: BasicBlockId, - loop_carried_vars: &std::collections::HashSet, - ) -> Result<(), String> { - // ... 29行削除 ... - } ``` **削減**: **30行** --- #### 2.2 seal_block() 削除(Line 46-59) ```diff - /// ブロックをシールし、不完全なPhi nodeを完成させる - pub(super) fn seal_block(&mut self, block_id: BasicBlockId, latch_id: BasicBlockId) -> Result<(), String> { - // ... 14行削除 ... - } ``` **削減**: **14行** --- #### 2.3 mark_block_unsealed() 削除(Line 78-82) ```diff - pub(super) fn mark_block_unsealed(&mut self, _block_id: BasicBlockId) -> Result<(), String> { - // ブロックはデフォルトでunsealedなので、特に何もしない - // (既にBasicBlock::newでsealed: falseに初期化されている) - Ok(()) - } ``` **削減**: **5行** --- **phi.rs 合計削減**: **49行** (30+14+5) --- ### Step 3: mod.rs の修正 #### 3.1 build_expression_with_phis() 削除(Line 333-336) ```diff - pub(super) fn build_expression_with_phis(&mut self, expr: ASTNode) -> Result { - // Phi nodeの結果を考慮しながら式を構築 - self.parent_builder.build_expression(expr) - } ``` **削減**: **4行** --- #### 3.2 LoopBuilder struct フィールド削除(Line 34-36, 31-32) **Before**: ```rust pub struct LoopBuilder<'a> { /// 親のMIRビルダーへの参照 pub(super) parent_builder: &'a mut super::builder::MirBuilder, /// ループ内で追跡する変数の不完全Phi node pub(super) incomplete_phis: HashMap>, /// ブロックごとの変数マップ(スコープ管理) #[allow(dead_code)] // TTL (Phase-20.5 finale): remove after LoopFormBox owns per-block maps pub(super) block_var_maps: HashMap>, /// ループヘッダーID(continueで使用) pub(super) loop_header: Option, /// ループラッチID(LoopFormBox経路でのcontinue用) pub(super) loop_latch: Option, /// ループ出口ID(LoopFormBox経路でのbreak用) pub(super) loop_exit: Option, /// continue文からの変数スナップショット pub(super) continue_snapshots: Vec<(BasicBlockId, HashMap)>, /// break文からの変数スナップショット(exit PHI生成用) pub(super) exit_snapshots: Vec<(BasicBlockId, HashMap)>, } ``` **After**: ```rust pub struct LoopBuilder<'a> { /// 親のMIRビルダーへの参照 pub(super) parent_builder: &'a mut super::builder::MirBuilder, /// ループヘッダーID(continueで使用、Legacy互換のため保持) pub(super) loop_header: Option, /// ループラッチID(LoopFormBox経路でのcontinue用) pub(super) loop_latch: Option, /// ループ出口ID(LoopFormBox経路でのbreak用) pub(super) loop_exit: Option, /// continue文からの変数スナップショット(Legacy互換のため保持) pub(super) continue_snapshots: Vec<(BasicBlockId, HashMap)>, /// break文からの変数スナップショット(exit PHI生成用) pub(super) exit_snapshots: Vec<(BasicBlockId, HashMap)>, } ``` **削除フィールド**: - `incomplete_phis` - Legacy専用 - `block_var_maps` - Legacy専用 **保持フィールド**: - `loop_header` - Legacy互換のため保持(将来的に `loop_latch` に統一検討) - `continue_snapshots` - Legacy互換のため保持(将来的に削除検討) - `exit_snapshots` - LoopFormBox経路で使用(保持必須) **削減**: **6行** (フィールド定義2行 + コメント4行) --- #### 3.3 LoopBuilder::new() 初期化削除(Line 133-144) **Before**: ```rust pub fn new(parent: &'a mut super::builder::MirBuilder) -> Self { Self { parent_builder: parent, incomplete_phis: HashMap::new(), block_var_maps: HashMap::new(), loop_header: None, loop_latch: None, // LoopFormBox経路でのcontinue用 loop_exit: None, // LoopFormBox経路でのbreak用 continue_snapshots: Vec::new(), exit_snapshots: Vec::new(), // exit PHI用のスナップショット } } ``` **After**: ```rust pub fn new(parent: &'a mut super::builder::MirBuilder) -> Self { Self { parent_builder: parent, loop_header: None, loop_latch: None, loop_exit: None, continue_snapshots: Vec::new(), exit_snapshots: Vec::new(), } } ``` **削減**: **2行** (初期化コード) --- **mod.rs 合計削減**: **12行** (4+6+2) --- ### Step 4: phi_core/loop_phi.rs の修正 #### 4.1 prepare_loop_variables_with() 削除(Line 133-157) ```diff -/// Prepare loop header PHIs by declaring one IncompletePhi per variable found -/// in `current_vars` (preheader snapshot), seeding each with (preheader_id, val) -/// and rebinding the variable to the newly allocated Phi result in the builder. -pub fn prepare_loop_variables_with( - ops: &mut O, - header_id: BasicBlockId, - preheader_id: BasicBlockId, - current_vars: &std::collections::HashMap, -) -> Result, String> { - // ... 21行削除 ... -} ``` **削減**: **25行** (ドキュメント4行 + 本体21行) --- #### 4.2 seal_incomplete_phis_with() 削除(Line 103-131) ```diff -/// Seal a header block by completing its incomplete PHIs with values from -/// continue snapshots and the latch block. -pub fn seal_incomplete_phis_with( - ops: &mut O, - block_id: BasicBlockId, - latch_id: BasicBlockId, - mut incomplete_phis: Vec, - continue_snapshots: &[(BasicBlockId, VarSnapshot)], -) -> Result<(), String> { - // ... 26行削除 ... -} ``` **削減**: **29行** (ドキュメント3行 + 本体26行) --- #### 4.3 save_block_snapshot() 削除(Line 186-193) ```diff -/// Save a block-local variable snapshot into the provided store. -pub fn save_block_snapshot( - store: &mut std::collections::HashMap, - block: BasicBlockId, - snapshot: &VarSnapshot, -) { - store.insert(block, snapshot.clone()); -} ``` **削減**: **8行** (ドキュメント1行 + 本体7行) --- #### 4.4 IncompletePhi 型削除(Line 11-18) ```diff -/// Loop-local placeholder of an incomplete PHI (header-time declaration). -/// Moved from loop_builder to centralize PHI-related types. -#[derive(Debug, Clone)] -pub struct IncompletePhi { - pub phi_id: ValueId, - pub var_name: String, - pub known_inputs: Vec<(BasicBlockId, ValueId)>, -} ``` **削減**: **8行** --- **phi_core/loop_phi.rs 合計削減**: **70行** (25+29+8+8) --- ### Step 5: ドキュメント更新 #### 5.1 env-variables.md の修正 **削除対象** (docs/guides/env-variables.md Line 31-35): ```diff -- `HAKO_FORCE_LEGACY_LOOP` — **DEPRECATED** Legacy loop builder を強制使用(非推奨、将来削除予定) - - Alias: `NYASH_FORCE_LEGACY_LOOP` - - 既定: `0`(OFF)。**デフォルトでLoopFormBox経路を使用**(Phase 31完了、安定版) - - `1` で明示的にLegacy経路を使用(非推奨警告が表示されます) - - **注意**: Legacy経路は将来のバージョンで削除されます。LoopFormBoxへの移行を推奨。 ``` **削減**: **5行** --- ### Step 6: テスト削除 #### 6.1 Legacy経路の明示的なテスト削除 **検索**: `HAKO_FORCE_LEGACY_LOOP=1` または `NYASH_FORCE_LEGACY_LOOP=1` を使用するテスト **予想**: 専用テストは存在しない可能性が高い(環境変数は開発者用デバッグ機能) **確認方法**: ```bash grep -r "FORCE_LEGACY_LOOP" tools/smokes/ grep -r "FORCE_LEGACY_LOOP" apps/ ``` --- ## 4. テスト計画 ### 4.1 ビルドテスト ```bash # Step 1: クリーンビルド cargo clean cargo build --release # 期待結果: ビルド成功、警告なし ``` --- ### 4.2 スモークテスト(Quick Profile) ```bash # Step 2: Quick profile実行 tools/smokes/v2/run.sh --profile quick # 期待結果: 全テストPASS(現在のベースライン: 272/296 PASS) ``` --- ### 4.3 スモークテスト(Integration Profile) ```bash # Step 3: Integration profile実行 tools/smokes/v2/run.sh --profile integration # 期待結果: 全テストPASS ``` --- ### 4.4 Legacy経路の削除確認 ```bash # Step 4: Legacy環境変数を設定しても動作確認 HAKO_FORCE_LEGACY_LOOP=1 ./target/release/hakorune apps/tests/loop_min_while.nyash # 期待結果: # - エラーなく実行(環境変数は無視される) # - 非推奨警告は表示されない(Legacy経路が存在しないため) ``` --- ### 4.5 LoopFormBox経路の動作確認 ```bash # Step 5: LoopFormBox経路で複雑なループテスト ./target/release/hakorune apps/tests/loop_nested.nyash ./target/release/hakorune apps/tests/loop_break_continue.nyash ./target/release/hakorune apps/examples/json_query/main.nyash # 期待結果: すべて正常実行 ``` --- ## 5. Rollback計画 ### 5.1 Git Reset ```bash # オプション1: Stash(一時退避) git stash save "Legacy loop builder deletion - rollback point" # オプション2: Commit後にRevert git revert # オプション3: Hard Reset(危険!) git reset --hard HEAD~1 ``` --- ### 5.2 ファイル単位のRollback ```bash # 特定ファイルのみ復元 git checkout HEAD -- src/mir/loop_builder/build.rs git checkout HEAD -- src/mir/loop_builder/phi.rs git checkout HEAD -- src/mir/loop_builder/mod.rs git checkout HEAD -- src/mir/phi_core/loop_phi.rs git checkout HEAD -- docs/guides/env-variables.md ``` --- ## 6. リスク分析 ### 6.1 高リスク(Rollback必須レベル) **リスク**: LoopFormBox経路にバグがあり、Legacy経路が実は必要だった **確率**: ⚠️ 低(Phase 31で十分にテスト済み) **影響**: スモークテスト全体が失敗する可能性 **軽減策**: 1. 削除前にスモークテスト全PASS確認(Quick + Integration) 2. 削除後も段階的にコミット(Step 1-3を別々にコミット) 3. 問題発見時は即座にRollback --- ### 6.2 中リスク(修正可能レベル) **リスク1**: `loop_header` フィールドの削除漏れでLegacy互換性が残る **確率**: ⚠️ 中 **影響**: デッドコード残存(機能的には問題なし) **軽減策**: Step 3.2で `loop_header` フィールドの保持理由を明確化(コメント追加) --- **リスク2**: `continue_snapshots` がLegacy専用かLoopFormBox共通か不明確 **確率**: ⚠️ 中 **影響**: 必要なフィールドを削除してしまう可能性 **軽減策**: 1. `continue_snapshots` の使用箇所を再確認 2. LoopFormBox経路でも使用されている場合は保持 --- ### 6.3 低リスク(軽微な影響) **リスク1**: ドキュメント更新漏れ **確率**: ✅ 低 **影響**: ユーザー混乱(機能的には問題なし) **軽減策**: Step 5でドキュメント一括更新 --- **リスク2**: `collect_carrier_assigns()` の削除誤判定 **確率**: ✅ 極低(確認済み: LoopCarrierAnalyzerBoxが使用) **影響**: LoopFormBox経路が壊れる **軽減策**: Step 4で明示的に保持(削除対象外リストに記載) --- ## 7. 推奨実行順序 ### Phase 1: 事前確認(1日) ```bash # 1. 現在のベースライン確認 tools/smokes/v2/run.sh --profile quick > baseline_quick.log tools/smokes/v2/run.sh --profile integration > baseline_integration.log # 2. 依存関係の最終確認 grep -r "build_loop_legacy\|prepare_loop_variables\|seal_block\|mark_block_unsealed\|build_expression_with_phis" src/mir/loop_builder/ grep -r "prepare_loop_variables_with\|seal_incomplete_phis_with\|save_block_snapshot\|IncompletePhi" src/mir/phi_core/ # 3. Git branch作成 git checkout -b phase31.2-legacy-loop-deletion ``` --- ### Phase 2: Step 1-3実装(1日) ```bash # Step 1: build.rs 修正 # - build_loop_legacy() 削除 (Line 40-417) # - build_loop() 簡略化 (Line 15-38) # Step 2: phi.rs 修正 # - prepare_loop_variables() 削除 (Line 14-43) # - seal_block() 削除 (Line 46-59) # - mark_block_unsealed() 削除 (Line 78-82) # Step 3: mod.rs 修正 # - build_expression_with_phis() 削除 (Line 333-336) # - LoopBuilder struct フィールド削除 # - LoopBuilder::new() 初期化削除 # 中間テスト cargo build --release tools/smokes/v2/run.sh --profile quick ``` --- ### Phase 3: Step 4-5実装(0.5日) ```bash # Step 4: phi_core/loop_phi.rs 修正 # - prepare_loop_variables_with() 削除 # - seal_incomplete_phis_with() 削除 # - save_block_snapshot() 削除 # - IncompletePhi 型削除 # Step 5: ドキュメント更新 # - docs/guides/env-variables.md 修正 # 最終テスト cargo build --release tools/smokes/v2/run.sh --profile quick tools/smokes/v2/run.sh --profile integration ``` --- ### Phase 4: レビュー&コミット(0.5日) ```bash # 1. 変更内容確認 git diff --stat git diff src/mir/loop_builder/ git diff src/mir/phi_core/ # 2. コミット git add src/mir/loop_builder/build.rs git add src/mir/loop_builder/phi.rs git add src/mir/loop_builder/mod.rs git add src/mir/phi_core/loop_phi.rs git add docs/guides/env-variables.md git commit -m "refactor(phase31.2): Delete Legacy loop builder path (-493 lines) - Delete build_loop_legacy() and 5 helper methods - Simplify build_loop() to LoopFormBox-only - Remove Legacy-specific fields (incomplete_phis, block_var_maps) - Delete 4 phi_core helpers (prepare/seal/save/IncompletePhi) - Update env-variables.md (remove HAKO_FORCE_LEGACY_LOOP) Total reduction: 493 lines Smoke tests: 272/296 PASS (baseline maintained)" # 3. Push git push origin phase31.2-legacy-loop-deletion ``` --- ## 8. 成功基準 ### 8.1 定量的基準 - ✅ **コード削減**: 最低 **450行** 削減(目標: 493行) - ✅ **ビルド成功**: `cargo build --release` 警告なし - ✅ **Quick Profile**: 272/296 PASS以上(ベースライン維持) - ✅ **Integration Profile**: 全PASS --- ### 8.2 定性的基準 - ✅ **コードの単純化**: `build_loop()` がシンプルになる(Legacy分岐削除) - ✅ **保守性向上**: Legacy経路のメンテナンスコストがゼロになる - ✅ **将来性**: LoopFormBox経路のみに集中できる --- ## 9. Next Steps(将来の最適化候補) ### 9.1 loop_header フィールドの削除検討 **現状**: Legacy互換のため保持 **将来**: `loop_latch` に統一して `loop_header` を削除 **削減見込み**: 5-10行 --- ### 9.2 continue_snapshots の削除検討 **現状**: Legacy互換のため保持 **調査**: LoopFormBox経路で本当に必要か確認 **削減見込み**: 10-15行 --- ### 9.3 block_var_maps 削除の波及効果 **影響**: `get_variable_at_block()` メソッドが不要になる可能性 **削減見込み**: 15-20行 --- ## 10. まとめ ### 削除対象サマリー(再掲) | カテゴリ | ファイル | 削減見込み | |---------|---------|----------| | Legacy main | build.rs | 393行 | | Legacy helpers | phi.rs | 49行 | | Legacy helpers | mod.rs | 12行 | | Legacy core | phi_core/loop_phi.rs | 70行 | | Documentation | env-variables.md | 5行 | | **合計** | | **529行** | **注**: 実際の削減は **493行** を見込み(空行・コメント含む調整) --- ### リスク・軽減策サマリー | リスク | 確率 | 影響 | 軽減策 | |--------|------|------|--------| | LoopFormBoxバグ | 低 | 高 | 事前スモークテスト全PASS確認 | | フィールド削除漏れ | 中 | 低 | コメント明確化・段階的コミット | | ドキュメント漏れ | 低 | 低 | 一括更新チェックリスト | --- ### 推奨アプローチ **戦略**: 段階的削除(Step 1-3 → Step 4-5) **理由**: 1. 問題発見時のRollback範囲を最小化 2. 中間テストで早期検証 3. レビューしやすい **期間**: 合計 **2-3日**(実装2日、レビュー0.5日、予備0.5日) --- **Prepared by**: Claude (AI Agent) **Date**: 2025-10-19 **Phase**: 31.2 - Legacy Loop Builder Deletion