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:
@ -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,
|
||||
|
||||
Reference in New Issue
Block a user