diff --git a/llvm/lib/Target/AMDGPU/SIFrameLowering.cpp b/llvm/lib/Target/AMDGPU/SIFrameLowering.cpp index 50a6f028f66de6..07505110476b5d 100644 --- a/llvm/lib/Target/AMDGPU/SIFrameLowering.cpp +++ b/llvm/lib/Target/AMDGPU/SIFrameLowering.cpp @@ -1342,20 +1342,10 @@ void SIFrameLowering::processFunctionBeforeFrameFinalized( SIMachineFunctionInfo *FuncInfo = MF.getInfo(); // Allocate spill slots for WWM reserved VGPRs. - // For chain functions, we only need to do this if we have calls to - // llvm.amdgcn.cs.chain (otherwise there's no one to save them for, since - // chain functions do not return) and the function did not contain a call to - // llvm.amdgcn.init.whole.wave (since in that case there are no inactive lanes - // when entering the function). - bool IsChainWithoutRestores = - FuncInfo->isChainFunction() && - (!MF.getFrameInfo().hasTailCall() || FuncInfo->hasInitWholeWave()); - if (!FuncInfo->isEntryFunction() && !IsChainWithoutRestores) { - for (Register Reg : FuncInfo->getWWMReservedRegs()) { - const TargetRegisterClass *RC = TRI->getPhysRegBaseClass(Reg); - FuncInfo->allocateWWMSpill(MF, Reg, TRI->getSpillSize(*RC), - TRI->getSpillAlign(*RC)); - } + for (Register Reg : FuncInfo->getWWMReservedRegs()) { + const TargetRegisterClass *RC = TRI->getPhysRegBaseClass(Reg); + FuncInfo->allocateWWMSpill(MF, Reg, TRI->getSpillSize(*RC), + TRI->getSpillAlign(*RC)); } const bool SpillVGPRToAGPR = ST.hasMAIInsts() && FuncInfo->hasSpilledVGPRs() diff --git a/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp b/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp index 2237b2e78c4174..f59d29bd81403a 100644 --- a/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp +++ b/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp @@ -287,8 +287,14 @@ void SIMachineFunctionInfo::allocateWWMSpill(MachineFunction &MF, Register VGPR, // amdgpu_cs_chain_preserve calling convention and this is a scratch register. // We never need to allocate a spill for these because we don't even need to // restore the inactive lanes for them (they're scratchier than the usual - // scratch registers). - if (isChainFunction() && SIRegisterInfo::isChainScratchRegister(VGPR)) + // scratch registers). We only need to do this if we have calls to + // llvm.amdgcn.cs.chain (otherwise there's no one to save them for, since + // chain functions do not return) and the function did not contain a call to + // llvm.amdgcn.init.whole.wave (since in that case there are no inactive lanes + // when entering the function). + if (isChainFunction() && + (SIRegisterInfo::isChainScratchRegister(VGPR) || + !MF.getFrameInfo().hasTailCall() || hasInitWholeWave())) return; WWMSpills.insert(std::make_pair(