diff --git a/src/mir/builder/control_flow/joinir/patterns/pattern2_with_break.rs b/src/mir/builder/control_flow/joinir/patterns/pattern2_with_break.rs index e4adb5e4..26c8aff5 100644 --- a/src/mir/builder/control_flow/joinir/patterns/pattern2_with_break.rs +++ b/src/mir/builder/control_flow/joinir/patterns/pattern2_with_break.rs @@ -276,7 +276,17 @@ fn promote_and_prepare_carriers( promoted_var, carrier_name, } => { - promoted_pairs.push((promoted_var.clone(), carrier_name.clone())); + // Phase 133 P1: Check if this is a Trim promotion (A-3 pattern) + // Trim promotions are handled by TrimLoopLowerer (apply_trim_and_normalize) + // which provides SSOT for env/join_id, so we defer to that path. + let is_trim_promotion = promoted_carrier.trim_helper().is_some(); + + // Phase 133 P1: Only add to promoted_pairs for non-Trim promotions + // (e.g., DigitPos/A-4). Trim carriers don't have join_id in carrier_info + // because they use loop_var_name instead of carriers vector. + if !is_trim_promotion { + promoted_pairs.push((promoted_var.clone(), carrier_name.clone())); + } #[cfg(feature = "normalized_dev")] { @@ -339,6 +349,13 @@ fn promote_and_prepare_carriers( helper.carrier_name, helper.original_var, helper.whitespace_chars ), ); + log_pattern2( + verbose, + "phase133", + format!( + "Phase 133 P1: Trim promotion deferred to TrimLoopLowerer (SSOT for env/join_id)" + ), + ); } else { return Err(error_messages::format_error_pattern2_trim_not_safe( &helper.carrier_name, @@ -347,20 +364,24 @@ fn promote_and_prepare_carriers( } } - inputs.break_condition_node = DigitPosConditionNormalizer::normalize( - &inputs.break_condition_node, - &promoted_var, - &carrier_name, - ); + // Phase 133 P1: Only normalize for non-Trim promotions + // Trim promotions are normalized by TrimLoopLowerer + if !is_trim_promotion { + inputs.break_condition_node = DigitPosConditionNormalizer::normalize( + &inputs.break_condition_node, + &promoted_var, + &carrier_name, + ); - log_pattern2( - verbose, - "phase224e", - format!( - "Normalized break condition for promoted variable '{}' → carrier '{}'", - promoted_var, carrier_name - ), - ); + log_pattern2( + verbose, + "phase224e", + format!( + "Normalized break condition for promoted variable '{}' → carrier '{}'", + promoted_var, carrier_name + ), + ); + } } ConditionPromotionResult::CannotPromote { reason, vars } => { return Err(error_messages::format_error_pattern2_promotion_failed(