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>
This commit is contained in:
@ -2,16 +2,15 @@
|
||||
|
||||
## Current Focus (next)
|
||||
|
||||
- Phase 281(design-first): `docs/development/current/main/phases/phase-281/README.md`
|
||||
- P1 planned: Pattern6(early-exit)を compose に寄せる(挙動不変で段階移行)
|
||||
- SSOT: `docs/development/current/main/design/edgecfg-fragments.md`, `src/mir/builder/control_flow/edgecfg/api/compose.rs`
|
||||
- Phase 282(planned, design-first): Router shrinkage
|
||||
- pattern番号を “症状ラベル(テスト名)” に降格し、合成SSOTへ寄せた後に router を縮退させる
|
||||
- Phase 283(bugfix): JoinIR if-condition remap fix: `docs/development/current/main/phases/phase-283/README.md`
|
||||
- 目的: Pattern3(if-sum)で `i % 2 == 1` が undefined `ValueId` を生成する不具合を根治する
|
||||
- SSOT: `src/mir/join_ir/lowering/loop_with_if_phi_if_sum.rs`(ConditionEnv の正しい使用位置)
|
||||
|
||||
## Recently Completed (2025-12-23)
|
||||
|
||||
- Phase 282(Router shrinkage + extraction-based migration P0–P5): `docs/development/current/main/phases/phase-282/README.md`
|
||||
- Phase 280(Frag composition SSOT positioning): `docs/development/current/main/phases/phase-280/README.md`
|
||||
- Phase 281 P0(Pattern7 → compose::if_): `docs/development/current/main/phases/phase-281/README.md`
|
||||
- Phase 281(Pattern6/7 compose adoption, P0–P3): `docs/development/current/main/phases/phase-281/README.md`
|
||||
- Phase 273(Plan line SSOT): `docs/development/current/main/phases/phase-273/README.md`
|
||||
- Phase 275 P0(A1/B2/C2 coercion SSOT): `docs/development/current/main/phases/phase-275/README.md`
|
||||
- Phase 276 P0(quick wins / type_helper SSOT): `docs/development/current/main/phases/phase-276/README.md`
|
||||
|
||||
@ -8,12 +8,9 @@ Related:
|
||||
|
||||
## 直近(JoinIR/selfhost)
|
||||
|
||||
- **Phase 281(planned): Pattern6 を compose へ段階吸収**
|
||||
- 入口: `docs/development/current/main/phases/phase-281/README.md`
|
||||
- P0(Pattern7)✅ 完了、次は P1(Pattern6 early-exit)
|
||||
|
||||
- **Phase 282(planned): Router shrinkage**
|
||||
- 目的: pattern番号を “症状ラベル” に縮退させ、合成SSOTへ寄せた後に router の分岐を減らす
|
||||
- **Phase 282(planned, design-first): Router shrinkage**
|
||||
- 入口: `docs/development/current/main/phases/phase-282/README.md`
|
||||
- 目的: pattern番号を “症状ラベル” に縮退し、router の責務を「抽出の配線」へ収束させる
|
||||
|
||||
(✅ done)**Phase 279 P0**: Type propagation pipeline SSOT 統一(lifecycle / JoinIR / LLVM の二重化解消)
|
||||
- 完了: `docs/development/current/main/phases/phase-279/README.md`
|
||||
@ -27,6 +24,12 @@ Related:
|
||||
- (✅ done)**Phase 273**: Plan line SSOT(Pattern6/7)
|
||||
- 完了: `docs/development/current/main/phases/phase-273/README.md`
|
||||
|
||||
- (✅ done)**Phase 280**: Frag composition SSOT positioning
|
||||
- 完了: `docs/development/current/main/phases/phase-280/README.md`
|
||||
|
||||
- (✅ done)**Phase 281**: compose adoption(Pattern6/7, P0–P3)
|
||||
- 完了: `docs/development/current/main/phases/phase-281/README.md`
|
||||
|
||||
- (✅ done)**Phase 277/278**: PHI strict + env var 収束
|
||||
- 完了: `docs/development/current/main/phases/phase-277/README.md`
|
||||
- 完了: `docs/development/current/main/phases/phase-278/README.md`
|
||||
|
||||
47
docs/development/current/main/phases/phase-283/README.md
Normal file
47
docs/development/current/main/phases/phase-283/README.md
Normal file
@ -0,0 +1,47 @@
|
||||
# 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`:
|
||||
```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`.
|
||||
|
||||
Reference in New Issue
Block a user