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:
@ -0,0 +1,135 @@
|
||||
# Phase 220-B: ConditionEnv Integration for If-Sum
|
||||
|
||||
## Overview
|
||||
Integrated ConditionEnv infrastructure into if-sum lowerer to support
|
||||
variable conditions like `loop(i < len)`.
|
||||
|
||||
## Implementation Status
|
||||
|
||||
### Completed
|
||||
- ✅ ConditionEnv construction in `lower_if_sum_pattern()`
|
||||
- ✅ `extract_value_or_variable()` function (supports both literals and variables)
|
||||
- ✅ Updated `extract_loop_condition()` and `extract_if_condition()` to use ConditionEnv
|
||||
- ✅ JoinIR generation includes condition-only variables as parameters
|
||||
- ✅ Condition bindings wired to boundary builder
|
||||
- ✅ Updated call sites in `pattern3_with_if_phi.rs`
|
||||
|
||||
### In Progress
|
||||
- 🔧 **Issue**: phase212_if_sum_min.hako returns RC=0 instead of RC=2
|
||||
- 🔧 **Root Cause**: Condition variable (`len`) remapping issue during merge
|
||||
- HOST ValueId(6) → JoinIR ValueId(101) → After merge ValueId(10) ❌
|
||||
- Expected: HOST ValueId(6) → JoinIR ValueId(101) → After merge ValueId(6) ✅
|
||||
- 🔧 **Next Step**: Investigate condition_bindings handling in merge pipeline
|
||||
|
||||
## Implementation
|
||||
|
||||
### Pattern 2 Reference
|
||||
Followed proven Pattern 2 (break condition) integration pattern:
|
||||
1. Build ConditionEnv early with extract_condition_variables
|
||||
2. Pass to condition lowering functions
|
||||
3. Lookup variables via cond_env.get()
|
||||
4. Wire condition_bindings to JoinInlineBoundary
|
||||
|
||||
### Key Changes
|
||||
|
||||
**File**: `src/mir/join_ir/lowering/loop_with_if_phi_if_sum.rs`
|
||||
- Added ConditionEnv construction (lines 70-127)
|
||||
- Updated signature to accept `variable_map`, `loop_var_name`, `loop_var_id`
|
||||
- Return type changed to include `Vec<ConditionBinding>`
|
||||
- JoinIR generation updated to include condition variables as parameters
|
||||
|
||||
**File**: `src/mir/builder/control_flow/joinir/patterns/pattern3_with_if_phi.rs`
|
||||
- Updated call site to pass variable_map and loop context
|
||||
- Wired condition_bindings to boundary builder (line 189)
|
||||
|
||||
### ValueOrLiteral Enum
|
||||
```rust
|
||||
enum ValueOrLiteral {
|
||||
Literal(i64),
|
||||
Variable(String, ValueId),
|
||||
}
|
||||
```
|
||||
|
||||
### Function Signatures Updated
|
||||
```rust
|
||||
fn extract_value_or_variable(
|
||||
node: &ASTNode,
|
||||
cond_env: &ConditionEnv,
|
||||
) -> Result<ValueOrLiteral, String>
|
||||
|
||||
fn extract_loop_condition(
|
||||
cond: &ASTNode,
|
||||
cond_env: &ConditionEnv,
|
||||
) -> Result<(String, CompareOp, ValueOrLiteral), String>
|
||||
```
|
||||
|
||||
## Test Results (Preliminary)
|
||||
|
||||
### phase212_if_sum_min.hako
|
||||
- Expected: RC=2
|
||||
- Actual: RC=0 ❌
|
||||
- Issue: Loop not executing (no print output)
|
||||
- Debug: Condition variable `len` extracted correctly but remapping issue
|
||||
|
||||
### Debug Trace
|
||||
```
|
||||
[joinir/pattern3/if-sum] Extracted 1 condition variables: ["len"]
|
||||
[joinir/pattern3/if-sum] Condition variable 'len': host=ValueId(6), join=ValueId(101)
|
||||
[if-sum/joinir] loop_step params: 4 total (3 carriers + 1 condition vars)
|
||||
[DEBUG-177] 'len': JoinIR ValueId(101) → Some(ValueId(10)) ← Should be ValueId(6)
|
||||
```
|
||||
|
||||
## 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
|
||||
|
||||
1. **Investigate Merge Pipeline**:
|
||||
- Check how condition_bindings are processed in JoinIRConversionPipeline
|
||||
- Verify that condition variables are loaded at loop entry
|
||||
- Ensure remapping uses host_value from ConditionBinding
|
||||
|
||||
2. **Add Load Instructions**:
|
||||
- May need to generate Load instructions for condition variables at loop entry
|
||||
- Similar to how Pattern 2 handles break condition variables
|
||||
|
||||
3. **Test Additional Cases**:
|
||||
- phase218_json_if_sum_min.hako (expect RC=10)
|
||||
- Regression: loop_if_phi.hako (expect RC=2)
|
||||
- Regression: phase217_if_sum_multi_min.hako (expect RC=2)
|
||||
|
||||
## Files Modified
|
||||
|
||||
**Primary**:
|
||||
- `src/mir/join_ir/lowering/loop_with_if_phi_if_sum.rs` (ConditionEnv integration)
|
||||
- `src/mir/builder/control_flow/joinir/patterns/pattern3_with_if_phi.rs` (call site update)
|
||||
|
||||
**Documentation**:
|
||||
- `docs/development/current/main/phase220-condition-env-integration.md` (this file)
|
||||
|
||||
## Important Notes
|
||||
|
||||
- **Fail-Fast Maintained**: Variables not in ConditionEnv cause explicit errors
|
||||
- **Method Call Limitation**: `defs.len()` style not supported yet (Phase 221+)
|
||||
- **Pattern 2 Parity**: Uses identical ConditionEnvBuilder API
|
||||
- **ParamRole Separation**: Condition variables kept separate from carriers
|
||||
|
||||
## Known Issues
|
||||
|
||||
1. **Condition Variable Remapping** (Critical):
|
||||
- Condition variables get remapped to wrong ValueIds during merge
|
||||
- Need to verify condition_bindings handling in merge pipeline
|
||||
|
||||
2. **No Test Passing Yet**:
|
||||
- phase212: RC=0 (expected 2) ❌
|
||||
- Other tests not yet verified
|
||||
|
||||
## References
|
||||
|
||||
- [Phase 171-fix: ConditionEnv](../../../reference/joinir/condition-env.md)
|
||||
- [Phase 200-A/B: ConditionBinding](../../../reference/joinir/condition-binding.md)
|
||||
- [Phase 201: JoinValueSpace](../../../reference/joinir/join-value-space.md)
|
||||
- [Pattern 2: Break Condition](./pattern2-break-condition.md)
|
||||
Reference in New Issue
Block a user