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>
4.8 KiB
4.8 KiB
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()andextract_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:
- Build ConditionEnv early with extract_condition_variables
- Pass to condition lowering functions
- Lookup variables via cond_env.get()
- 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
enum ValueOrLiteral {
Literal(i64),
Variable(String, ValueId),
}
Function Signatures Updated
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
lenextracted 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
- Reuse Existing Boxes (ConditionEnv/ConditionBinding)
- Follow Pattern 2 Structure (proven blueprint)
- Fail-Fast (variable not in ConditionEnv → error)
- ParamRole::Condition Routing (separate from carriers)
Next Steps
-
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
-
Add Load Instructions:
- May need to generate Load instructions for condition variables at loop entry
- Similar to how Pattern 2 handles break condition variables
-
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
-
Condition Variable Remapping (Critical):
- Condition variables get remapped to wrong ValueIds during merge
- Need to verify condition_bindings handling in merge pipeline
-
No Test Passing Yet:
- phase212: RC=0 (expected 2) ❌
- Other tests not yet verified