refactor(joinir): Phase 189 - Remove hardcoded 'sum' variable, generalize exit PHI connection

Key improvements:
1. **Eliminate hardcoded variable name**: Replace hardcoded "sum" with generic
   ValueId-based variable_map updates. Add new JoinInlineBoundary constructor
   `new_with_input_and_host_outputs()` for Pattern 3.

2. **Generalize output slot mapping**: Exit PHI result now updates all host_outputs
   entries in variable_map, not just hardcoded "sum". Prepares for future
   multi-carrier patterns.

3. **PHI preservation in blocks**: Fix block finalization to preserve existing
   PHI instructions (from handle_select) instead of overwriting them.

4. **Stable function name→ValueId mapping**: Ensure consistent ValueId
   assignment for tail call detection across multi-function merges.

5. **Enhanced debugging**: Add detailed logging in block converter and meta
   analysis for PHI verification.

Files modified:
- src/mir/builder/control_flow.rs: Remove hardcoded "sum", use boundary outputs
- src/mir/join_ir/lowering/inline_boundary.rs: Add new constructor
- src/mir/join_ir_vm_bridge/joinir_block_converter.rs: Stable mappings, PHI preservation
- src/mir/join_ir_vm_bridge/meta.rs: Debug output for PHI tracking
- src/mir/builder/joinir_id_remapper.rs: PHI value remapping
- src/mir/builder/joinir_inline_boundary_injector.rs: Span preservation

Test status: Pattern 3 (loop_if_phi.hako) still produces correct result (sum=9, RC=9)

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

Co-Authored-By: ChatGPT <noreply@openai.com>
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-05 19:39:54 +09:00
parent e01d1b8a7c
commit 0397df5240
9 changed files with 202 additions and 46 deletions

View File

@ -295,6 +295,16 @@ impl MirPrinter {
block: &BasicBlock,
types: &BTreeMap<ValueId, MirType>,
) -> String {
// DEBUG: Check span mismatch
if block.instructions.len() != block.instruction_spans.len() {
eprintln!(
"[printer/DEBUG] Block {:?} SPAN MISMATCH: instructions={}, spans={}",
block.id,
block.instructions.len(),
block.instruction_spans.len()
);
}
let mut output = String::new();
// Block header