[llvm] [TargetParser] Introduce AMDGPUTargetParser.def. NFCI. (PR #186137)

Jay Foad via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 12 08:08:31 PDT 2026


https://github.com/jayfoad created https://github.com/llvm/llvm-project/pull/186137

Define AMDGPU GPUs in a separate .def file similar to other targets, so
they are listed in just one place instead of three.


>From daf1d2b2a0699b56e0a26cc466e3bce9e6e29a86 Mon Sep 17 00:00:00 2001
From: Jay Foad <jay.foad at amd.com>
Date: Thu, 12 Mar 2026 12:32:11 +0000
Subject: [PATCH] [TargetParser] Introduce AMDGPUTargetParser.def. NFCI.

Define AMDGPU GPUs in a separate .def file similar to other targets, so
they are listed in just one place instead of three.
---
 .../llvm/TargetParser/AMDGPUTargetParser.def  | 150 +++++++++
 llvm/include/llvm/TargetParser/TargetParser.h |  93 +-----
 llvm/lib/TargetParser/TargetParser.cpp        | 301 ++++--------------
 3 files changed, 214 insertions(+), 330 deletions(-)
 create mode 100644 llvm/include/llvm/TargetParser/AMDGPUTargetParser.def

diff --git a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def
new file mode 100644
index 0000000000000..babb815c28dee
--- /dev/null
+++ b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def
@@ -0,0 +1,150 @@
+//===- AMDGPUTargetParser.def - AMDGPU target parsing defines ---*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides defines to build up the AMDGPU target parser's logic.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef R600_GPU
+#define R600_GPU(NAME, ENUM, FEATURES)
+#endif
+
+#ifndef R600_GPU_ALIAS
+#define R600_GPU_ALIAS(NAME, ENUM)
+#endif
+
+R600_GPU      ("r600",    GK_R600,    FEATURE_NONE)
+R600_GPU_ALIAS("rv630",   GK_R600)
+R600_GPU_ALIAS("rv635",   GK_R600)
+R600_GPU      ("r630",    GK_R630,    FEATURE_NONE)
+R600_GPU_ALIAS("rs780",   GK_RS880)
+R600_GPU      ("rs880",   GK_RS880,   FEATURE_NONE)
+R600_GPU_ALIAS("rv610",   GK_RS880)
+R600_GPU_ALIAS("rv620",   GK_RS880)
+R600_GPU      ("rv670",   GK_RV670,   FEATURE_NONE)
+R600_GPU      ("rv710",   GK_RV710,   FEATURE_NONE)
+R600_GPU      ("rv730",   GK_RV730,   FEATURE_NONE)
+R600_GPU_ALIAS("rv740",   GK_RV770)
+R600_GPU      ("rv770",   GK_RV770,   FEATURE_NONE)
+R600_GPU      ("cedar",   GK_CEDAR,   FEATURE_NONE)
+R600_GPU_ALIAS("palm",    GK_CEDAR)
+R600_GPU      ("cypress", GK_CYPRESS, FEATURE_FMA)
+R600_GPU_ALIAS("hemlock", GK_CYPRESS)
+R600_GPU      ("juniper", GK_JUNIPER, FEATURE_NONE)
+R600_GPU      ("redwood", GK_REDWOOD, FEATURE_NONE)
+R600_GPU      ("sumo",    GK_SUMO,    FEATURE_NONE)
+R600_GPU_ALIAS("sumo2",   GK_SUMO)
+R600_GPU      ("barts",   GK_BARTS,   FEATURE_NONE)
+R600_GPU      ("caicos",  GK_CAICOS,  FEATURE_NONE)
+R600_GPU_ALIAS("aruba",   GK_CAYMAN)
+R600_GPU      ("cayman",  GK_CAYMAN,  FEATURE_FMA)
+R600_GPU      ("turks",   GK_TURKS,   FEATURE_NONE)
+
+#undef R600_GPU
+#undef R600_GPU_ALIAS
+
+#ifndef AMDGCN_GPU
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES)
+#endif
+
+#ifndef AMDGCN_GPU_ALIAS
+#define AMDGCN_GPU_ALIAS(NAME, ENUM)
+#endif
+
+// Don't bother listing the implicitly true features
+AMDGCN_GPU      ("gfx600",    GK_GFX600,  ( 6, 0,  0), FEATURE_FAST_FMA_F32)
+AMDGCN_GPU_ALIAS("tahiti",    GK_GFX600)
+AMDGCN_GPU      ("gfx601",    GK_GFX601,  ( 6, 0,  1), FEATURE_NONE)
+AMDGCN_GPU_ALIAS("pitcairn",  GK_GFX601)
+AMDGCN_GPU_ALIAS("verde",     GK_GFX601)
+AMDGCN_GPU      ("gfx602",    GK_GFX602,  ( 6, 0,  2), FEATURE_NONE)
+AMDGCN_GPU_ALIAS("hainan",    GK_GFX602)
+AMDGCN_GPU_ALIAS("oland",     GK_GFX602)
+AMDGCN_GPU      ("gfx700",    GK_GFX700,  ( 7, 0,  0), FEATURE_NONE)
+AMDGCN_GPU_ALIAS("kaveri",    GK_GFX700)
+AMDGCN_GPU      ("gfx701",    GK_GFX701,  ( 7, 0,  1), FEATURE_FAST_FMA_F32)
+AMDGCN_GPU_ALIAS("hawaii",    GK_GFX701)
+AMDGCN_GPU      ("gfx702",    GK_GFX702,  ( 7, 0,  2), FEATURE_FAST_FMA_F32)
+AMDGCN_GPU      ("gfx703",    GK_GFX703,  ( 7, 0,  3), FEATURE_NONE)
+AMDGCN_GPU_ALIAS("kabini",    GK_GFX703)
+AMDGCN_GPU_ALIAS("mullins",   GK_GFX703)
+AMDGCN_GPU      ("gfx704",    GK_GFX704,  ( 7, 0,  4), FEATURE_NONE)
+AMDGCN_GPU_ALIAS("bonaire",   GK_GFX704)
+AMDGCN_GPU      ("gfx705",    GK_GFX705,  ( 7, 0,  5), FEATURE_NONE)
+AMDGCN_GPU      ("gfx801",    GK_GFX801,  ( 8, 0,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU_ALIAS("carrizo",   GK_GFX801)
+AMDGCN_GPU      ("gfx802",    GK_GFX802,  ( 8, 0,  2), FEATURE_FAST_DENORMAL_F32)
+AMDGCN_GPU_ALIAS("iceland",   GK_GFX802)
+AMDGCN_GPU_ALIAS("tonga",     GK_GFX802)
+AMDGCN_GPU      ("gfx803",    GK_GFX803,  ( 8, 0,  3), FEATURE_FAST_DENORMAL_F32)
+AMDGCN_GPU_ALIAS("fiji",      GK_GFX803)
+AMDGCN_GPU_ALIAS("polaris10", GK_GFX803)
+AMDGCN_GPU_ALIAS("polaris11", GK_GFX803)
+AMDGCN_GPU      ("gfx805",    GK_GFX805,  ( 8, 0,  5), FEATURE_FAST_DENORMAL_F32)
+AMDGCN_GPU_ALIAS("tongapro",  GK_GFX805)
+AMDGCN_GPU      ("gfx810",    GK_GFX810,  ( 8, 1,  0), FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU_ALIAS("stoney",    GK_GFX810)
+AMDGCN_GPU      ("gfx900",    GK_GFX900,  ( 9, 0,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU      ("gfx902",    GK_GFX902,  ( 9, 0,  2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU      ("gfx904",    GK_GFX904,  ( 9, 0,  4), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU      ("gfx906",    GK_GFX906,  ( 9, 0,  6), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC)
+AMDGCN_GPU      ("gfx908",    GK_GFX908,  ( 9, 0,  8), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC)
+AMDGCN_GPU      ("gfx909",    GK_GFX909,  ( 9, 0,  9), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU      ("gfx90a",    GK_GFX90A,  ( 9, 0, 10), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC)
+AMDGCN_GPU      ("gfx90c",    GK_GFX90C,  ( 9, 0, 12), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU      ("gfx942",    GK_GFX942,  ( 9, 4,  2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC)
+AMDGCN_GPU      ("gfx950",    GK_GFX950,  ( 9, 5,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC)
+AMDGCN_GPU      ("gfx1010",   GK_GFX1010, (10, 1,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1011",   GK_GFX1011, (10, 1,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1012",   GK_GFX1012, (10, 1,  2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1013",   GK_GFX1013, (10, 1,  3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1030",   GK_GFX1030, (10, 3,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1031",   GK_GFX1031, (10, 3,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1032",   GK_GFX1032, (10, 3,  2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1033",   GK_GFX1033, (10, 3,  3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1034",   GK_GFX1034, (10, 3,  4), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1035",   GK_GFX1035, (10, 3,  5), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1036",   GK_GFX1036, (10, 3,  6), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1100",   GK_GFX1100, (11, 0,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1101",   GK_GFX1101, (11, 0,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1102",   GK_GFX1102, (11, 0,  2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1103",   GK_GFX1103, (11, 0,  3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1150",   GK_GFX1150, (11, 5,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1151",   GK_GFX1151, (11, 5,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1152",   GK_GFX1152, (11, 5,  2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1153",   GK_GFX1153, (11, 5,  3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1170",   GK_GFX1170, (11, 7,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1200",   GK_GFX1200, (12, 0,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1201",   GK_GFX1201, (12, 0,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx1250",   GK_GFX1250, (12, 5,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK_ALWAYS)
+AMDGCN_GPU      ("gfx1251",   GK_GFX1251, (12, 5,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK_ALWAYS)
+AMDGCN_GPU      ("gfx1310",   GK_GFX1310, (13, 1,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+
+// Generic targets return the lowest common denominator
+// within their family. That is, the ISA that is the most
+// restricted in terms of features.
+//
+// gfx9-generic is tricky because there is no lowest
+// common denominator, so we return gfx900 which has mad-mix
+// but this family doesn't have it.
+//
+// This API should never be used to check for a particular
+// feature anyway.
+//
+// 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,    ( 9, 0, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU      ("gfx10-1-generic", GK_GFX10_1_GENERIC, (10, 1, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP)
+AMDGCN_GPU      ("gfx10-3-generic", GK_GFX10_3_GENERIC, (10, 3, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx11-generic",   GK_GFX11_GENERIC,   (11, 0, 3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx12-generic",   GK_GFX12_GENERIC,   (12, 0, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU      ("gfx9-4-generic",  GK_GFX9_4_GENERIC,  ( 9, 4, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC)
+AMDGCN_GPU      ("gfx12-5-generic", GK_GFX12_5_GENERIC, (12, 5, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32)
+
+#undef AMDGCN_GPU
+#undef AMDGCN_GPU_ALIAS
diff --git a/llvm/include/llvm/TargetParser/TargetParser.h b/llvm/include/llvm/TargetParser/TargetParser.h
index 068374683e0ac..caf57c804db46 100644
--- a/llvm/include/llvm/TargetParser/TargetParser.h
+++ b/llvm/include/llvm/TargetParser/TargetParser.h
@@ -39,96 +39,9 @@ enum GPUKind : uint32_t {
   // Not specified processor.
   GK_NONE = 0,
 
-  // R600-based processors.
-  GK_R600,
-  GK_R630,
-  GK_RS880,
-  GK_RV670,
-  GK_RV710,
-  GK_RV730,
-  GK_RV770,
-  GK_CEDAR,
-  GK_CYPRESS,
-  GK_JUNIPER,
-  GK_REDWOOD,
-  GK_SUMO,
-  GK_BARTS,
-  GK_CAICOS,
-  GK_CAYMAN,
-  GK_TURKS,
-
-  GK_R600_FIRST = GK_R600,
-  GK_R600_LAST = GK_TURKS,
-
-  // AMDGCN-based processors.
-  GK_GFX600,
-  GK_GFX601,
-  GK_GFX602,
-
-  GK_GFX700,
-  GK_GFX701,
-  GK_GFX702,
-  GK_GFX703,
-  GK_GFX704,
-  GK_GFX705,
-
-  GK_GFX801,
-  GK_GFX802,
-  GK_GFX803,
-  GK_GFX805,
-  GK_GFX810,
-
-  GK_GFX900,
-  GK_GFX902,
-  GK_GFX904,
-  GK_GFX906,
-  GK_GFX908,
-  GK_GFX909,
-  GK_GFX90A,
-  GK_GFX90C,
-  GK_GFX942,
-  GK_GFX950,
-
-  GK_GFX1010,
-  GK_GFX1011,
-  GK_GFX1012,
-  GK_GFX1013,
-  GK_GFX1030,
-  GK_GFX1031,
-  GK_GFX1032,
-  GK_GFX1033,
-  GK_GFX1034,
-  GK_GFX1035,
-  GK_GFX1036,
-
-  GK_GFX1100,
-  GK_GFX1101,
-  GK_GFX1102,
-  GK_GFX1103,
-  GK_GFX1150,
-  GK_GFX1151,
-  GK_GFX1152,
-  GK_GFX1153,
-
-  GK_GFX1170,
-
-  GK_GFX1200,
-  GK_GFX1201,
-  GK_GFX1250,
-  GK_GFX1251,
-
-  GK_GFX1310,
-
-  GK_AMDGCN_FIRST = GK_GFX600,
-  GK_AMDGCN_LAST = GK_GFX1310,
-
-  GK_GFX9_GENERIC,
-  GK_GFX10_1_GENERIC,
-  GK_GFX10_3_GENERIC,
-  GK_GFX11_GENERIC,
-  GK_GFX12_GENERIC,
-  GK_GFX9_4_GENERIC,
-  GK_GFX12_5_GENERIC,
+#define R600_GPU(NAME, ENUM, FEATURES) ENUM,
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES) ENUM,
+#include "AMDGPUTargetParser.def"
 
   GK_AMDGCN_GENERIC_FIRST = GK_GFX9_GENERIC,
   GK_AMDGCN_GENERIC_LAST = GK_GFX12_5_GENERIC,
diff --git a/llvm/lib/TargetParser/TargetParser.cpp b/llvm/lib/TargetParser/TargetParser.cpp
index 3dcd0e9990021..b2ae5e0a5b84b 100644
--- a/llvm/lib/TargetParser/TargetParser.cpp
+++ b/llvm/lib/TargetParser/TargetParser.cpp
@@ -13,6 +13,7 @@
 
 #include "llvm/TargetParser/TargetParser.h"
 #include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/StringSwitch.h"
 #include "llvm/TargetParser/Triple.h"
 
 using namespace llvm;
@@ -65,145 +66,6 @@ std::optional<llvm::StringMap<bool>> llvm::getCPUDefaultTargetFeatures(
   return DefaultFeatures;
 }
 
-namespace {
-
-struct GPUInfo {
-  StringLiteral Name;
-  StringLiteral CanonicalName;
-  AMDGPU::GPUKind Kind;
-  unsigned Features;
-};
-
-constexpr GPUInfo R600GPUs[] = {
-  // Name       Canonical    Kind        Features
-  //            Name
-  {{"r600"},    {"r600"},    GK_R600,    FEATURE_NONE },
-  {{"rv630"},   {"r600"},    GK_R600,    FEATURE_NONE },
-  {{"rv635"},   {"r600"},    GK_R600,    FEATURE_NONE },
-  {{"r630"},    {"r630"},    GK_R630,    FEATURE_NONE },
-  {{"rs780"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
-  {{"rs880"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
-  {{"rv610"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
-  {{"rv620"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
-  {{"rv670"},   {"rv670"},   GK_RV670,   FEATURE_NONE },
-  {{"rv710"},   {"rv710"},   GK_RV710,   FEATURE_NONE },
-  {{"rv730"},   {"rv730"},   GK_RV730,   FEATURE_NONE },
-  {{"rv740"},   {"rv770"},   GK_RV770,   FEATURE_NONE },
-  {{"rv770"},   {"rv770"},   GK_RV770,   FEATURE_NONE },
-  {{"cedar"},   {"cedar"},   GK_CEDAR,   FEATURE_NONE },
-  {{"palm"},    {"cedar"},   GK_CEDAR,   FEATURE_NONE },
-  {{"cypress"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA  },
-  {{"hemlock"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA  },
-  {{"juniper"}, {"juniper"}, GK_JUNIPER, FEATURE_NONE },
-  {{"redwood"}, {"redwood"}, GK_REDWOOD, FEATURE_NONE },
-  {{"sumo"},    {"sumo"},    GK_SUMO,    FEATURE_NONE },
-  {{"sumo2"},   {"sumo"},    GK_SUMO,    FEATURE_NONE },
-  {{"barts"},   {"barts"},   GK_BARTS,   FEATURE_NONE },
-  {{"caicos"},  {"caicos"},  GK_CAICOS,  FEATURE_NONE },
-  {{"aruba"},   {"cayman"},  GK_CAYMAN,  FEATURE_FMA  },
-  {{"cayman"},  {"cayman"},  GK_CAYMAN,  FEATURE_FMA  },
-  {{"turks"},   {"turks"},   GK_TURKS,   FEATURE_NONE }
-};
-
-// This table should be sorted by the value of GPUKind
-// Don't bother listing the implicitly true features
-constexpr GPUInfo AMDGCNGPUs[] = {
-    // clang-format off
-    // Name         Canonical    Kind        Features
-    //              Name
-    {{"gfx600"},    {"gfx600"},  GK_GFX600,  FEATURE_FAST_FMA_F32},
-    {{"tahiti"},    {"gfx600"},  GK_GFX600,  FEATURE_FAST_FMA_F32},
-    {{"gfx601"},    {"gfx601"},  GK_GFX601,  FEATURE_NONE},
-    {{"pitcairn"},  {"gfx601"},  GK_GFX601,  FEATURE_NONE},
-    {{"verde"},     {"gfx601"},  GK_GFX601,  FEATURE_NONE},
-    {{"gfx602"},    {"gfx602"},  GK_GFX602,  FEATURE_NONE},
-    {{"hainan"},    {"gfx602"},  GK_GFX602,  FEATURE_NONE},
-    {{"oland"},     {"gfx602"},  GK_GFX602,  FEATURE_NONE},
-    {{"gfx700"},    {"gfx700"},  GK_GFX700,  FEATURE_NONE},
-    {{"kaveri"},    {"gfx700"},  GK_GFX700,  FEATURE_NONE},
-    {{"gfx701"},    {"gfx701"},  GK_GFX701,  FEATURE_FAST_FMA_F32},
-    {{"hawaii"},    {"gfx701"},  GK_GFX701,  FEATURE_FAST_FMA_F32},
-    {{"gfx702"},    {"gfx702"},  GK_GFX702,  FEATURE_FAST_FMA_F32},
-    {{"gfx703"},    {"gfx703"},  GK_GFX703,  FEATURE_NONE},
-    {{"kabini"},    {"gfx703"},  GK_GFX703,  FEATURE_NONE},
-    {{"mullins"},   {"gfx703"},  GK_GFX703,  FEATURE_NONE},
-    {{"gfx704"},    {"gfx704"},  GK_GFX704,  FEATURE_NONE},
-    {{"bonaire"},   {"gfx704"},  GK_GFX704,  FEATURE_NONE},
-    {{"gfx705"},    {"gfx705"},  GK_GFX705,  FEATURE_NONE},
-    {{"gfx801"},    {"gfx801"},  GK_GFX801,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
-    {{"carrizo"},   {"gfx801"},  GK_GFX801,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
-    {{"gfx802"},    {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
-    {{"iceland"},   {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
-    {{"tonga"},     {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
-    {{"gfx803"},    {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
-    {{"fiji"},      {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
-    {{"polaris10"}, {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
-    {{"polaris11"}, {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
-    {{"gfx805"},    {"gfx805"},  GK_GFX805,  FEATURE_FAST_DENORMAL_F32},
-    {{"tongapro"},  {"gfx805"},  GK_GFX805,  FEATURE_FAST_DENORMAL_F32},
-    {{"gfx810"},    {"gfx810"},  GK_GFX810,  FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
-    {{"stoney"},    {"gfx810"},  GK_GFX810,  FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
-    {{"gfx900"},    {"gfx900"},  GK_GFX900,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
-    {{"gfx902"},    {"gfx902"},  GK_GFX902,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
-    {{"gfx904"},    {"gfx904"},  GK_GFX904,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
-    {{"gfx906"},    {"gfx906"},  GK_GFX906,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
-    {{"gfx908"},    {"gfx908"},  GK_GFX908,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
-    {{"gfx909"},    {"gfx909"},  GK_GFX909,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
-    {{"gfx90a"},    {"gfx90a"},  GK_GFX90A,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
-    {{"gfx90c"},    {"gfx90c"},  GK_GFX90C,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
-    {{"gfx942"},    {"gfx942"},  GK_GFX942,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
-    {{"gfx950"},    {"gfx950"},  GK_GFX950,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
-    {{"gfx1010"},   {"gfx1010"}, GK_GFX1010, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
-    {{"gfx1011"},   {"gfx1011"}, GK_GFX1011, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
-    {{"gfx1012"},   {"gfx1012"}, GK_GFX1012, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
-    {{"gfx1013"},   {"gfx1013"}, GK_GFX1013, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
-    {{"gfx1030"},   {"gfx1030"}, GK_GFX1030, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1031"},   {"gfx1031"}, GK_GFX1031, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1032"},   {"gfx1032"}, GK_GFX1032, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1033"},   {"gfx1033"}, GK_GFX1033, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1034"},   {"gfx1034"}, GK_GFX1034, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1035"},   {"gfx1035"}, GK_GFX1035, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1036"},   {"gfx1036"}, GK_GFX1036, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1100"},   {"gfx1100"}, GK_GFX1100, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1101"},   {"gfx1101"}, GK_GFX1101, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1102"},   {"gfx1102"}, GK_GFX1102, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1103"},   {"gfx1103"}, GK_GFX1103, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1150"},   {"gfx1150"}, GK_GFX1150, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1151"},   {"gfx1151"}, GK_GFX1151, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1152"},   {"gfx1152"}, GK_GFX1152, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1153"},   {"gfx1153"}, GK_GFX1153, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1170"},   {"gfx1170"}, GK_GFX1170, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1200"},   {"gfx1200"}, GK_GFX1200, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1201"},   {"gfx1201"}, GK_GFX1201, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx1250"},   {"gfx1250"}, GK_GFX1250, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK_ALWAYS},
-    {{"gfx1251"},   {"gfx1251"}, GK_GFX1251, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK_ALWAYS},
-    {{"gfx1310"},   {"gfx1310"}, GK_GFX1310, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-
-    {{"gfx9-generic"},      {"gfx9-generic"},    GK_GFX9_GENERIC,    FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
-    {{"gfx10-1-generic"},   {"gfx10-1-generic"}, GK_GFX10_1_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
-    {{"gfx10-3-generic"},   {"gfx10-3-generic"}, GK_GFX10_3_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx11-generic"},     {"gfx11-generic"},   GK_GFX11_GENERIC,   FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx12-generic"},     {"gfx12-generic"},   GK_GFX12_GENERIC,   FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-    {{"gfx9-4-generic"},    {"gfx9-4-generic"},  GK_GFX9_4_GENERIC,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
-    {{"gfx12-5-generic"},   {"gfx12-5-generic"}, GK_GFX12_5_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32},
-    // clang-format on
-};
-
-const GPUInfo *getArchEntry(AMDGPU::GPUKind AK, ArrayRef<GPUInfo> Table) {
-  GPUInfo Search = { {""}, {""}, AK, AMDGPU::FEATURE_NONE };
-
-  auto I =
-      llvm::lower_bound(Table, Search, [](const GPUInfo &A, const GPUInfo &B) {
-        return A.Kind < B.Kind;
-      });
-
-  if (I == Table.end() || I->Kind != Search.Kind)
-    return nullptr;
-  return I;
-}
-
-} // namespace
-
 StringRef llvm::AMDGPU::getArchFamilyNameAMDGCN(GPUKind AK) {
   switch (AK) {
   case AMDGPU::GK_GFX9_GENERIC:
@@ -225,56 +87,80 @@ StringRef llvm::AMDGPU::getArchFamilyNameAMDGCN(GPUKind AK) {
 }
 
 StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) {
-  if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
-    return Entry->CanonicalName;
-  return "";
+  switch (AK) {
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES)                           \
+  case ENUM:                                                                   \
+    return NAME;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+  default:
+    return "";
+  }
 }
 
 StringRef llvm::AMDGPU::getArchNameR600(GPUKind AK) {
-  if (const auto *Entry = getArchEntry(AK, R600GPUs))
-    return Entry->CanonicalName;
-  return "";
+  switch (AK) {
+#define R600_GPU(NAME, ENUM, FEATURES)                                         \
+  case ENUM:                                                                   \
+    return NAME;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+  default:
+    return "";
+  }
 }
 
 AMDGPU::GPUKind llvm::AMDGPU::parseArchAMDGCN(StringRef CPU) {
-  for (const auto &C : AMDGCNGPUs) {
-    if (CPU == C.Name)
-      return C.Kind;
-  }
-
-  return AMDGPU::GPUKind::GK_NONE;
+  return StringSwitch<AMDGPU::GPUKind>(CPU)
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES) .Case(NAME, ENUM)
+#define AMDGCN_GPU_ALIAS(NAME, ENUM) .Case(NAME, ENUM)
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+      .Default(AMDGPU::GPUKind::GK_NONE);
 }
 
 AMDGPU::GPUKind llvm::AMDGPU::parseArchR600(StringRef CPU) {
-  for (const auto &C : R600GPUs) {
-    if (CPU == C.Name)
-      return C.Kind;
-  }
-
-  return AMDGPU::GPUKind::GK_NONE;
+  return StringSwitch<AMDGPU::GPUKind>(CPU)
+#define R600_GPU(NAME, ENUM, FEATURES) .Case(NAME, ENUM)
+#define R600_GPU_ALIAS(NAME, ENUM) .Case(NAME, ENUM)
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+      .Default(AMDGPU::GPUKind::GK_NONE);
 }
 
 unsigned AMDGPU::getArchAttrAMDGCN(GPUKind AK) {
-  if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
-    return Entry->Features;
-  return FEATURE_NONE;
+  switch (AK) {
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES)                           \
+  case ENUM:                                                                   \
+    return FEATURES;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+  default:
+    return FEATURE_NONE;
+  }
 }
 
 unsigned AMDGPU::getArchAttrR600(GPUKind AK) {
-  if (const auto *Entry = getArchEntry(AK, R600GPUs))
-    return Entry->Features;
-  return FEATURE_NONE;
+  switch (AK) {
+#define R600_GPU(NAME, ENUM, FEATURES)                                         \
+  case ENUM:                                                                   \
+    return FEATURES;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+  default:
+    return FEATURE_NONE;
+  }
 }
 
 void AMDGPU::fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values) {
   // XXX: Should this only report unique canonical names?
-  for (const auto &C : AMDGCNGPUs)
-    Values.push_back(C.Name);
+  Values.append({
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES) NAME,
+#define AMDGCN_GPU_ALIAS(NAME, ENUM) NAME,
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+  });
 }
 
 void AMDGPU::fillValidArchListR600(SmallVectorImpl<StringRef> &Values) {
-  for (const auto &C : R600GPUs)
-    Values.push_back(C.Name);
+  Values.append({
+#define R600_GPU(NAME, ENUM, FEATURES) NAME,
+#define R600_GPU_ALIAS(NAME, ENUM) NAME,
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+  });
 }
 
 AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) {
@@ -287,81 +173,16 @@ AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) {
     return {0, 0, 0};
   }
 
-  // clang-format off
   switch (AK) {
-  case GK_GFX600:  return {6, 0, 0};
-  case GK_GFX601:  return {6, 0, 1};
-  case GK_GFX602:  return {6, 0, 2};
-  case GK_GFX700:  return {7, 0, 0};
-  case GK_GFX701:  return {7, 0, 1};
-  case GK_GFX702:  return {7, 0, 2};
-  case GK_GFX703:  return {7, 0, 3};
-  case GK_GFX704:  return {7, 0, 4};
-  case GK_GFX705:  return {7, 0, 5};
-  case GK_GFX801:  return {8, 0, 1};
-  case GK_GFX802:  return {8, 0, 2};
-  case GK_GFX803:  return {8, 0, 3};
-  case GK_GFX805:  return {8, 0, 5};
-  case GK_GFX810:  return {8, 1, 0};
-  case GK_GFX900:  return {9, 0, 0};
-  case GK_GFX902:  return {9, 0, 2};
-  case GK_GFX904:  return {9, 0, 4};
-  case GK_GFX906:  return {9, 0, 6};
-  case GK_GFX908:  return {9, 0, 8};
-  case GK_GFX909:  return {9, 0, 9};
-  case GK_GFX90A:  return {9, 0, 10};
-  case GK_GFX90C:  return {9, 0, 12};
-  case GK_GFX942:  return {9, 4, 2};
-  case GK_GFX950:  return {9, 5, 0};
-  case GK_GFX1010: return {10, 1, 0};
-  case GK_GFX1011: return {10, 1, 1};
-  case GK_GFX1012: return {10, 1, 2};
-  case GK_GFX1013: return {10, 1, 3};
-  case GK_GFX1030: return {10, 3, 0};
-  case GK_GFX1031: return {10, 3, 1};
-  case GK_GFX1032: return {10, 3, 2};
-  case GK_GFX1033: return {10, 3, 3};
-  case GK_GFX1034: return {10, 3, 4};
-  case GK_GFX1035: return {10, 3, 5};
-  case GK_GFX1036: return {10, 3, 6};
-  case GK_GFX1100: return {11, 0, 0};
-  case GK_GFX1101: return {11, 0, 1};
-  case GK_GFX1102: return {11, 0, 2};
-  case GK_GFX1103: return {11, 0, 3};
-  case GK_GFX1150: return {11, 5, 0};
-  case GK_GFX1151: return {11, 5, 1};
-  case GK_GFX1152: return {11, 5, 2};
-  case GK_GFX1153: return {11, 5, 3};
-  case GK_GFX1170: return {11, 7, 0};
-  case GK_GFX1200: return {12, 0, 0};
-  case GK_GFX1201: return {12, 0, 1};
-  case GK_GFX1250: return {12, 5, 0};
-  case GK_GFX1251: return {12, 5, 1};
-  case GK_GFX1310: return {13, 1, 0};
-
-  // Generic targets return the lowest common denominator
-  // within their family. That is, the ISA that is the most
-  // restricted in terms of features.
-  //
-  // gfx9-generic is tricky because there is no lowest
-  // common denominator, so we return gfx900 which has mad-mix
-  // but this family doesn't have it.
-  //
-  // This API should never be used to check for a particular
-  // feature anyway.
-  //
-  // TODO: Split up this API depending on its caller so
-  // generic target handling is more obvious and less risky.
-  case GK_GFX9_GENERIC:    return {9, 0, 0};
-  case GK_GFX9_4_GENERIC:  return {9, 4, 0};
-  case GK_GFX10_1_GENERIC: return {10, 1, 0};
-  case GK_GFX10_3_GENERIC: return {10, 3, 0};
-  case GK_GFX11_GENERIC:   return {11, 0, 3};
-  case GK_GFX12_GENERIC:   return {12, 0, 0};
-  case GK_GFX12_5_GENERIC: return {12, 5, 0};
-  default:         return {0, 0, 0};
+#define MAKE_ISAVERSION(A, B, C) {A, B, C}
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES)                           \
+  case ENUM:                                                                   \
+    return MAKE_ISAVERSION ISAVERSION;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+#undef MAKE_ISAVERSION
+  default:
+    return {0, 0, 0};
   }
-  // clang-format on
 }
 
 StringRef AMDGPU::getCanonicalArchName(const Triple &T, StringRef Arch) {



More information about the llvm-commits mailing list