[PATCH] D79776: [AMDGPU] Allow use of StackPtrOffsetReg when building spills
Carl Ritson via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue May 12 05:20:36 PDT 2020
critson created this revision.
critson added reviewers: scott.linder, arsenm, tpr.
Herald added subscribers: llvm-commits, kerbowa, hiraditya, t-tye, dstuttard, yaxunl, nhaehnle, wdng, jvesely, kzhuravl.
Herald added a project: LLVM.
When spilling in the entry function we should be able to borrow
StackPtrOffsetReg as a last resort. This restores behaviour
removed in D75138 <https://reviews.llvm.org/D75138>, and fixes failures when shaders use all
SGPRs, VGPRs and spill in the entry function.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D79776
Files:
llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp
Index: llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp
===================================================================
--- llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp
+++ llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp
@@ -687,6 +687,7 @@
MachineFunction *MF = MI->getParent()->getParent();
const SIInstrInfo *TII = ST.getInstrInfo();
const MachineFrameInfo &MFI = MF->getFrameInfo();
+ const SIMachineFunctionInfo *FuncInfo = MF->getInfo<SIMachineFunctionInfo>();
const MCInstrDesc &Desc = TII->get(LoadStoreOp);
const DebugLoc &DL = MI->getDebugLoc();
@@ -725,22 +726,26 @@
SOffset = RS->scavengeRegister(&AMDGPU::SGPR_32RegClass, MI, 0, false);
if (!SOffset) {
- if (!ScratchOffsetReg) {
- report_fatal_error("could not scavenge SGPR to spill in entry function");
- }
// There are no free SGPRs, and since we are in the process of spilling
// VGPRs too. Since we need a VGPR in order to spill SGPRs (this is true
// on SI/CI and on VI it is true until we implement spilling using scalar
// stores), we have no way to free up an SGPR. Our solution here is to
- // add the offset directly to the ScratchOffset register, and then
- // subtract the offset after the spill to return ScratchOffset to it's
- // original value.
- SOffset = ScratchOffsetReg;
+ // add the offset directly to the ScratchOffset or StackPtrOffset
+ // register, and then subtract the offset after the spill to return the
+ // register to it's original value.
+ if (ScratchOffsetReg) {
+ SOffset = ScratchOffsetReg;
+ } else {
+ SOffset = FuncInfo->getStackPtrOffsetReg();
+ }
ScratchOffsetRegDelta = Offset;
} else {
Scavenged = true;
}
+ if (!SOffset)
+ report_fatal_error("could not scavenge SGPR to spill in entry function");
+
if (ScratchOffsetReg == AMDGPU::NoRegister) {
BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), SOffset)
.addImm(Offset);
@@ -811,8 +816,8 @@
if (ScratchOffsetRegDelta != 0) {
// Subtract the offset we added to the ScratchOffset register.
- BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), ScratchOffsetReg)
- .addReg(ScratchOffsetReg)
+ BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), SOffset)
+ .addReg(SOffset)
.addImm(ScratchOffsetRegDelta);
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79776.263400.patch
Type: text/x-patch
Size: 2395 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200512/a6bf5e8d/attachment.bin>
More information about the llvm-commits
mailing list