diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2021-09-13 17:19:40 -0400 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2023-06-16 15:04:08 -0400 |
| commit | b9c6d9e6c3b9fab632d2ee33ecce899fadcee456 (patch) | |
| tree | 8229bb8a4179b545b25f6b8eaecbae5ca77270ea /llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp | |
| parent | 3632e2f5179a420ea8ab84e6ca33747ff6130fa2 (diff) | |
AMDGPU: Propagate amdgpu-waves-per-eu with attributor
This will do a value range merging down the callgraph, unlike the
current pass which can only propagate values to undecorated functions
from a kernel.
This one is a bit weird due to the interaction with the implied range
from amdgpu-flat-workgroup-size. At the default group range of 1,1024,
the minimum implied bounds is 4 so this ends up introducing the
attribute on undecorated functions. We could probably simplify this by
ignoring it and propagating the raw values. The subtarget interaction
and the interaction with amdgpu-flat-workgroup-size only really clamp
invalid values (plus the lower bound doesn't seem to do anything as
far as I can tell anyway).
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp b/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp index e9ce73d5ac8e..9393dee16df2 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp @@ -416,8 +416,9 @@ std::pair<unsigned, unsigned> AMDGPUSubtarget::getFlatWorkGroupSizes( return Requested; } -std::pair<unsigned, unsigned> AMDGPUSubtarget::getWavesPerEU( - const Function &F, std::pair<unsigned, unsigned> FlatWorkGroupSizes) const { +std::pair<unsigned, unsigned> AMDGPUSubtarget::getEffectiveWavesPerEU( + std::pair<unsigned, unsigned> Requested, + std::pair<unsigned, unsigned> FlatWorkGroupSizes) const { // Default minimum/maximum number of waves per execution unit. std::pair<unsigned, unsigned> Default(1, getMaxWavesPerEU()); @@ -429,10 +430,6 @@ std::pair<unsigned, unsigned> AMDGPUSubtarget::getWavesPerEU( getWavesPerEUForWorkGroup(FlatWorkGroupSizes.second); Default.first = MinImpliedByFlatWorkGroupSize; - // Requested minimum/maximum number of waves per execution unit. - std::pair<unsigned, unsigned> Requested = AMDGPU::getIntegerPairAttribute( - F, "amdgpu-waves-per-eu", Default, true); - // Make sure requested minimum is less than requested maximum. if (Requested.second && Requested.first > Requested.second) return Default; @@ -450,6 +447,17 @@ std::pair<unsigned, unsigned> AMDGPUSubtarget::getWavesPerEU( return Requested; } +std::pair<unsigned, unsigned> AMDGPUSubtarget::getWavesPerEU( + const Function &F, std::pair<unsigned, unsigned> FlatWorkGroupSizes) const { + // Default minimum/maximum number of waves per execution unit. + std::pair<unsigned, unsigned> Default(1, getMaxWavesPerEU()); + + // Requested minimum/maximum number of waves per execution unit. + std::pair<unsigned, unsigned> Requested = + AMDGPU::getIntegerPairAttribute(F, "amdgpu-waves-per-eu", Default, true); + return getEffectiveWavesPerEU(Requested, FlatWorkGroupSizes); +} + static unsigned getReqdWorkGroupSize(const Function &Kernel, unsigned Dim) { auto Node = Kernel.getMetadata("reqd_work_group_size"); if (Node && Node->getNumOperands() == 3) |
