feat(phi): Step 5-5-E - Fix variable map corruption in build_assignment()

Root Cause Fixed:
- build_assignment() was calling pin_to_slot(raw_value_id, "@assign")
- This would sometimes return a ValueId from previous __pin$ temporaries
- Result: variable_map["m"] incorrectly pointed to __pin$767$@binop_lhs

Solution:
- REMOVED pin_to_slot() call from build_assignment()
- Direct assignment: value_id = build_expression(value)
- SSA + PHI merges work correctly without explicit pinning

Impact:
- Error location changed: bb363→bb13, ValueId 260→271
- This indicates we've fixed one bug and revealed another
- Test status: 267 PASS / 1 FAIL (no regressions)

Technical Details:
- Task analysis confirmed: Variable map was being corrupted during binop
- The pin_to_slot() caching logic was returning wrong ValueIds
- Simplified code path: expression building creates necessary temporaries

Next: Investigate new ValueId(271) error at BasicBlockId(13)

🐛 PHI Bug Option C実装: 箱分割設計で根本修正
This commit is contained in:
nyash-codex
2025-11-20 15:53:06 +09:00
parent 71179aa2ed
commit 116c6cc74a

View File

@ -487,12 +487,18 @@ impl MirBuilder {
var_name: String, var_name: String,
value: ASTNode, value: ASTNode,
) -> Result<ValueId, String> { ) -> Result<ValueId, String> {
let raw_value_id = self.build_expression(value)?; let value_id = self.build_expression(value)?;
// Correctness-first: assignment results may be used across control-flow joins.
// Pin to a slot so the value has a block-local def and participates in PHI merges. // Step 5-5-E: FIX variable map corruption bug
let value_id = self // REMOVED pin_to_slot() call - it was causing __pin$ temporaries to overwrite
.pin_to_slot(raw_value_id, "@assign") // real variable names in the variable map.
.unwrap_or(raw_value_id); //
// Root cause: pin_to_slot(raw_value_id, "@assign") would sometimes return
// a ValueId from a previous __pin$ temporary (e.g., __pin$767$@binop_lhs),
// causing variable_map["m"] to point to the wrong ValueId.
//
// SSA + PHI merges work correctly without explicit pinning here.
// The expression building already creates necessary temporaries.
// In SSA form, each assignment creates a new value // In SSA form, each assignment creates a new value
self.variable_map.insert(var_name.clone(), value_id); self.variable_map.insert(var_name.clone(), value_id);