From f7437957b7ddfc86108aa596b23c6b130f66dce3 Mon Sep 17 00:00:00 2001 From: tomoaki Date: Mon, 22 Dec 2025 04:12:52 +0900 Subject: [PATCH] refactor(joinir): Eliminate merge variable copy duplication MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../joinir_block_converter.rs | 33 +++---------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/src/mir/join_ir_vm_bridge/joinir_block_converter.rs b/src/mir/join_ir_vm_bridge/joinir_block_converter.rs index 2c52b494..a0d0e8e2 100644 --- a/src/mir/join_ir_vm_bridge/joinir_block_converter.rs +++ b/src/mir/join_ir_vm_bridge/joinir_block_converter.rs @@ -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) { @@ -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,