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:
nyash-codex
2025-12-10 02:54:56 +09:00
parent e6e306c020
commit 2fc2cf74d1
3 changed files with 366 additions and 47 deletions

View File

@ -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 {