for (MachineRegisterInfo::reg_iterator I = MRI->reg_begin(SrcReg);
MachineInstr *UseMI = I.skipInstruction();) {
+ bool AlreadyJoined = JoinedCopies.count(UseMI);
+
// A PhysReg copy that won't be coalesced can perhaps be rematerialized
// instead.
if (DstIsPhys) {
UseMI->getOperand(1).getReg() == SrcReg &&
UseMI->getOperand(0).getReg() != SrcReg &&
UseMI->getOperand(0).getReg() != DstReg &&
- !JoinedCopies.count(UseMI) &&
+ !AlreadyJoined &&
reMaterializeTrivialDef(LIS->getInterval(SrcReg), false,
UseMI->getOperand(0).getReg(), UseMI))
continue;
// If SrcReg wasn't read, it may still be the case that DstReg is live-in
// because SrcReg is a sub-register.
- if (!Reads && SubIdx)
+ if (!Reads && SubIdx && !AlreadyJoined)
Reads = DstInt.liveAt(LIS->getInstructionIndex(UseMI));
// Replace SrcReg with DstReg in all UseMI operands.
// Adjust <undef> flags in case of sub-register joins. We don't want to
// turn a full def into a read-modify-write sub-register def and vice
// versa.
- if (SubIdx && MO.isDef())
+ if (SubIdx && !AlreadyJoined && MO.isDef())
MO.setIsUndef(!Reads);
if (DstIsPhys)
}
// This instruction is a copy that will be removed.
- if (JoinedCopies.count(UseMI))
+ if (AlreadyJoined)
continue;
DEBUG({