diff --git a/src/mir/builder/control_flow/joinir/patterns/pattern3_with_if_phi.rs b/src/mir/builder/control_flow/joinir/patterns/pattern3_with_if_phi.rs index 21749c9d..78905632 100644 --- a/src/mir/builder/control_flow/joinir/patterns/pattern3_with_if_phi.rs +++ b/src/mir/builder/control_flow/joinir/patterns/pattern3_with_if_phi.rs @@ -50,44 +50,39 @@ pub fn lower( } impl MirBuilder { - /// Phase 188-Impl-3: Pattern 3 (Loop with If-Else PHI) minimal lowerer + /// Phase 179-B: Pattern 3 (Loop with If-Else PHI) minimal lowerer /// - /// Handles loops with if-else statements that assign to carrier variables. + /// **Refactored**: Now uses PatternPipelineContext for unified preprocessing /// - /// # Steps - /// 1. Extract loop variables (carriers: i + sum) - /// 2. Generate JoinIR using loop_with_if_phi_minimal - /// 3. Convert JoinModule → MirModule - /// 4. Create JoinInlineBoundary for input mapping - /// 5. Merge MIR blocks into current_function - /// 6. Return Void (loop doesn't produce values) + /// # Pipeline (Phase 179-B) + /// 1. Build preprocessing context → PatternPipelineContext + /// 2. Call JoinIR lowerer → JoinModule + /// 3. Create boundary from context → JoinInlineBoundary + /// 4. Merge MIR blocks → JoinIRConversionPipeline pub(in crate::mir::builder) fn cf_loop_pattern3_with_if_phi( &mut self, condition: &ASTNode, - _body: &[ASTNode], + body: &[ASTNode], _func_name: &str, debug: bool, ) -> Result, String> { use crate::mir::join_ir::lowering::loop_with_if_phi_minimal::lower_loop_with_if_phi_pattern; - use crate::mir::BasicBlockId; - use std::collections::BTreeSet; // Phase 195: Use unified trace trace::trace().debug("pattern3", "Calling Pattern 3 minimal lowerer"); - // Phase 33-22: Use CommonPatternInitializer for loop variable extraction - use super::common_init::CommonPatternInitializer; - let (loop_var_name, loop_var_id, carrier_info) = - CommonPatternInitializer::initialize_pattern( - self, - condition, - &self.variable_map, - None, // Pattern 3 includes all carriers (i + sum) - )?; + // Phase 179-B: Use PatternPipelineContext for unified preprocessing + use super::pattern_pipeline::{build_pattern_context, PatternVariant}; + let ctx = build_pattern_context( + self, + condition, + body, + PatternVariant::Pattern3, + )?; - // Phase 33-22: Extract sum_var_id from carrier_info + // Phase 179-B: Extract sum_var_id from context // Pattern 3 specifically needs the "sum" carrier - let sum_var_id = carrier_info.carriers.iter() + let sum_var_id = ctx.carrier_info.carriers.iter() .find(|c| c.name == "sum") .ok_or_else(|| { format!( @@ -99,19 +94,8 @@ impl MirBuilder { // Phase 195: Use unified trace trace::trace().varmap("pattern3_start", &self.variable_map); - // Phase 171-172: Use LoopScopeShapeBuilder for unified initialization (Issue 4) - // Pattern 3 lowerer ignores the scope anyway, so this is just a placeholder - use super::loop_scope_shape_builder::LoopScopeShapeBuilder; - let scope = LoopScopeShapeBuilder::empty_body_locals( - BasicBlockId(0), - BasicBlockId(0), - BasicBlockId(0), - BasicBlockId(0), - BTreeSet::new(), - ); - - // Call Pattern 3 lowerer - let join_module = match lower_loop_with_if_phi_pattern(scope) { + // Call Pattern 3 lowerer with preprocessed scope + let join_module = match lower_loop_with_if_phi_pattern(ctx.loop_scope) { Some(module) => module, None => { // Phase 195: Use unified trace @@ -120,17 +104,16 @@ impl MirBuilder { } }; - // Phase 33-22: Create boundary for JoinIR conversion + // Phase 179-B: Create boundary from context // Phase 201: Use JoinInlineBoundaryBuilder for clean construction // Canonical Builder pattern - see docs/development/current/main/joinir-boundary-builder-pattern.md - // Pattern 3 has TWO carriers: i and sum self.trace_varmap("pattern3_before_merge"); use crate::mir::join_ir::lowering::JoinInlineBoundaryBuilder; use crate::mir::join_ir::lowering::inline_boundary::LoopExitBinding; let boundary = JoinInlineBoundaryBuilder::new() .with_inputs( vec![ValueId(0), ValueId(1)], // JoinIR's main() parameters (i, sum init) - vec![loop_var_id, sum_var_id], // Host's loop variables + vec![ctx.loop_var_id, sum_var_id], // Host's loop variables ) .with_exit_bindings(vec![ // Phase 33-16: Only include non-loop-variable carriers in exit_bindings @@ -141,12 +124,12 @@ impl MirBuilder { host_slot: sum_var_id, // variable_map["sum"] } ]) - .with_loop_var_name(Some(loop_var_name.clone())) // Phase 33-16: Enable header PHI generation for SSA correctness + .with_loop_var_name(Some(ctx.loop_var_name.clone())) // Phase 33-16: Enable header PHI generation for SSA correctness .build(); // Phase 33-22: Use JoinIRConversionPipeline for unified conversion flow use super::conversion_pipeline::JoinIRConversionPipeline; - let _exit_phi_result = JoinIRConversionPipeline::execute( + let _ = JoinIRConversionPipeline::execute( self, join_module, Some(&boundary), @@ -155,9 +138,7 @@ impl MirBuilder { )?; self.trace_varmap("pattern3_after_merge"); - // Phase 189-Refine: variable_map の更新は merge_joinir_mir_blocks 内で - // JoinInlineBoundary.host_outputs を用いて行われる。 - // この関数では Void を返すだけでよい(戻り値は後続の `return sum` が扱う)。 + // Phase 179-B: Return Void (loop doesn't produce values) let void_val = crate::mir::builder::emission::constant::emit_void(self); // Phase 195: Use unified trace