diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp | 54 |
1 files changed, 6 insertions, 48 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp b/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp index c5efb89..a83fc2d 100644 --- a/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp +++ b/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp @@ -64,6 +64,10 @@ SIMachineFunctionInfo::SIMachineFunctionInfo(const Function &F, } MayNeedAGPRs = ST.hasMAIInsts(); + if (ST.hasGFX90AInsts() && + ST.getMaxNumVGPRs(F) <= AMDGPU::VGPR_32RegClass.getNumRegs() && + !mayUseAGPRs(F)) + MayNeedAGPRs = false; // We will select all MAI with VGPR operands. if (AMDGPU::isChainCC(CC)) { // Chain functions don't receive an SP from their caller, but are free to @@ -98,13 +102,8 @@ SIMachineFunctionInfo::SIMachineFunctionInfo(const Function &F, ImplicitArgPtr = true; } else { ImplicitArgPtr = false; - MaxKernArgAlign = std::max(ST.getAlignmentForImplicitArgPtr(), - MaxKernArgAlign); - - if (ST.hasGFX90AInsts() && - ST.getMaxNumVGPRs(F) <= AMDGPU::VGPR_32RegClass.getNumRegs() && - !mayUseAGPRs(F)) - MayNeedAGPRs = false; // We will select all MAI with VGPR operands. + MaxKernArgAlign = + std::max(ST.getAlignmentForImplicitArgPtr(), MaxKernArgAlign); } if (!AMDGPU::isGraphics(CC) || @@ -783,44 +782,3 @@ bool SIMachineFunctionInfo::initializeBaseYamlFields( bool SIMachineFunctionInfo::mayUseAGPRs(const Function &F) const { return !F.hasFnAttribute("amdgpu-no-agpr"); } - -bool SIMachineFunctionInfo::usesAGPRs(const MachineFunction &MF) const { - if (UsesAGPRs) - return *UsesAGPRs; - - if (!mayNeedAGPRs()) { - UsesAGPRs = false; - return false; - } - - if (!AMDGPU::isEntryFunctionCC(MF.getFunction().getCallingConv()) || - MF.getFrameInfo().hasCalls()) { - UsesAGPRs = true; - return true; - } - - const MachineRegisterInfo &MRI = MF.getRegInfo(); - - for (unsigned I = 0, E = MRI.getNumVirtRegs(); I != E; ++I) { - const Register Reg = Register::index2VirtReg(I); - const TargetRegisterClass *RC = MRI.getRegClassOrNull(Reg); - if (RC && SIRegisterInfo::isAGPRClass(RC)) { - UsesAGPRs = true; - return true; - } - if (!RC && !MRI.use_empty(Reg) && MRI.getType(Reg).isValid()) { - // Defer caching UsesAGPRs, function might not yet been regbank selected. - return true; - } - } - - for (MCRegister Reg : AMDGPU::AGPR_32RegClass) { - if (MRI.isPhysRegUsed(Reg)) { - UsesAGPRs = true; - return true; - } - } - - UsesAGPRs = false; - return false; -} |