Files
hakorune/docs/development/current/main/phases/phase-283/README.md
tomoaki bfbc9b26bf fix(joinir): Phase 283 P0 - Pattern3 Undefined ValueId Bug Fix
- Fix: extract_if_condition() moved after local_cond_env construction
  (loop_with_if_phi_if_sum.rs:175)
  - Root cause: condition extraction before i_param/sum_param creation
  - Result: i % 2 referenced caller's ConditionEnv with unmapped ValueId
- Fail-Fast: Add condition_bindings validation in merge (mod.rs)
- Fixture: Update loop_if_phi.hako for C2 compatibility (sum.toString())
- Verified: VM execution outputs sum=9 

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-23 08:14:27 +09:00

1.9 KiB

Phase 283: JoinIR If-Condition ValueId Remap Fix

Status: P0 complete (2025-12-23)

Goal:

  • Fix a Pattern3 (if-sum) JoinIR lowering bug where complex if-conditions like i % 2 == 1 could produce MIR that uses an undefined ValueId.

SSOT References:

  • JoinIR lowering (if-sum): src/mir/join_ir/lowering/loop_with_if_phi_if_sum.rs
  • Condition value lowering: src/mir/join_ir/lowering/condition_lowerer.rs
  • MIR verification (undefined values): src/mir/verification/ssa.rs
  • Test fixture: apps/tests/loop_if_phi.hako

Problem

Observed error (VM):

  • use of undefined value ValueId(...) inside the loop body, originating from the modulo expression in the if-condition.

The symptom appeared in apps/tests/loop_if_phi.hako:

if (i % 2 == 1) { ... } else { ... }

Root Cause

In lower_if_sum_pattern, the if-condition was extracted (and its JoinIR value-expression lowered) before i_param / sum_param existed, so Variable("i") inside complex expressions resolved through the caller-provided ConditionEnv.

That early ConditionEnv mapping could not be remapped by the boundary/merger, resulting in JoinIR ValueIds that became undefined host ValueIds in MIR.

Fix (P0)

  • Move extract_if_condition(...) so it runs after local_cond_env is constructed and shadowed:
    • local_cond_env.insert(loop_var, i_param)
    • local_cond_env.insert(update_var, sum_param)
    • (and any condition bindings remapped to main_params)

This ensures complex expressions like i % 2 resolve i to i_param (a loop_step param that the merger remaps), preventing undefined ValueIds.

Fixture Note (Coercion SSOT)

After Phase 275 (C2), implicit "String" + Integer is a TypeError. The fixture uses:

  • sum.toString() instead of "sum=" + sum or str(sum).

Acceptance

  • apps/tests/loop_if_phi.hako runs on VM without undefined ValueId errors and prints sum=9.