https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/212207
>From 0049cc39b33090c5d1af4822f973fc3be0e9acc3 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <[email protected]> Date: Fri, 26 Jun 2026 12:50:09 +0200 Subject: [PATCH] AMDGPU: Start using subarch in attributor instead of subtarget Avoid querying the subtarget for functions when the relevant properties are known from the triple. The various subtarget group size functions should also be decoupled from the subtarget, but those are trickier to untangle. Co-authored-by: Claude (Opus 4.8) <[email protected]> --- .../llvm/TargetParser/AMDGPUTargetParser.def | 18 ++++---- .../llvm/TargetParser/AMDGPUTargetParser.h | 16 ++++++- llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp | 44 +++++++++++-------- llvm/lib/TargetParser/AMDGPUTargetParser.cpp | 10 +++++ 4 files changed, 60 insertions(+), 28 deletions(-) diff --git a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def index c09bd25e55deb..6c9703201bb37 100644 --- a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def +++ b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def @@ -95,10 +95,10 @@ AMDGCN_GPU ("gfx904", GK_GFX904, Triple::AMDGPUSubArch904, ( 9, 0, 4), AMDGCN_GPU ("gfx906", GK_GFX906, Triple::AMDGPUSubArch906, ( 9, 0, 6), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_SRAMECC) AMDGCN_GPU ("gfx908", GK_GFX908, Triple::AMDGPUSubArch908, ( 9, 0, 8), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_SRAMECC) AMDGCN_GPU ("gfx909", GK_GFX909, Triple::AMDGPUSubArch909, ( 9, 0, 9), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES) -AMDGCN_GPU ("gfx90a", GK_GFX90A, Triple::AMDGPUSubArch90A, ( 9, 0, 10), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_SRAMECC) +AMDGCN_GPU ("gfx90a", GK_GFX90A, Triple::AMDGPUSubArch90A, ( 9, 0, 10), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_SRAMECC|FEATURE_AGPR_ALLOC) AMDGCN_GPU ("gfx90c", GK_GFX90C, Triple::AMDGPUSubArch90C, ( 9, 0, 12), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES) -AMDGCN_GPU ("gfx942", GK_GFX942, Triple::AMDGPUSubArch942, ( 9, 4, 2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_SRAMECC) -AMDGCN_GPU ("gfx950", GK_GFX950, Triple::AMDGPUSubArch950, ( 9, 5, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_SRAMECC) +AMDGCN_GPU ("gfx942", GK_GFX942, Triple::AMDGPUSubArch942, ( 9, 4, 2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_SRAMECC|FEATURE_AGPR_ALLOC) +AMDGCN_GPU ("gfx950", GK_GFX950, Triple::AMDGPUSubArch950, ( 9, 5, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_SRAMECC|FEATURE_AGPR_ALLOC) AMDGCN_GPU ("gfx1010", GK_GFX1010, Triple::AMDGPUSubArch1010, (10, 1, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_WGP) AMDGCN_GPU ("gfx1011", GK_GFX1011, Triple::AMDGPUSubArch1011, (10, 1, 1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_WGP) AMDGCN_GPU ("gfx1012", GK_GFX1012, Triple::AMDGPUSubArch1012, (10, 1, 2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_WGP) @@ -124,9 +124,9 @@ AMDGCN_GPU ("gfx1171", GK_GFX1171, Triple::AMDGPUSubArch1171, (11, 7, 1) AMDGCN_GPU ("gfx1172", GK_GFX1172, Triple::AMDGPUSubArch1172, (11, 7, 2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP) AMDGCN_GPU ("gfx1200", GK_GFX1200, Triple::AMDGPUSubArch1200, (12, 0, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP) AMDGCN_GPU ("gfx1201", GK_GFX1201, Triple::AMDGPUSubArch1201, (12, 0, 1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP) -AMDGCN_GPU ("gfx1250", GK_GFX1250, Triple::AMDGPUSubArch1250, (12, 5, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_SRAMECC) -AMDGCN_GPU ("gfx1251", GK_GFX1251, Triple::AMDGPUSubArch1251, (12, 5, 1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_SRAMECC) -AMDGCN_GPU ("gfx1310", GK_GFX1310, Triple::AMDGPUSubArch1310, (13, 1, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP) +AMDGCN_GPU ("gfx1250", GK_GFX1250, Triple::AMDGPUSubArch1250, (12, 5, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_SRAMECC|FEATURE_CLUSTERS) +AMDGCN_GPU ("gfx1251", GK_GFX1251, Triple::AMDGPUSubArch1251, (12, 5, 1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_SRAMECC|FEATURE_CLUSTERS) +AMDGCN_GPU ("gfx1310", GK_GFX1310, Triple::AMDGPUSubArch1310, (13, 1, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP|FEATURE_CLUSTERS) // Generic targets return the lowest common denominator // within their family. That is, the ISA that is the most @@ -142,14 +142,14 @@ AMDGCN_GPU ("gfx1310", GK_GFX1310, Triple::AMDGPUSubArch1310, (13, 1, 0) // TODO: Split up this API depending on its caller so // generic target handling is more obvious and less risky. AMDGCN_GPU ("gfx9-generic", GK_GFX9_GENERIC, Triple::AMDGPUSubArch9, ( 9, 0, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES) -AMDGCN_GPU ("gfx9-4-generic", GK_GFX9_4_GENERIC, Triple::AMDGPUSubArch9_4, ( 9, 4, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_SRAMECC) +AMDGCN_GPU ("gfx9-4-generic", GK_GFX9_4_GENERIC, Triple::AMDGPUSubArch9_4, ( 9, 4, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_SRAMECC|FEATURE_AGPR_ALLOC) AMDGCN_GPU ("gfx10-1-generic", GK_GFX10_1_GENERIC, Triple::AMDGPUSubArch10_1, (10, 1, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_WGP) AMDGCN_GPU ("gfx10-3-generic", GK_GFX10_3_GENERIC, Triple::AMDGPUSubArch10_3, (10, 3, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP) AMDGCN_GPU ("gfx11-generic", GK_GFX11_GENERIC, Triple::AMDGPUSubArch11, (11, 0, 3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP) AMDGCN_GPU ("gfx11-7-generic", GK_GFX11_7_GENERIC, Triple::AMDGPUSubArch11_7, (11, 7, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP) AMDGCN_GPU ("gfx12-generic", GK_GFX12_GENERIC, Triple::AMDGPUSubArch12, (12, 0, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP) -AMDGCN_GPU ("gfx12-5-generic", GK_GFX12_5_GENERIC, Triple::AMDGPUSubArch12_5, (12, 5, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK) -AMDGCN_GPU ("gfx13-generic", GK_GFX13_GENERIC, Triple::AMDGPUSubArch13, (13, 1, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP) +AMDGCN_GPU ("gfx12-5-generic", GK_GFX12_5_GENERIC, Triple::AMDGPUSubArch12_5, (12, 5, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_CLUSTERS) +AMDGCN_GPU ("gfx13-generic", GK_GFX13_GENERIC, Triple::AMDGPUSubArch13, (13, 1, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP|FEATURE_CLUSTERS) #undef AMDGCN_GPU #undef AMDGCN_GPU_ALIAS diff --git a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h index e8f9268f5c1fb..bfc6c52a1924c 100644 --- a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h +++ b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h @@ -86,7 +86,13 @@ enum ArchFeatureKind : uint32_t { FEATURE_XNACK_ON_OFF_MODES = 1 << 10, // VI SGPR initialization bug requiring a fixed SGPR allocation size. - FEATURE_SGPR_INIT_BUG = 1 << 11 + FEATURE_SGPR_INIT_BUG = 1 << 11, + + // Clusters are supported. + FEATURE_CLUSTERS = 1 << 12, + + // AGPR allocation is supported. + FEATURE_AGPR_ALLOC = 1 << 13 }; enum FeatureError : uint32_t { @@ -161,6 +167,14 @@ LLVM_ABI unsigned getAddressableNumSGPRs(Triple::SubArchType SubArch); LLVM_ABI unsigned getSGPRAllocGranule(GPUKind AK); LLVM_ABI unsigned getSGPRAllocGranule(Triple::SubArchType SubArch); +/// \returns true if the target identified by \p SubArch has memory aperture +/// base and size registers. +LLVM_ABI bool hasApertureRegs(Triple::SubArchType SubArch); + +/// \returns true if the target identified by \p SubArch supports reading the +/// doorbell ID through S_GETREG. +LLVM_ABI bool supportsGetDoorbellID(Triple::SubArchType SubArch); + /// Fills Features map with default values for given target GPU. /// \p Features contains overriding target features and this function returns /// default target features with entries overridden by \p Features. diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp index 630ffad96e451..e007e22a5986b 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp @@ -153,7 +153,13 @@ class AMDGPUInformationCache : public InformationCache { BumpPtrAllocator &Allocator, SetVector<Function *> *CGSCC, TargetMachine &TM) : InformationCache(M, AG, Allocator, CGSCC), TM(TM), - CodeObjectVersion(AMDGPU::getAMDHSACodeObjectVersion(M)) {} + CodeObjectVersion(AMDGPU::getAMDHSACodeObjectVersion(M)), + HasApertureRegs( + AMDGPU::hasApertureRegs(M.getTargetTriple().getSubArch())), + SupportsGetDoorbellID( + AMDGPU::supportsGetDoorbellID(M.getTargetTriple().getSubArch())), + ArchAttr(AMDGPU::getArchAttrAMDGCN( + AMDGPU::getGPUKindFromSubArch(M.getTargetTriple().getSubArch()))) {} TargetMachine &TM; @@ -167,17 +173,17 @@ class AMDGPUInformationCache : public InformationCache { CS_WORST = DS_GLOBAL | ADDR_SPACE_CAST_BOTH_TO_FLAT, }; - /// Check if the subtarget has aperture regs. - bool hasApertureRegs(Function &F) { - const GCNSubtarget &ST = TM.getSubtarget<GCNSubtarget>(F); - return ST.hasApertureRegs(); - } + /// Check if the module target has aperture regs. + bool hasApertureRegs() const { return HasApertureRegs; } - /// Check if the subtarget supports GetDoorbellID. - bool supportsGetDoorbellID(Function &F) { - const GCNSubtarget &ST = TM.getSubtarget<GCNSubtarget>(F); - return ST.supportsGetDoorbellID(); - } + /// Check if the module target supports GetDoorbellID. + bool supportsGetDoorbellID() const { return SupportsGetDoorbellID; } + + /// Check if the module target supports clusters. + bool hasClusters() const { return ArchAttr & AMDGPU::FEATURE_CLUSTERS; } + + /// Check if the module target supports AGPR allocation. + bool hasAGPRAlloc() const { return ArchAttr & AMDGPU::FEATURE_AGPR_ALLOC; } std::optional<std::pair<unsigned, unsigned>> getFlatWorkGroupSizeAttr(const Function &F) const { @@ -288,7 +294,7 @@ class AMDGPUInformationCache : public InformationCache { /// Returns true if \p Fn needs the queue pointer because of \p C. bool needsQueuePtr(const Constant *C, Function &Fn) { bool IsNonEntryFunc = !AMDGPU::isEntryFunctionCC(Fn.getCallingConv()); - bool HasAperture = hasApertureRegs(Fn); + bool HasAperture = hasApertureRegs(); // No need to explore the constants. if (!IsNonEntryFunc && HasAperture) @@ -312,6 +318,9 @@ class AMDGPUInformationCache : public InformationCache { /// Used to determine if the Constant needs the queue pointer. DenseMap<const Constant *, std::optional<uint8_t>> ConstantStatus; const unsigned CodeObjectVersion; + const bool HasApertureRegs; + const bool SupportsGetDoorbellID; + const unsigned ArchAttr; }; struct AAAMDAttributes @@ -503,8 +512,8 @@ struct AAAMDAttributesFunction : public AAAMDAttributes { bool NeedsImplicit = false; auto &InfoCache = static_cast<AMDGPUInformationCache &>(A.getInfoCache()); - bool HasApertureRegs = InfoCache.hasApertureRegs(*F); - bool SupportsGetDoorbellID = InfoCache.supportsGetDoorbellID(*F); + bool HasApertureRegs = InfoCache.hasApertureRegs(); + bool SupportsGetDoorbellID = InfoCache.supportsGetDoorbellID(); unsigned COV = InfoCache.getCodeObjectVersion(); for (Function *Callee : AAEdges->getOptimisticEdges()) { @@ -639,7 +648,7 @@ struct AAAMDAttributesFunction : public AAAMDAttributes { return true; }; - bool HasApertureRegs = InfoCache.hasApertureRegs(*F); + bool HasApertureRegs = InfoCache.hasApertureRegs(); // `checkForAllInstructions` is much more cheaper than going through all // instructions, try it first. @@ -1638,11 +1647,10 @@ static bool runImpl(SetVector<Function *> &Functions, bool IsModulePass, A.getOrCreateAAFor<AAAMDWavesPerEU>(IRPosition::function(*F)); } - const GCNSubtarget &ST = TM.getSubtarget<GCNSubtarget>(*F); - if (!F->isDeclaration() && ST.hasClusters()) + if (!F->isDeclaration() && InfoCache.hasClusters()) A.getOrCreateAAFor<AAAMDGPUClusterDims>(IRPosition::function(*F)); - if (ST.hasGFX90AInsts()) + if (InfoCache.hasAGPRAlloc()) A.getOrCreateAAFor<AAAMDGPUMinAGPRAlloc>(IRPosition::function(*F)); for (auto &I : instructions(F)) { diff --git a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp index 6e70220640b11..889a25d4fd162 100644 --- a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp +++ b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp @@ -414,6 +414,16 @@ unsigned AMDGPU::getSGPRAllocGranule(Triple::SubArchType SubArch) { return 8; } +bool AMDGPU::hasApertureRegs(Triple::SubArchType SubArch) { + // Memory aperture registers were introduced on GFX9. + return getIsaVersion(SubArch).Major >= 9; +} + +bool AMDGPU::supportsGetDoorbellID(Triple::SubArchType SubArch) { + // The S_GETREG DOORBELL_ID is supported by all GFX9 onward targets. + return getIsaVersion(SubArch).Major >= 9; +} + StringRef AMDGPU::getCanonicalArchName(const Triple &T, StringRef Arch) { assert(T.isAMDGPU()); auto ProcKind = T.isAMDGCN() ? parseArchAMDGCN(Arch) : parseArchR600(Arch); _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
