diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2025-02-23 09:00:37 +0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-23 09:00:37 +0700 |
commit | ccad5e77442f7f237939395ebce1ae7adf187380 (patch) | |
tree | 5a731da2e1614ebeca6bc40b3ba8a32fb038d54d /llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp | |
parent | 6e611264c6d7e6dd5f746360a74f8edf656dbf32 (diff) | |
download | llvm-ccad5e77442f7f237939395ebce1ae7adf187380.zip llvm-ccad5e77442f7f237939395ebce1ae7adf187380.tar.gz llvm-ccad5e77442f7f237939395ebce1ae7adf187380.tar.bz2 |
AMDGPU: Respect amdgpu-no-agpr in functions and with calls (#128147)
Remove the MIR scan to detect whether AGPRs are used or not,
and the special case for callable functions. This behavior was
confusing, and not overridable. The amdgpu-no-agpr attribute was
intended to avoid this imprecise heuristic for how many AGPRs to
allocate. It was also too confusing to make this interact with
the pending amdgpu-num-agpr replacement for amdgpu-no-agpr.
Also adds an xfail-ish test where the register allocator asserts
after allocation fails which I ran into.
Future work should reintroduce a more refined MIR scan to estimate
AGPR pressure for how to split AGPRs and VGPRs.
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; -} |