feat(joinir): Phase 220-B ConditionEnv integration for if-sum lowerer
Integrates ConditionEnv infrastructure into if-sum lowerer to support variable conditions like `loop(i < len)`. ## Implementation (Following Pattern 2) ### ConditionEnv Construction - Added early construction via ConditionEnvBuilder::build_for_break_condition_v2() - Extracts condition variables from loop condition AST - Creates ConditionBindings for HOST↔JoinIR ValueId mapping ### Variable Support - Created ValueOrLiteral enum (Literal(i64) | Variable(String, ValueId)) - Added extract_value_or_variable() with ConditionEnv lookup - Updated extract_loop_condition() and extract_if_condition() ### JoinIR Generation Updates - Condition-only variables as loop_step function parameters - Proper parameter passing in recursive calls - Condition ValueIds in JoinIR param region (100+) ### Boundary Builder Wiring - Pass condition_bindings to JoinInlineBoundaryBuilder - Updated call site in pattern3_with_if_phi.rs - Added variable_map, loop_var_name, loop_var_id parameters ## Build Status ✅ Compilation successful (0 errors, 3 warnings) ## Test Status ⏳ Tests not yet passing - remap issue identified: - HOST: len = ValueId(6) - JoinIR: len = ValueId(101) - After Merge: len = ValueId(10) ❌ Root cause: JoinIRConversionPipeline remap needs investigation ## Files Modified - src/mir/join_ir/lowering/loop_with_if_phi_if_sum.rs (+80 lines) - ConditionEnv construction - Variable support in conditions - Updated function signatures - src/mir/builder/control_flow/joinir/patterns/pattern3_with_if_phi.rs (+10 lines) - Pass builder/loop_var to lowerer - Wire condition_bindings ## Design Principles 1. Reuse Existing Boxes (ConditionEnv/ConditionBinding) 2. Follow Pattern 2 Structure (proven blueprint) 3. Fail-Fast (variable not in ConditionEnv → error) 4. ParamRole::Condition Routing (separate from carriers) ## Next Steps: Phase 220-C Fix remap issue in JoinIRConversionPipeline to properly use condition_bindings.host_value during merge. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -112,12 +112,15 @@ impl MirBuilder {
|
||||
"[cf_loop/pattern3] if-sum pattern detected but no if statement found".to_string()
|
||||
})?;
|
||||
|
||||
// Call AST-based if-sum lowerer
|
||||
let (join_module, fragment_meta) = lower_if_sum_pattern(
|
||||
// Phase 220-B: Call AST-based if-sum lowerer with ConditionEnv support
|
||||
let (join_module, fragment_meta, cond_bindings) = lower_if_sum_pattern(
|
||||
condition,
|
||||
if_stmt,
|
||||
body,
|
||||
&mut join_value_space,
|
||||
&self.variable_map, // Phase 220-B: Pass variable_map for ConditionEnv
|
||||
&ctx.loop_var_name, // Phase 220-B: Pass loop variable name
|
||||
ctx.loop_var_id, // Phase 220-B: Pass loop variable ValueId
|
||||
)?;
|
||||
|
||||
let exit_meta = &fragment_meta.exit_meta;
|
||||
@ -173,11 +176,17 @@ impl MirBuilder {
|
||||
)
|
||||
);
|
||||
|
||||
// Phase 215-2: Pass expr_result to boundary
|
||||
// Phase 220-B: Wire condition_bindings to boundary builder
|
||||
trace::trace().debug(
|
||||
"pattern3/if-sum",
|
||||
&format!("Wiring {} condition bindings to boundary", cond_bindings.len())
|
||||
);
|
||||
|
||||
let mut boundary_builder = JoinInlineBoundaryBuilder::new()
|
||||
.with_inputs(join_inputs, host_inputs)
|
||||
.with_exit_bindings(exit_bindings)
|
||||
.with_loop_var_name(Some(ctx.loop_var_name.clone()));
|
||||
.with_loop_var_name(Some(ctx.loop_var_name.clone()))
|
||||
.with_condition_bindings(cond_bindings); // Phase 220-B: Add condition bindings
|
||||
|
||||
// Add expr_result if present
|
||||
if let Some(expr_id) = fragment_meta.expr_result {
|
||||
|
||||
Reference in New Issue
Block a user