Index: lib/Target/AMDGPU/SIFoldOperands.cpp =================================================================== --- lib/Target/AMDGPU/SIFoldOperands.cpp +++ lib/Target/AMDGPU/SIFoldOperands.cpp @@ -581,13 +581,17 @@ 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; Index: test/CodeGen/AMDGPU/stack-pointer-offset-relative-frameindex.ll =================================================================== --- test/CodeGen/AMDGPU/stack-pointer-offset-relative-frameindex.ll +++ test/CodeGen/AMDGPU/stack-pointer-offset-relative-frameindex.ll @@ -14,8 +14,8 @@ ; 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