Index: lib/CodeGen/TwoAddressInstructionPass.cpp =================================================================== --- lib/CodeGen/TwoAddressInstructionPass.cpp +++ lib/CodeGen/TwoAddressInstructionPass.cpp @@ -1611,14 +1611,14 @@ if (!IsEarlyClobber) { // Replace other (un-tied) uses of regB with LastCopiedReg. for (MachineOperand &MO : MI->operands()) { - if (MO.isReg() && MO.getReg() == RegB && + if (MO.isReg() && MO.getReg() == RegB && MO.getSubReg() == SubRegB && MO.isUse()) { if (MO.isKill()) { MO.setIsKill(false); RemovedKillFlag = true; } MO.setReg(LastCopiedReg); - MO.setSubReg(MO.getSubReg()); + MO.setSubReg(0); } } } Index: test/CodeGen/Hexagon/two-addr-tied-subregs.mir =================================================================== --- /dev/null +++ test/CodeGen/Hexagon/two-addr-tied-subregs.mir @@ -0,0 +1,50 @@ +# RUN: llc -march hexagon -run-pass twoaddressinstruction -o - %s | FileCheck %s + +############################################################################### + +--- +name: test1 +tracksRegLiveness: true +body: | + bb.0.entry: + liveins: $d0 + + %0:doubleregs = COPY killed $d0 + %1:intregs = S2_lsr_i_r_acc %0.isub_lo, %0.isub_lo, 16 + +... + +# Verify that both uses if %0.isub_lo are replaced here. +# (we used to get %1:intregs = S2_lsr_i_r_acc %1, %1.isub_lo, 16) +# +# CHECK-LABEL: name: test1 +# CHECK: bb.0.entry: +# CHECK: %0:doubleregs = COPY killed $d0 +# CHECK-NEXT: %1:intregs = COPY %0.isub_lo +# CHECK-NEXT: %1:intregs = S2_lsr_i_r_acc %1, %1, 16 + + +############################################################################### + +--- +name: test2 +tracksRegLiveness: true +body: | + bb.0.entry: + liveins: $d0 + + %0:doubleregs = COPY killed $d0 + %1:intregs = S2_lsr_i_r_acc %0.isub_lo, %0.isub_hi, 16 + +... + +# Verify that the use of %0.isub_hi isn't replaced here. +# (we used to get %1:intregs = S2_lsr_i_r_acc %1, %1.isub_hi, 16) +# +# CHECK-LABEL: name: test2 +# CHECK: bb.0.entry: +# CHECK: %0:doubleregs = COPY killed $d0 +# CHECK-NEXT: %1:intregs = COPY %0.isub_lo +# CHECK-NEXT: %1:intregs = S2_lsr_i_r_acc %1, %0.isub_hi, 16 + +###############################################################################