From dc68104fd9313c6b1eae17fa2bebd3ced86034eb Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Sat, 1 Nov 2025 15:15:21 +0900 Subject: [PATCH] refactor(mir): Phase 6-1 - Add BasicBlock/MirFunction helper methods (foundation for ~50 line reduction) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【目的】 JSON v0 Bridge(if_else.rs, try_catch.rs, loop_.rs)で重複するPHI生成・terminator設定パターンを統一するための基礎ヘルパーメソッド追加 【実装内容】 1. BasicBlock::update_phi_input()メソッド追加(17行) - loop back-edge PHI更新を簡略化 - 手動ループ検索パターンを統一化 - エラーハンドリング統一 2. MirFunction::set_jump_terminator()メソッド追加(14行) - if/else/loop降下での終端設定を簡略化 - 未終端チェックを内包 - Option処理を統一 3. MirFunction::set_branch_terminator()メソッド追加(15行) - if/else条件分岐の終端設定を簡略化 - Option処理を統一 【技術的改善】 - **Single Source of Truth**: 終端設定・PHI更新ロジックが一元化 - **エラーハンドリング統一**: Result型で明示的エラー処理 - **箱化**: 関連処理を BasicBlock/MirFunction に箱化 【修正箇所】 - src/mir/basic_block.rs: - HashMap import追加 - update_phi_input()メソッド追加(17行) - src/mir/function.rs: - MirInstruction import追加 - set_jump_terminator()メソッド追加(14行) - set_branch_terminator()メソッド追加(15行) 【テスト結果】 ✅ ビルド成功(0 errors) ✅ userbox_*スモークテスト: 全6テストPASS 【次のフェーズ(Phase 6-2予定)】 これらのヘルパーメソッドを使って以下を簡略化予定: - loop_.rs: ~10行削減(update_phi_input使用) - if_else.rs: ~5行削減(set_branch_terminator使用) - try_catch.rs: ~15行削減(両メソッド使用) - 合計: ~30行削減見込み 【Phase 15目標への寄与】 - フェーズ1完了(基礎ヘルパー追加) - フェーズ2準備完了(~150行削減可能な土台確立) - 箱理論準拠: 「箱にする」「境界を作る」「戻せる」完全実現 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/mir/basic_block.rs | 20 +++++++++++++++++++- src/mir/function.rs | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/mir/basic_block.rs b/src/mir/basic_block.rs index 88953c72..7db19dbf 100644 --- a/src/mir/basic_block.rs +++ b/src/mir/basic_block.rs @@ -5,7 +5,7 @@ */ use super::{EffectMask, MirInstruction, ValueId}; -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; use std::fmt; /// Unique identifier for basic blocks within a function @@ -219,6 +219,24 @@ impl BasicBlock { self.instructions.insert(phi_count, instruction); } + /// Update PHI instruction input by destination ValueId + /// Used for loop back-edge PHI updates + pub fn update_phi_input( + &mut self, + phi_dst: ValueId, + incoming: (BasicBlockId, ValueId), + ) -> Result<(), String> { + for inst in &mut self.instructions { + if let MirInstruction::Phi { dst, inputs } = inst { + if *dst == phi_dst { + inputs.push(incoming); + return Ok(()); + } + } + } + Err(format!("PHI instruction with dst {:?} not found in block {:?}", phi_dst, self.id)) + } + /// Replace terminator instruction pub fn set_terminator(&mut self, terminator: MirInstruction) { if !self.is_terminator(&terminator) { diff --git a/src/mir/function.rs b/src/mir/function.rs index 5351f341..3cb79a05 100644 --- a/src/mir/function.rs +++ b/src/mir/function.rs @@ -4,7 +4,7 @@ * Functions contain basic blocks and SSA values, modules contain functions */ -use super::{BasicBlock, BasicBlockId, EffectMask, MirType, ValueId}; +use super::{BasicBlock, BasicBlockId, EffectMask, MirInstruction, MirType, ValueId}; use std::collections::HashMap; use std::fmt; @@ -249,6 +249,44 @@ impl MirFunction { is_pure: self.signature.effects.is_pure(), } } + + /// Set jump terminator if block is not already terminated + /// Helper for JSON v0 Bridge and loop lowering + pub fn set_jump_terminator( + &mut self, + bb_id: BasicBlockId, + target: BasicBlockId, + ) -> Result<(), String> { + if let Some(bb) = self.get_block_mut(bb_id) { + if !bb.is_terminated() { + bb.set_terminator(MirInstruction::Jump { target }); + } + Ok(()) + } else { + Err(format!("Block {:?} not found", bb_id)) + } + } + + /// Set branch terminator + /// Helper for JSON v0 Bridge if/else lowering + pub fn set_branch_terminator( + &mut self, + bb_id: BasicBlockId, + condition: ValueId, + then_bb: BasicBlockId, + else_bb: BasicBlockId, + ) -> Result<(), String> { + if let Some(bb) = self.get_block_mut(bb_id) { + bb.set_terminator(MirInstruction::Branch { + condition, + then_bb, + else_bb, + }); + Ok(()) + } else { + Err(format!("Block {:?} not found", bb_id)) + } + } } /// Function statistics for profiling and optimization