[llvm] [AMDGPU] Ignore inactive VGPRs in .vgpr_count (PR #144855)
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 1 02:04:47 PDT 2025
================
@@ -139,268 +139,56 @@ AMDGPUResourceUsageAnalysis::analyzeResourceUsage(
Info.UsesVCC =
MRI.isPhysRegUsed(AMDGPU::VCC_LO) || MRI.isPhysRegUsed(AMDGPU::VCC_HI);
+ Info.NumExplicitSGPR = TRI.getNumUsedPhysRegs(MRI, AMDGPU::SGPR_32RegClass,
+ /*IncludeCalls=*/false);
+ if (ST.hasMAIInsts())
+ Info.NumAGPR = TRI.getNumUsedPhysRegs(MRI, AMDGPU::AGPR_32RegClass,
+ /*IncludeCalls=*/false);
- // If there are no calls, MachineRegisterInfo can tell us the used register
- // count easily.
// A tail call isn't considered a call for MachineFrameInfo's purposes.
- if (!FrameInfo.hasCalls() && !FrameInfo.hasTailCall()) {
- Info.NumVGPR = TRI.getNumUsedPhysRegs(MRI, AMDGPU::VGPR_32RegClass);
- Info.NumExplicitSGPR = TRI.getNumUsedPhysRegs(MRI, AMDGPU::SGPR_32RegClass);
- if (ST.hasMAIInsts())
- Info.NumAGPR = TRI.getNumUsedPhysRegs(MRI, AMDGPU::AGPR_32RegClass);
+ bool HasCalls = FrameInfo.hasCalls() || FrameInfo.hasTailCall();
+ // Functions that use the llvm.amdgcn.init.whole.wave intrinsic often have
+ // VGPR arguments that are only added for the purpose of preserving the
+ // inactive lanes. These should not be included in the number of used VGPRs.
+ bool NeedsExplicitVGPRCount = MFI->hasInitWholeWave();
+ if (!HasCalls && !NeedsExplicitVGPRCount) {
+
+ Info.NumVGPR = TRI.getNumUsedPhysRegs(MRI, AMDGPU::VGPR_32RegClass,
+ /*IncludeCalls=*/false);
return Info;
}
int32_t MaxVGPR = -1;
- int32_t MaxAGPR = -1;
- int32_t MaxSGPR = -1;
Info.CalleeSegmentSize = 0;
for (const MachineBasicBlock &MBB : MF) {
for (const MachineInstr &MI : MBB) {
- // TODO: Check regmasks? Do they occur anywhere except calls?
- for (const MachineOperand &MO : MI.operands()) {
- unsigned Width = 0;
- bool IsSGPR = false;
- bool IsAGPR = false;
-
- if (!MO.isReg())
- continue;
-
- Register Reg = MO.getReg();
- switch (Reg) {
----------------
jayfoad wrote:
Removing this huge switch is great but does it have to be part of this patch? Can it be a separate NFC thing?
https://github.com/llvm/llvm-project/pull/144855
More information about the llvm-commits
mailing list