refactor(joinir): Eliminate merge variable copy duplication

Problem:
- 4 duplicate merge variable copy patterns
- Lines ~652-660, 667-675, 785-791, 800-806

Solution:
- Use existing merge_variable_handler.rs
- Unified merge copy emission with emit_merge_copies()
- MergeBranch enum (Then/Else) for branch selection

Result:
-  ~20 lines eliminated (4 duplicate loops removed)
-  Tests pass, no regression
-  Cleaner handle_select implementation

🤖 Generated with Claude Code

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-22 04:12:52 +09:00
parent 3cdeb95cbc
commit f7437957b7

View File

@ -13,6 +13,7 @@ use crate::mir::types::ConstValue;
use std::collections::BTreeMap;
use super::block_allocator::BlockAllocator; // Phase 269 P1.2+: Use BlockAllocator for deduplication
use super::merge_variable_handler::{emit_merge_copies, MergeBranch}; // Phase 269 P1.2+: Merge copy deduplication
use super::{convert_mir_like_inst, join_func_name, JoinIrVmBridgeError};
fn log_dbg(message: impl AsRef<str>) {
@ -652,13 +653,7 @@ impl JoinIrBlockConverter {
// then block: copy then_val
let mut then_block_obj = crate::mir::BasicBlock::new(then_block);
for merge in merges {
then_block_obj.instructions.push(MirInstruction::Copy {
dst: merge.dst,
src: merge.then_val,
});
then_block_obj.instruction_spans.push(Span::unknown());
}
emit_merge_copies(&mut then_block_obj, merges, MergeBranch::Then);
then_block_obj.set_terminator(MirInstruction::Jump {
target: merge_block,
edge_args: None,
@ -667,13 +662,7 @@ impl JoinIrBlockConverter {
// else block: copy else_val
let mut else_block_obj = crate::mir::BasicBlock::new(else_block);
for merge in merges {
else_block_obj.instructions.push(MirInstruction::Copy {
dst: merge.dst,
src: merge.else_val,
});
else_block_obj.instruction_spans.push(Span::unknown());
}
emit_merge_copies(&mut else_block_obj, merges, MergeBranch::Else);
else_block_obj.set_terminator(MirInstruction::Jump {
target: merge_block,
edge_args: None,
@ -779,13 +768,7 @@ impl JoinIrBlockConverter {
// then block
let mut then_block_obj = crate::mir::BasicBlock::new(then_block);
for merge in merges {
then_block_obj.instructions.push(MirInstruction::Copy {
dst: merge.dst,
src: merge.then_val,
});
then_block_obj.instruction_spans.push(Span::unknown());
}
emit_merge_copies(&mut then_block_obj, merges, MergeBranch::Then);
then_block_obj.set_terminator(MirInstruction::Jump {
target: merge_block,
edge_args: None,
@ -794,13 +777,7 @@ impl JoinIrBlockConverter {
// else block
let mut else_block_obj = crate::mir::BasicBlock::new(final_else_block);
for merge in merges {
else_block_obj.instructions.push(MirInstruction::Copy {
dst: merge.dst,
src: merge.else_val,
});
else_block_obj.instruction_spans.push(Span::unknown());
}
emit_merge_copies(&mut else_block_obj, merges, MergeBranch::Else);
else_block_obj.set_terminator(MirInstruction::Jump {
target: merge_block,
edge_args: None,