if (FoldingImmLike && UseMI->isCopy()) {
Register DestReg = UseMI->getOperand(0).getReg();
- const TargetRegisterClass *DestRC = Register::isVirtualRegister(DestReg)
- ? MRI->getRegClass(DestReg)
- : TRI->getPhysRegClass(DestReg);
+
+ // Don't fold into a copy to a physical register. Doing so would interfere
+ // with the register coalescer's logic which would avoid redundant
+ // initalizations.
+ if (DestReg.isPhysical())
+ return;
+
+ const TargetRegisterClass *DestRC = MRI->getRegClass(DestReg);
Register SrcReg = UseMI->getOperand(1).getReg();
- if (Register::isVirtualRegister(DestReg) &&
- Register::isVirtualRegister(SrcReg)) {
+ if (SrcReg.isVirtual()) { // XXX - This can be an assert?
const TargetRegisterClass * SrcRC = MRI->getRegClass(SrcReg);
if (TRI->isSGPRClass(SrcRC) && TRI->hasVectorRegisters(DestRC)) {
MachineRegisterInfo::use_iterator NextUse;
; GCN-NEXT: s_mov_b64 s[0:1], s[36:37]
; GCN-NEXT: v_mov_b32_e32 v1, 0x2000
; GCN-NEXT: v_mov_b32_e32 v2, 0x4000
-; GCN-NEXT: s_mov_b64 s[2:3], s[38:39]
; GCN-NEXT: v_mov_b32_e32 v3, 0
+; GCN-NEXT: s_mov_b64 s[2:3], s[38:39]
; GCN-NEXT: v_mov_b32_e32 v4, 0x400000
; GCN-NEXT: s_add_u32 s32, s33, 0xc0000
; GCN-NEXT: v_add_nc_u32_e64 v32, 4, 0x4000