This document identifies all locations in `loop_with_break_minimal.rs` where the Pattern2 lowerer currently only handles the position carrier (`i`) and ignores additional carriers from `CarrierInfo.carriers`.
## Limitation Points
### 1. ValueId Allocation (Line 172-173)
**Location**: ValueId allocation section
**Current Behavior**: Only allocates ValueIds for the position carrier (`i_init`, `i_param`, `i_next`, `i_exit`)
**Missing**: No allocation for additional carriers (e.g., `sum_init`, `sum_param`, `sum_next`, `sum_exit`)
```rust
// TODO(Phase 176): Multi-carrier support - currently only allocates position carrier
// Future: iterate over CarrierInfo.carriers and allocate for each carrier
```
**Impact**: Cannot represent multi-carrier loops in JoinIR local ValueId space.
---
### 2. Main Function Parameters (Line 208-209)
**Location**: `main()` function creation
**Current Behavior**: Only takes `i_init` as parameter
**Missing**: Should take all carrier init values as parameters
```rust
// TODO(Phase 176): Multi-carrier support - main() params should include all carriers
// Future: params = vec![i_init, sum_init, count_init, ...] from CarrierInfo
let mut main_func = JoinFunction::new(main_id, "main".to_string(), vec![i_init]);
```
**Impact**: Additional carriers cannot be passed into the JoinIR fragment.
---
### 3. Loop Step Call Arguments (Line 214-215)
**Location**: `main()` → `loop_step()` call
**Current Behavior**: Only passes `i_init` to `loop_step()`
**Missing**: Should pass all carrier init values
```rust
// TODO(Phase 176): Multi-carrier support - Call args should include all carrier inits
// Future: args = vec![i_init, sum_init, count_init, ...] from CarrierInfo
main_func.body.push(JoinInst::Call {
func: loop_step_id,
args: vec![i_init], // Only position carrier
k_next: None,
dst: Some(loop_result),
});
```
**Impact**: Additional carriers lost at loop entry.
---
### 4. Loop Step Function Parameters (Line 234-235)
**Location**: `loop_step()` function creation
**Current Behavior**: Only takes `i_param` as parameter
**Missing**: Should take all carrier params
```rust
// TODO(Phase 176): Multi-carrier support - loop_step params should include all carriers
// Future: params = vec![i_param, sum_param, count_param, ...] from CarrierInfo
let exit_meta = ExitMeta::single(loop_var_name.to_string(), i_exit);
```
**Impact**: Additional carriers not visible to MIR merge layer - no carrier PHIs generated!
---
## Summary Statistics
- **Total Limitation Points**: 10
- **Easy Fixes** (iteration over CarrierInfo): 9 points
- **Hard Fix** (requires AST body analysis): 1 point (Loop Body Updates)
## Architecture Note
The CarrierInfo structure is already multi-carrier ready:
```rust
pub struct CarrierInfo {
pub loop_var_name: String, // Position carrier
pub loop_var_id: ValueId, // Host ValueId
pub carriers: Vec<CarrierVar>, // Additional carriers (THIS IS IGNORED!)
pub trim_helper: Option<TrimLoopHelper>,
}
```
The problem is that `lower_loop_with_break_minimal()` completely ignores `CarrierInfo.carriers` and only uses `loop_var_name` (passed as a separate string parameter).