https://github.com/krzysz00 updated https://github.com/llvm/llvm-project/pull/220103
>From 7232378e1a4dd539e368895392add84d728cdbed Mon Sep 17 00:00:00 2001 From: Krzysztof Drewniak <[email protected]> Date: Mon, 31 Aug 2026 19:32:14 +0000 Subject: [PATCH] [AMDGPU] Expose buffer resource num_records width in TargetParser This also fixes the conflict in gfx12. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> --- llvm/include/llvm/TargetParser/AMDGPUTargetParser.h | 6 ++++++ llvm/lib/Target/AMDGPU/AMDGPU.td | 2 +- llvm/lib/TargetParser/AMDGPUTargetParser.cpp | 13 +++++++++++++ .../test/TableGen/AMDGPUTargetDefSubArchSpelling.td | 6 +++--- .../utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp | 3 ++- 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h index c0c8980387f3b..342d0c4c22019 100644 --- a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h +++ b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h @@ -229,6 +229,12 @@ constexpr unsigned getNumWorkGroupSIMDs(bool FullSIMDMode) { /// \returns Minimum number of waves per execution unit. constexpr unsigned getMinWavesPerEU() { return 1; } +/// \returns Number of bits in the num_records field is a buffer resource, +/// or nullopt if the target is too generic to have a fixed value for that. +LLVM_ABI std::optional<unsigned> getBufferResourceNumRecordsWidth(GPUKind AK); +LLVM_ABI std::optional<unsigned> +getBufferResourceNumRecordsWidth(Triple::SubArchType SubArch); + /// \returns Maximum number of waves per execution unit without any kind of /// limitation. LLVM_ABI unsigned getMaxWavesPerEU(GPUKind AK); diff --git a/llvm/lib/Target/AMDGPU/AMDGPU.td b/llvm/lib/Target/AMDGPU/AMDGPU.td index dff41c7794a3d..65fb323a0b10e 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPU.td +++ b/llvm/lib/Target/AMDGPU/AMDGPU.td @@ -1789,7 +1789,6 @@ def FeatureGFX12 : GCNSubtargetFeatureGeneration<"GFX12", FeatureMinimum3Maximum3F32, FeatureMinimum3Maximum3F16, FeatureAgentScopeFineGrainedRemoteMemoryAtomics, FeatureFlatOffsetBits24, FeatureFlatSignedOffset, FeatureInstCacheLineSize128, - Feature32BitNumRecordsBufferResource, FeatureMaxWavesPerEU16 ] >; @@ -2289,6 +2288,7 @@ def FeatureISAVersion11_7_Generic: FeatureSet< def FeatureISAVersion12 : FeatureSet< [FeatureGFX12, + Feature32BitNumRecordsBufferResource, FeatureSupportsWave64, FeatureSupportsWGP, FeatureBackOffBarrier, FeatureAddressableLocalMemorySize65536, diff --git a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp index 18e7d6d9c5e00..5642e8073d75d 100644 --- a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp +++ b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp @@ -44,6 +44,7 @@ struct GPUInfo { StringTable::Offset BaseName; // The canonical device name for a variant. uint8_t MaxWavesPerEU; uint32_t MaxHWAddressableLocalMemorySize; + uint8_t BufferResourceNumRecordsWidth; }; // Per-GPU data for the R600 GPUKinds. @@ -477,6 +478,18 @@ AMDGPU::getMaxHWAddressableLocalMemorySize(Triple::SubArchType SubArch) { return getMaxHWAddressableLocalMemorySize(getGPUKindFromSubArch(SubArch)); } +std::optional<unsigned> AMDGPU::getBufferResourceNumRecordsWidth(GPUKind AK) { + const GPUInfo *Info = getAMDGPUInfo(AK); + if (!Info) + return std::nullopt; + return Info->BufferResourceNumRecordsWidth; +} + +std::optional<unsigned> +AMDGPU::getBufferResourceNumRecordsWidth(Triple::SubArchType SubArch) { + return getBufferResourceNumRecordsWidth(getGPUKindFromSubArch(SubArch)); +} + unsigned AMDGPU::getMaxWavesPerEU(GPUKind AK) { const GPUInfo *Info = getAMDGPUInfo(AK); return Info ? Info->MaxWavesPerEU : 10; diff --git a/llvm/test/TableGen/AMDGPUTargetDefSubArchSpelling.td b/llvm/test/TableGen/AMDGPUTargetDefSubArchSpelling.td index dcbd52c072840..6ea996648b97e 100644 --- a/llvm/test/TableGen/AMDGPUTargetDefSubArchSpelling.td +++ b/llvm/test/TableGen/AMDGPUTargetDefSubArchSpelling.td @@ -46,9 +46,9 @@ def GFX88F : ProcessorModel<"gfx88f", NoSchedModel, []>, // The GPU table: the base GPU has no base name (offset 0); the variant uses // AMDGPUSubArch888A and records "gfx888" as its base name. -// CHECK: {[[#]], Triple::AMDGPUSubArch888, {{.*}}, {8, 8, 8}, [[FAM:[0-9]+]], 0, [[#]], [[#]]}, -// CHECK: {[[#]], Triple::AMDGPUSubArch888A, {{.*}}, {8, 8, 8}, [[FAM]], [[#]], [[#]], [[#]]}, -// CHECK: {[[#]], Triple::AMDGPUSubArch88F, {{.*}}, {8, 8, 15}, [[#]], 0, [[#]], [[#]]}, +// CHECK: {[[#]], Triple::AMDGPUSubArch888, {{.*}}, {8, 8, 8}, [[FAM:[0-9]+]], 0, [[#]], [[#]], [[#]]}, +// CHECK: {[[#]], Triple::AMDGPUSubArch888A, {{.*}}, {8, 8, 8}, [[FAM]], [[#]], [[#]], [[#]], [[#]]}, +// CHECK: {[[#]], Triple::AMDGPUSubArch88F, {{.*}}, {8, 8, 15}, [[#]], 0, [[#]], [[#]], [[#]]}, // The subarch-name table maps the variant's own subarch to its triple name. // CHECK: {Triple::AMDGPUSubArch888A, [[#]], [[#]]}, diff --git a/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp b/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp index 781b68ee6abf7..6f4e7a7d66e9e 100644 --- a/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp +++ b/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp @@ -621,7 +621,8 @@ emitAMDGPUTable(raw_ostream &OS, const RecordKeeper &RK, emitBaseName(BaseNameOS, R); OS << Names.GetOrAddStringOffset(BaseName) << ", " << getFeatureValue(R, "MaxWavesPerEU", 10) << ", " - << getFeatureValue(R, "AddressableLocalMemorySize", 32768) << "},\n"; + << getFeatureValue(R, "AddressableLocalMemorySize", 32768) << ", " + << getFeatureValue(R, "BufferResourceNumRecordsWidth", 32) << "},\n"; } OS << "};\n" "#endif // GET_AMDGPU_GPU_TABLE\n\n"; _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
