From 94f992f574cd29e82ed0733c8ff21d3e297823e9 Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Mon, 8 Dec 2025 19:44:45 +0900 Subject: [PATCH] refactor(joinir): Unify Pattern 3 with PatternPipelineContext MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 179-B Task 4: Refactor Pattern 3 to use PatternPipelineContext for unified preprocessing. Changes: - Use build_pattern_context() for loop variable extraction and scope construction - Extract sum_var_id from ctx.carrier_info instead of direct initialization - Reduce line count: 168 โ†’ 149 lines (11% reduction, lower than target due to already optimized code) - Maintain exact same behavior and test compatibility Benefits: - Consistent preprocessing logic with Pattern 1 - Single source of truth for carrier analysis - Cleaner separation of concerns (analysis vs lowering) ๐Ÿค– Generated with Claude Code (https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../joinir/patterns/pattern3_with_if_phi.rs | 69 +++++++------------ 1 file changed, 25 insertions(+), 44 deletions(-) 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