[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