[llvm] b42621f - AMDGPU: TableGen the subarch to processor name mapping table (#212606)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 29 23:50:25 PDT 2026
Author: Matt Arsenault
Date: 2026-07-30T06:50:20Z
New Revision: b42621f842571a92cec2961fa5c4fc518d4ca91a
URL: https://github.com/llvm/llvm-project/commit/b42621f842571a92cec2961fa5c4fc518d4ca91a
DIFF: https://github.com/llvm/llvm-project/commit/b42621f842571a92cec2961fa5c4fc518d4ca91a.diff
LOG: AMDGPU: TableGen the subarch to processor name mapping table (#212606)
Replace the hand-written AMDGPUSubArchNames array (SubArch -> canonical
GPU name) with a generated table.
Co-authored-by: Claude (Claude-Opus-4.8)
Added:
Modified:
llvm/lib/TargetParser/AMDGPUTargetParser.cpp
llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp
Removed:
################################################################################
diff --git a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp
index a555c94ee6c91..72b474cff7cc1 100644
--- a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp
+++ b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp
@@ -14,6 +14,7 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/StringTable.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
@@ -29,17 +30,23 @@ constexpr unsigned NumAMDGPUSubArches =
// Per-GPU data for the AMDGCN GPUKinds, from the generated table below.
struct GPUInfo {
- StringRef Name;
+ StringTable::Offset Name;
Triple::SubArchType SubArch;
unsigned ArchFeatures;
IsaVersion Version;
- StringRef FamilyName;
+ StringTable::Offset FamilyName;
};
+#define GET_AMDGPU_NAME_TABLE
#define GET_AMDGPU_GPU_TABLE
#define GET_AMDGPU_MAJOR_SUBARCH
+#define GET_AMDGPU_SUBARCH_NAME
#include "llvm/TargetParser/AMDGPUTargetParserDef.inc"
+// The string table shared by every generated table that stores GPU-name-derived
+// strings as offsets.
+constexpr StringTable AMDGPUNameStrTab = AMDGPUNameTable;
+
// Look up the GPUInfo row for an AMDGCN GPUKind, or nullptr for GK_NONE / a
// non-AMDGCN (R600) kind.
const GPUInfo *getAMDGPUInfo(GPUKind AK) {
@@ -80,11 +87,21 @@ constexpr std::array<Triple::SubArchType, NumAMDGPUSubArches>
Map[Entry.SubArch - Triple::FirstAMDGPUSubArch] = Entry.Major;
return Map;
}();
+
+// SubArch -> name-offset, indexed by (SubArch - FirstAMDGPUSubArch). Unmapped
+// subarches keep offset 0 (the empty string).
+constexpr std::array<StringTable::Offset, NumAMDGPUSubArches>
+ AMDGPUSubArchNameOffsets = [] {
+ std::array<StringTable::Offset, NumAMDGPUSubArches> Map{};
+ for (const AMDGPUSubArchNameEntry &Entry : AMDGPUSubArchNames)
+ Map[Entry.SubArch - Triple::FirstAMDGPUSubArch] = Entry.NameOffset;
+ return Map;
+ }();
} // namespace
StringRef llvm::AMDGPU::getArchFamilyNameAMDGCN(GPUKind AK) {
const GPUInfo *Info = getAMDGPUInfo(AK);
- return Info ? Info->FamilyName : "";
+ return Info ? AMDGPUNameStrTab[Info->FamilyName] : "";
}
Triple::SubArchType llvm::AMDGPU::getSubArch(GPUKind AK) {
@@ -191,52 +208,15 @@ std::string AMDGPU::mergeSubArch(const Triple &A, const Triple &B) {
StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) {
const GPUInfo *Info = getAMDGPUInfo(AK);
- return Info ? Info->Name : "";
+ return Info ? AMDGPUNameStrTab[Info->Name] : "";
}
-// Canonical GPU name for each AMDGPU subarch, indexed by SubArch -
-// Triple::FirstAMDGPUSubArch.
-static const StringLiteral AMDGPUSubArchNames[Triple::LastAMDGPUSubArch -
- Triple::FirstAMDGPUSubArch + 1] =
- {"gfx600", // AMDGPUSubArch6 (no generic target)
- "gfx600", "gfx601", "gfx602",
-
- "gfx700", // AMDGPUSubArch7 (no generic target)
- "gfx700", "gfx701", "gfx702", "gfx703", "gfx704",
- "gfx705",
-
- "gfx801", // AMDGPUSubArch8 (no generic target)
- "gfx801", "gfx802", "gfx803", "gfx805",
-
- "gfx810",
-
- "gfx9-generic", "gfx900", "gfx902", "gfx904", "gfx906",
- "gfx909", "gfx90c",
-
- "gfx908", "gfx90a",
-
- "gfx9-4-generic", "gfx942", "gfx950",
-
- "gfx10-1-generic", "gfx1010", "gfx1011", "gfx1012", "gfx1013",
-
- "gfx10-3-generic", "gfx1030", "gfx1031", "gfx1032", "gfx1033",
- "gfx1034", "gfx1035", "gfx1036",
-
- "gfx11-generic", "gfx1100", "gfx1101", "gfx1102", "gfx1103",
- "gfx1150", "gfx1151", "gfx1152", "gfx1153", "gfx1154",
-
- "gfx11-7-generic", "gfx1170", "gfx1171", "gfx1172",
-
- "gfx12-generic", "gfx1200", "gfx1201", "gfx12-5-generic", "gfx1250",
- "gfx1251",
-
- "gfx13-generic", "gfx1310"};
-
StringRef llvm::AMDGPU::getArchNameFromSubArch(Triple::SubArchType SubArch) {
if (SubArch < Triple::FirstAMDGPUSubArch ||
SubArch > Triple::LastAMDGPUSubArch)
return "";
- return AMDGPUSubArchNames[SubArch - Triple::FirstAMDGPUSubArch];
+ return AMDGPUNameStrTab[AMDGPUSubArchNameOffsets[SubArch -
+ Triple::FirstAMDGPUSubArch]];
}
StringRef llvm::AMDGPU::getArchNameR600(GPUKind AK) {
diff --git a/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp b/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp
index ece842771f32c..4a675bd8f8339 100644
--- a/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp
+++ b/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp
@@ -17,6 +17,7 @@
#include "llvm/Support/raw_ostream.h"
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Record.h"
+#include "llvm/TableGen/StringToOffsetTable.h"
#include "llvm/TableGen/TableGenBackend.h"
#include <string>
#include <utility>
@@ -272,8 +273,10 @@ static void emitAMDGPU(raw_ostream &OS, const RecordKeeper &RK) {
"#undef AMDGPU_GPU_ALIAS\n";
}
-/// Emit a GPUInfo table indexed by (GPUKind - AMDGPUFirstGPUKind).
-static void emitAMDGPUTable(raw_ostream &OS, const RecordKeeper &RK) {
+/// Emit a GPUInfo table indexed by (GPUKind - AMDGPUFirstGPUKind). Name and
+/// family strings are stored as offsets into the shared \p Names table.
+static void emitAMDGPUTable(raw_ostream &OS, const RecordKeeper &RK,
+ StringToOffsetTable &Names) {
std::vector<GPUEntry> Entries = collectGPUs(RK, /*WantR600=*/false);
if (Entries.empty())
return;
@@ -299,13 +302,13 @@ static void emitAMDGPUTable(raw_ostream &OS, const RecordKeeper &RK) {
"static constexpr GPUInfo AMDGPUGPUTable[] = {\n";
for (const Record *R : Canon) {
StringRef Name = R->getValueAsString("Name");
- OS << " {\"" << Name << "\", ";
+ OS << " {" << Names.GetOrAddStringOffset(Name) << ", ";
emitSubArch(OS, R);
OS << ", ";
emitFeatureExpr(OS, R, "FEATURE_NONE");
OS << ", ";
emitIsaVersion(OS, R, '{', '}');
- OS << ", \"" << getArchFamily(R) << "\"},\n";
+ OS << ", " << Names.GetOrAddStringOffset(getArchFamily(R)) << "},\n";
}
OS << "};\n"
"#endif // GET_AMDGPU_GPU_TABLE\n\n";
@@ -366,6 +369,43 @@ static void emitAMDGPUMajorSubArch(raw_ostream &OS, const RecordKeeper &RK) {
"#endif // GET_AMDGPU_MAJOR_SUBARCH\n\n";
}
+// Emit the canonical GPU name for each AMDGPU subarch.
+static void emitAMDGPUSubArchNames(raw_ostream &OS, const RecordKeeper &RK,
+ StringToOffsetTable &Names) {
+ // (subarch enumerator, name) pairs.
+ std::vector<std::pair<std::string, StringRef>> Pairs;
+ for (const GPUEntry &E : collectGPUs(RK, /*WantR600=*/false)) {
+ if (E.IsAlias || E.Rec->getValueAsBit("IsPseudoTarget"))
+ continue;
+ StringRef Name = E.Rec->getValueAsString("Name");
+ std::string SA;
+ raw_string_ostream SO(SA);
+ emitSubArchForName(SO, Name);
+ Pairs.emplace_back(std::move(SA), Name);
+ }
+ for (const Record *F : RK.getAllDerivedDefinitionsIfDefined("AMDGPUFamily")) {
+ std::vector<const Record *> Members = F->getValueAsListOfDefs("Members");
+ Pairs.emplace_back("Triple::AMDGPUSubArch" +
+ F->getValueAsString("MajorSubArch").str(),
+ Members.front()->getValueAsString("Name"));
+ }
+ if (Pairs.empty())
+ return;
+
+ OS << "#ifdef GET_AMDGPU_SUBARCH_NAME\n"
+ "#undef GET_AMDGPU_SUBARCH_NAME\n";
+ OS << "struct AMDGPUSubArchNameEntry {\n"
+ " Triple::SubArchType SubArch;\n"
+ " StringTable::Offset NameOffset;\n"
+ "};\n"
+ "static constexpr AMDGPUSubArchNameEntry AMDGPUSubArchNames[] = {\n";
+ for (const auto &[SubArch, Name] : Pairs)
+ OS << " {" << SubArch << ", " << Names.GetOrAddStringOffset(Name)
+ << "},\n";
+ OS << "};\n"
+ "#endif // GET_AMDGPU_SUBARCH_NAME\n\n";
+}
+
static void emitAMDGPUTargetDef(const RecordKeeper &RK, raw_ostream &OS) {
OS << "// Autogenerated by AMDGPUTargetDefEmitter.cpp\n\n";
// R600 processors are Processor records; AMDGPU processors are
@@ -374,8 +414,24 @@ static void emitAMDGPUTargetDef(const RecordKeeper &RK, raw_ostream &OS) {
// run; the other section emits nothing.
emitR600(OS, RK);
emitAMDGPU(OS, RK);
- emitAMDGPUTable(OS, RK);
emitAMDGPUMajorSubArch(OS, RK);
+
+ // The GPUInfo and SubArchName tables both reference GPU-name strings; pool
+ // them into a single string table. Buffer the two tables first so every
+ // referenced string is interned, then emit the shared table def (guarded so
+ // consumers pull it in once) ahead of the buffered tables.
+ StringToOffsetTable Names;
+ std::string GPUTable, SubArchNames;
+ raw_string_ostream GPUTableOS(GPUTable), SubArchNamesOS(SubArchNames);
+ emitAMDGPUTable(GPUTableOS, RK, Names);
+ emitAMDGPUSubArchNames(SubArchNamesOS, RK, Names);
+
+ OS << "#ifdef GET_AMDGPU_NAME_TABLE\n"
+ "#undef GET_AMDGPU_NAME_TABLE\n";
+ Names.EmitStringTableDef(OS, "AMDGPUNameTable");
+ OS << "#endif // GET_AMDGPU_NAME_TABLE\n\n";
+
+ OS << GPUTable << SubArchNames;
}
static TableGen::Emitter::Opt X("gen-amdgpu-target-def", emitAMDGPUTargetDef,
More information about the llvm-commits
mailing list