diff --git a/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp b/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp --- a/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp +++ b/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp @@ -327,6 +327,12 @@ // Reserve 4 SGPRs for the scratch buffer resource descriptor in case we need // to spill. // TODO: May need to reserve a VGPR if doing LDS spilling. + const MachineRegisterInfo &MRI = MF.getRegInfo(); + for (unsigned i = 0; i < 4; ++i) { + Register SubReg = getSubReg(ScratchRSrcReg, getSubRegFromChannel(i)); + if (MRI.isLiveIn(SubReg)) + report_fatal_error("scratch resource registers overlap live in"); + } reserveRegisterTuples(Reserved, ScratchRSrcReg); } @@ -336,20 +342,23 @@ MCRegister StackPtrReg = MFI->getStackPtrOffsetReg(); if (StackPtrReg) { + if (isSubRegister(ScratchRSrcReg, StackPtrReg)) + report_fatal_error("scratch resource registers overlap stack pointer"); reserveRegisterTuples(Reserved, StackPtrReg); - assert(!isSubRegister(ScratchRSrcReg, StackPtrReg)); } MCRegister FrameReg = MFI->getFrameOffsetReg(); if (FrameReg) { + if (isSubRegister(ScratchRSrcReg, FrameReg)) + report_fatal_error("scratch resource registers overlap frame offset"); reserveRegisterTuples(Reserved, FrameReg); - assert(!isSubRegister(ScratchRSrcReg, FrameReg)); } if (hasBasePointer(MF)) { MCRegister BasePtrReg = getBaseRegister(); + if (isSubRegister(ScratchRSrcReg, BasePtrReg)) + report_fatal_error("scratch resource registers overlap base pointer"); reserveRegisterTuples(Reserved, BasePtrReg); - assert(!isSubRegister(ScratchRSrcReg, BasePtrReg)); } for (MCRegister Reg : MFI->WWMReservedRegs) {