[clang] c2fa412 - AMDGPU: Generate TargetParser table from TableGen (#212353)

via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 28 22:07:58 PDT 2026


Author: Matt Arsenault
Date: 2026-07-29T07:07:52+02:00
New Revision: c2fa4128681863d92b2fe1615beb73e2ed62876f

URL: https://github.com/llvm/llvm-project/commit/c2fa4128681863d92b2fe1615beb73e2ed62876f
DIFF: https://github.com/llvm/llvm-project/commit/c2fa4128681863d92b2fe1615beb73e2ed62876f.diff

LOG: AMDGPU: Generate TargetParser table from TableGen (#212353)

Migrate .def file to tablegen. The initial TargetParser
AMDGPU backend only handled R600. Extend to modern targets.
Stub out some tablegen definitions which will be used in future
changes.

Co-authored-by: Claude (Claude-Opus-4.8)

Added: 
    

Modified: 
    clang/lib/Basic/Targets/AMDGPU.cpp
    clang/lib/Sema/CMakeLists.txt
    llvm/include/llvm/TargetParser/AMDGPUTargetParser.h
    llvm/include/llvm/TargetParser/CMakeLists.txt
    llvm/include/module.install.modulemap
    llvm/include/module.modulemap
    llvm/lib/Target/AMDGPU/AMDGPUTargetParser.td
    llvm/lib/Target/AMDGPU/GCNProcessors.td
    llvm/lib/TargetParser/AMDGPUTargetParser.cpp
    llvm/test/TableGen/AMDGPUTargetDefErrors.td
    llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp

Removed: 
    llvm/include/llvm/TargetParser/AMDGPUTargetParser.def


################################################################################
diff  --git a/clang/lib/Basic/Targets/AMDGPU.cpp b/clang/lib/Basic/Targets/AMDGPU.cpp
index 487c1949e7c83..370ef52a9bdb0 100644
--- a/clang/lib/Basic/Targets/AMDGPU.cpp
+++ b/clang/lib/Basic/Targets/AMDGPU.cpp
@@ -293,8 +293,8 @@ void AMDGPUTargetInfo::getTargetDefines(const LangOptions &Opts,
 
   // Sanitize the name of generic targets.
   // e.g. gfx10-1-generic -> gfx10_1_generic
-  if (GPUKind >= llvm::AMDGPU::GK_AMDGCN_GENERIC_FIRST &&
-      GPUKind <= llvm::AMDGPU::GK_AMDGCN_GENERIC_LAST) {
+  if (GPUKind >= llvm::AMDGPU::GK_AMDGPU_GENERIC_FIRST &&
+      GPUKind <= llvm::AMDGPU::GK_AMDGPU_GENERIC_LAST) {
     llvm::replace(CanonName, '-', '_');
   }
 

diff  --git a/clang/lib/Sema/CMakeLists.txt b/clang/lib/Sema/CMakeLists.txt
index ef729e22c1dc8..88f0c993888d9 100644
--- a/clang/lib/Sema/CMakeLists.txt
+++ b/clang/lib/Sema/CMakeLists.txt
@@ -107,6 +107,9 @@ add_clang_library(clangSema
   acc_gen
   omp_gen
   ClangDriverOptions
+  # SemaAMDGPU.cpp includes AMDGPUTargetParser.h, which includes generated
+  # TargetParser headers.
+  target_parser_gen
 
   LINK_LIBS
   clangAPINotes

diff  --git a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def
deleted file mode 100644
index 4227ae8baa0df..0000000000000
--- a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def
+++ /dev/null
@@ -1,155 +0,0 @@
-//===- 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, SUBARCH, 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, Triple::AMDGPUSubArch600,  ( 6, 0,  0), FEATURE_FAST_FMA_F32)
-AMDGCN_GPU_ALIAS("tahiti",    GK_GFX600)
-AMDGCN_GPU      ("gfx601",    GK_GFX601, Triple::AMDGPUSubArch601,  ( 6, 0,  1), FEATURE_NONE)
-AMDGCN_GPU_ALIAS("pitcairn",  GK_GFX601)
-AMDGCN_GPU_ALIAS("verde",     GK_GFX601)
-AMDGCN_GPU      ("gfx602",    GK_GFX602, Triple::AMDGPUSubArch602,  ( 6, 0,  2), FEATURE_NONE)
-AMDGCN_GPU_ALIAS("hainan",    GK_GFX602)
-AMDGCN_GPU_ALIAS("oland",     GK_GFX602)
-AMDGCN_GPU      ("gfx700",    GK_GFX700, Triple::AMDGPUSubArch700,  ( 7, 0,  0), FEATURE_NONE)
-AMDGCN_GPU_ALIAS("kaveri",    GK_GFX700)
-AMDGCN_GPU      ("gfx701",    GK_GFX701, Triple::AMDGPUSubArch701,  ( 7, 0,  1), FEATURE_FAST_FMA_F32)
-AMDGCN_GPU_ALIAS("hawaii",    GK_GFX701)
-AMDGCN_GPU      ("gfx702",    GK_GFX702, Triple::AMDGPUSubArch702,  ( 7, 0,  2), FEATURE_FAST_FMA_F32)
-AMDGCN_GPU      ("gfx703",    GK_GFX703, Triple::AMDGPUSubArch703,  ( 7, 0,  3), FEATURE_NONE)
-AMDGCN_GPU_ALIAS("kabini",    GK_GFX703)
-AMDGCN_GPU_ALIAS("mullins",   GK_GFX703)
-AMDGCN_GPU      ("gfx704",    GK_GFX704, Triple::AMDGPUSubArch704,  ( 7, 0,  4), FEATURE_NONE)
-AMDGCN_GPU_ALIAS("bonaire",   GK_GFX704)
-AMDGCN_GPU      ("gfx705",    GK_GFX705, Triple::AMDGPUSubArch705,  ( 7, 0,  5), FEATURE_NONE)
-AMDGCN_GPU      ("gfx801",    GK_GFX801, Triple::AMDGPUSubArch801,  ( 8, 0,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES)
-AMDGCN_GPU_ALIAS("carrizo",   GK_GFX801)
-AMDGCN_GPU      ("gfx802",    GK_GFX802, Triple::AMDGPUSubArch802,  ( 8, 0,  2), FEATURE_FAST_DENORMAL_F32|FEATURE_SGPR_INIT_BUG)
-AMDGCN_GPU_ALIAS("iceland",   GK_GFX802)
-AMDGCN_GPU_ALIAS("tonga",     GK_GFX802)
-AMDGCN_GPU      ("gfx803",    GK_GFX803, Triple::AMDGPUSubArch803,  ( 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, Triple::AMDGPUSubArch805, ( 8, 0,  5), FEATURE_FAST_DENORMAL_F32|FEATURE_SGPR_INIT_BUG)
-AMDGCN_GPU_ALIAS("tongapro",  GK_GFX805)
-AMDGCN_GPU      ("gfx810",    GK_GFX810, Triple::AMDGPUSubArch810,  ( 8, 1,  0), FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES)
-AMDGCN_GPU_ALIAS("stoney",    GK_GFX810)
-AMDGCN_GPU      ("gfx900",    GK_GFX900, Triple::AMDGPUSubArch900,  ( 9, 0,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES)
-AMDGCN_GPU      ("gfx902",    GK_GFX902, Triple::AMDGPUSubArch902,  ( 9, 0,  2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES)
-AMDGCN_GPU      ("gfx904",    GK_GFX904, Triple::AMDGPUSubArch904,  ( 9, 0,  4), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES)
-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      ("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      ("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)
-AMDGCN_GPU      ("gfx1013",   GK_GFX1013, Triple::AMDGPUSubArch1013, (10, 1,  3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1030",   GK_GFX1030, Triple::AMDGPUSubArch1030, (10, 3,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1031",   GK_GFX1031, Triple::AMDGPUSubArch1031, (10, 3,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1032",   GK_GFX1032, Triple::AMDGPUSubArch1032, (10, 3,  2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1033",   GK_GFX1033, Triple::AMDGPUSubArch1033, (10, 3,  3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1034",   GK_GFX1034, Triple::AMDGPUSubArch1034, (10, 3,  4), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1035",   GK_GFX1035, Triple::AMDGPUSubArch1035, (10, 3,  5), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1036",   GK_GFX1036, Triple::AMDGPUSubArch1036, (10, 3,  6), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1100",   GK_GFX1100, Triple::AMDGPUSubArch1100, (11, 0,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1101",   GK_GFX1101, Triple::AMDGPUSubArch1101, (11, 0,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1102",   GK_GFX1102, Triple::AMDGPUSubArch1102, (11, 0,  2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1103",   GK_GFX1103, Triple::AMDGPUSubArch1103, (11, 0,  3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1150",   GK_GFX1150, Triple::AMDGPUSubArch1150, (11, 5,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1151",   GK_GFX1151, Triple::AMDGPUSubArch1151, (11, 5,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1152",   GK_GFX1152, Triple::AMDGPUSubArch1152, (11, 5,  2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1153",   GK_GFX1153, Triple::AMDGPUSubArch1153, (11, 5,  3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1154",   GK_GFX1154, Triple::AMDGPUSubArch1154, (11, 5,  4), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1170",   GK_GFX1170, Triple::AMDGPUSubArch1170, (11, 7,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1171",   GK_GFX1171, Triple::AMDGPUSubArch1171, (11, 7,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-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)
-
-// 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, 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      ("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|FEATURE_SRAMECC)
-AMDGCN_GPU      ("gfx13-generic",   GK_GFX13_GENERIC, Triple::AMDGPUSubArch13,   (13, 1, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-
-#undef AMDGCN_GPU
-#undef AMDGCN_GPU_ALIAS

diff  --git a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h
index 28d87be2eb648..c13b85f3bfc2e 100644
--- a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h
+++ b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h
@@ -36,11 +36,12 @@ enum GPUKind : uint32_t {
   GK_NONE = 0,
 
 #define R600_GPU(NAME, ENUM, FEATURES) ENUM,
-#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES) ENUM,
-#include "AMDGPUTargetParser.def"
+#include "llvm/TargetParser/R600TargetParserDef.inc"
+#define AMDGPU_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES) ENUM,
+#include "llvm/TargetParser/AMDGPUTargetParserDef.inc"
 
-  GK_AMDGCN_GENERIC_FIRST = GK_GFX9_GENERIC,
-  GK_AMDGCN_GENERIC_LAST = GK_GFX13_GENERIC,
+  GK_AMDGPU_GENERIC_FIRST = GK_GFX9_GENERIC,
+  GK_AMDGPU_GENERIC_LAST = GK_GFX13_GENERIC,
 };
 
 /// Instruction set architecture version.

diff  --git a/llvm/include/llvm/TargetParser/CMakeLists.txt b/llvm/include/llvm/TargetParser/CMakeLists.txt
index 62e9da1447f68..af26db48f2132 100644
--- a/llvm/include/llvm/TargetParser/CMakeLists.txt
+++ b/llvm/include/llvm/TargetParser/CMakeLists.txt
@@ -13,5 +13,8 @@ tablegen(LLVM PPCGenTargetFeatures.inc -gen-target-features EXTRA_INCLUDES ${PRO
 set(LLVM_TARGET_DEFINITIONS ${PROJECT_SOURCE_DIR}/lib/Target/AMDGPU/R600.td)
 tablegen(LLVM R600TargetParserDef.inc -gen-amdgpu-target-def EXTRA_INCLUDES ${PROJECT_SOURCE_DIR}/lib/Target/AMDGPU)
 
+set(LLVM_TARGET_DEFINITIONS ${PROJECT_SOURCE_DIR}/lib/Target/AMDGPU/AMDGPU.td)
+tablegen(LLVM AMDGPUTargetParserDef.inc -gen-amdgpu-target-def EXTRA_INCLUDES ${PROJECT_SOURCE_DIR}/lib/Target/AMDGPU)
+
 # This covers all of the tablegen calls above.
 add_public_tablegen_target(target_parser_gen)

diff  --git a/llvm/include/module.install.modulemap b/llvm/include/module.install.modulemap
index b917cddc78034..47dcb2adf977c 100644
--- a/llvm/include/module.install.modulemap
+++ b/llvm/include/module.install.modulemap
@@ -34,4 +34,6 @@ module LLVM_Extern_TargetParser_Gen {
   textual header "llvm/TargetParser/ARMTargetParserDef.inc"
   textual header "llvm/TargetParser/AArch64TargetParserDef.inc"
   textual header "llvm/TargetParser/RISCVTargetParserDef.inc"
+  textual header "llvm/TargetParser/R600TargetParserDef.inc"
+  textual header "llvm/TargetParser/AMDGPUTargetParserDef.inc"
 }

diff  --git a/llvm/include/module.modulemap b/llvm/include/module.modulemap
index 53e34285eddb0..4d71818df8d2a 100644
--- a/llvm/include/module.modulemap
+++ b/llvm/include/module.modulemap
@@ -377,6 +377,11 @@ module TargetParserGen {
     extern module LLVM_Extern_TargetParser_Gen "module.extern.modulemap"
     export *
   }
+  module AMDGPUTargetParserDef {
+    header "llvm/TargetParser/AMDGPUTargetParser.h"
+    extern module LLVM_Extern_TargetParser_Gen "module.extern.modulemap"
+    export *
+  }
 }
 
 // A module covering ADT/ and Support/. These are intertwined and
@@ -421,7 +426,6 @@ module LLVM_Utils {
     module * { export * }
 
     // These are intended for textual inclusion.
-    textual header "llvm/TargetParser/AMDGPUTargetParser.def"
     textual header "llvm/TargetParser/ARMTargetParser.def"
     textual header "llvm/TargetParser/CSKYTargetParser.def"
     textual header "llvm/TargetParser/X86TargetParser.def"

diff  --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetParser.td b/llvm/lib/Target/AMDGPU/AMDGPUTargetParser.td
index 28385babdeba7..d03493d924b13 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUTargetParser.td
+++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetParser.td
@@ -20,12 +20,38 @@ class AMDGPUArchFeature<string spelling> {
 // R600-only.
 def R600_FEATURE_FMA : AMDGPUArchFeature<"R600_FEATURE_FMA">;
 
-// Marks a Processor/ProcessorModel record as a canonical TargetParser GPU.
-class AMDGPUGPUInfo {
+// AMDGCN.
+def FEATURE_FAST_FMA_F32       : AMDGPUArchFeature<"FEATURE_FAST_FMA_F32">;
+def FEATURE_FAST_DENORMAL_F32  : AMDGPUArchFeature<"FEATURE_FAST_DENORMAL_F32">;
+def FEATURE_WAVE32             : AMDGPUArchFeature<"FEATURE_WAVE32">;
+def FEATURE_XNACK              : AMDGPUArchFeature<"FEATURE_XNACK">;
+def FEATURE_SRAMECC            : AMDGPUArchFeature<"FEATURE_SRAMECC">;
+def FEATURE_WGP                : AMDGPUArchFeature<"FEATURE_WGP">;
+def FEATURE_XNACK_ON_OFF_MODES : AMDGPUArchFeature<"FEATURE_XNACK_ON_OFF_MODES">;
+def FEATURE_SGPR_INIT_BUG      : AMDGPUArchFeature<"FEATURE_SGPR_INIT_BUG">;
+
+// Marks a Processor/ProcessorModel record as a canonical GPU.
+//
+// \p isa is the ISA version [major, minor, stepping]. Empty for R600 (no AMDGCN
+// ISA version); required for AMDGCN GPUs. Not derivable from the name.
+class AMDGPUGPUInfo<list<int> isa = []> {
   list<AMDGPUArchFeature> ArchFeatures = [];
+
+  list<int> IsaVersion = isa;
+
+  // List of targets which are compatible with this target. This
+  // should be used for a "gfxN-generic" targets only, and empty for
+  // individual GPUs.
+  list<Processor> CoveredGPUs = [];
 }
 
 // An R600 processor that is also a canonical TargetParser GPU.
 class R600ProcessorModel<string n, ProcessorItineraries pi,
                          list<SubtargetFeature> f>
     : Processor<n, pi, f>, AMDGPUGPUInfo;
+
+// A gfx6+ processor that is also a canonical TargetParser GPU. \p isa
+// is the ISA version [major, minor, stepping].
+class AMDGPUProcessorModel<string n, SchedMachineModel m,
+                           list<SubtargetFeature> f, list<int> isa>
+    : ProcessorModel<n, m, f>, AMDGPUGPUInfo<isa>;

diff  --git a/llvm/lib/Target/AMDGPU/GCNProcessors.td b/llvm/lib/Target/AMDGPU/GCNProcessors.td
index 3003d23c29b40..7008931c424a0 100644
--- a/llvm/lib/Target/AMDGPU/GCNProcessors.td
+++ b/llvm/lib/Target/AMDGPU/GCNProcessors.td
@@ -6,11 +6,20 @@
 //
 //===----------------------------------------------------------------------===//
 
+// Shared ArchFeature lists. Grouped by wavefront mode and the XNACK/SRAMECC/WGP
+// features that recur across many GPUs in a generation.
+defvar ArchFeaturesW64Xnack = [FEATURE_FAST_FMA_F32, FEATURE_FAST_DENORMAL_F32,
+                              FEATURE_XNACK, FEATURE_XNACK_ON_OFF_MODES];
+defvar ArchFeaturesW64XnackSramEcc = ArchFeaturesW64Xnack # [FEATURE_SRAMECC];
+defvar ArchFeaturesW32XnackWgp = [FEATURE_FAST_FMA_F32, FEATURE_FAST_DENORMAL_F32,
+                                 FEATURE_WAVE32, FEATURE_XNACK,
+                                 FEATURE_XNACK_ON_OFF_MODES, FEATURE_WGP];
+defvar ArchFeaturesW32Wgp = [FEATURE_FAST_FMA_F32, FEATURE_FAST_DENORMAL_F32,
+                            FEATURE_WAVE32, FEATURE_WGP];
+
 // The code produced for "generic" is only useful for tests and cannot
-// reasonably be expected to execute on any particular target.
-def : ProcessorModel<"generic", NoSchedModel,
-  []
->;
+// be expected to execute on any target.
+def : ProcessorModel<"generic", NoSchedModel, []>;
 
 def : ProcessorModel<"generic-hsa", NoSchedModel,
   [FeatureFlatAddressSpace]
@@ -20,21 +29,22 @@ def : ProcessorModel<"generic-hsa", NoSchedModel,
 // GCN GFX6 (Southern Islands (SI)).
 //===------------------------------------------------------------===//
 
-def : ProcessorModel<"gfx600", SIFullSpeedModel,
-  FeatureISAVersion6_0_0.Features
->;
+def GFX600 : AMDGPUProcessorModel<"gfx600", SIFullSpeedModel,
+  FeatureISAVersion6_0_0.Features, [6, 0, 0]> {
+  let ArchFeatures = [FEATURE_FAST_FMA_F32];
+}
 
 def : ProcessorAlias<"tahiti", "gfx600">;
 
-def : ProcessorModel<"gfx601", SIQuarterSpeedModel,
-  FeatureISAVersion6_0_1.Features
+def GFX601 : AMDGPUProcessorModel<"gfx601", SIQuarterSpeedModel,
+  FeatureISAVersion6_0_1.Features, [6, 0, 1]
 >;
 
 def : ProcessorAlias<"pitcairn", "gfx601">;
 def : ProcessorAlias<"verde", "gfx601">;
 
-def : ProcessorModel<"gfx602", SIQuarterSpeedModel,
-  FeatureISAVersion6_0_2.Features
+def GFX602 : AMDGPUProcessorModel<"gfx602", SIQuarterSpeedModel,
+  FeatureISAVersion6_0_2.Features, [6, 0, 2]
 >;
 
 def : ProcessorAlias<"hainan", "gfx602">;
@@ -44,73 +54,80 @@ def : ProcessorAlias<"oland", "gfx602">;
 // GCN GFX7 (Sea Islands (CI)).
 //===------------------------------------------------------------===//
 
-def : ProcessorModel<"gfx700", SIQuarterSpeedModel,
-  FeatureISAVersion7_0_0.Features
+def GFX700 : AMDGPUProcessorModel<"gfx700", SIQuarterSpeedModel,
+  FeatureISAVersion7_0_0.Features, [7, 0, 0]
 >;
 
 def : ProcessorAlias<"kaveri", "gfx700">;
 
-def : ProcessorModel<"gfx701", SIFullSpeedModel,
-  FeatureISAVersion7_0_1.Features
->;
+def GFX701 : AMDGPUProcessorModel<"gfx701", SIFullSpeedModel,
+  FeatureISAVersion7_0_1.Features, [7, 0, 1]> {
+  let ArchFeatures = [FEATURE_FAST_FMA_F32];
+}
 
 def : ProcessorAlias<"hawaii", "gfx701">;
 
-def : ProcessorModel<"gfx702", SIQuarterSpeedModel,
-  FeatureISAVersion7_0_2.Features
->;
+def GFX702 : AMDGPUProcessorModel<"gfx702", SIQuarterSpeedModel,
+  FeatureISAVersion7_0_2.Features, [7, 0, 2]> {
+  let ArchFeatures = [FEATURE_FAST_FMA_F32];
+}
 
-def : ProcessorModel<"gfx703", SIQuarterSpeedModel,
-  FeatureISAVersion7_0_3.Features
+def GFX703 : AMDGPUProcessorModel<"gfx703", SIQuarterSpeedModel,
+  FeatureISAVersion7_0_3.Features, [7, 0, 3]
 >;
 
 def : ProcessorAlias<"kabini", "gfx703">;
 def : ProcessorAlias<"mullins", "gfx703">;
 
-def : ProcessorModel<"gfx704", SIQuarterSpeedModel,
-  FeatureISAVersion7_0_4.Features
+def GFX704 : AMDGPUProcessorModel<"gfx704", SIQuarterSpeedModel,
+  FeatureISAVersion7_0_4.Features, [7, 0, 4]
 >;
 
 def : ProcessorAlias<"bonaire", "gfx704">;
 
-def : ProcessorModel<"gfx705", SIQuarterSpeedModel,
-  FeatureISAVersion7_0_5.Features
+def GFX705 : AMDGPUProcessorModel<"gfx705", SIQuarterSpeedModel,
+  FeatureISAVersion7_0_5.Features, [7, 0, 5]
 >;
 
 //===------------------------------------------------------------===//
 // GCN GFX8 (Volcanic Islands (VI)).
 //===------------------------------------------------------------===//
 
-def : ProcessorModel<"gfx801", SIQuarterSpeedModel,
-  FeatureISAVersion8_0_1.Features
->;
+def GFX801 : AMDGPUProcessorModel<"gfx801", SIQuarterSpeedModel,
+  FeatureISAVersion8_0_1.Features, [8, 0, 1]> {
+  let ArchFeatures = ArchFeaturesW64Xnack;
+}
 
 def : ProcessorAlias<"carrizo", "gfx801">;
 
-def : ProcessorModel<"gfx802", SIQuarterSpeedModel,
-  FeatureISAVersion8_0_2.Features
->;
+def GFX802 : AMDGPUProcessorModel<"gfx802", SIQuarterSpeedModel,
+  FeatureISAVersion8_0_2.Features, [8, 0, 2]> {
+  let ArchFeatures = [FEATURE_FAST_DENORMAL_F32, FEATURE_SGPR_INIT_BUG];
+}
 
 def : ProcessorAlias<"iceland", "gfx802">;
 def : ProcessorAlias<"tonga", "gfx802">;
 
-def : ProcessorModel<"gfx803", SIQuarterSpeedModel,
-  FeatureISAVersion8_0_3.Features
->;
+def GFX803 : AMDGPUProcessorModel<"gfx803", SIQuarterSpeedModel,
+  FeatureISAVersion8_0_3.Features, [8, 0, 3]> {
+  let ArchFeatures = [FEATURE_FAST_DENORMAL_F32];
+}
 
 def : ProcessorAlias<"fiji", "gfx803">;
 def : ProcessorAlias<"polaris10", "gfx803">;
 def : ProcessorAlias<"polaris11", "gfx803">;
 
-def : ProcessorModel<"gfx805", SIQuarterSpeedModel,
-  FeatureISAVersion8_0_5.Features
->;
+def GFX805 : AMDGPUProcessorModel<"gfx805", SIQuarterSpeedModel,
+  FeatureISAVersion8_0_5.Features, [8, 0, 5]> {
+  let ArchFeatures = [FEATURE_FAST_DENORMAL_F32, FEATURE_SGPR_INIT_BUG];
+}
 
 def : ProcessorAlias<"tongapro", "gfx805">;
 
-def : ProcessorModel<"gfx810", SIQuarterSpeedModel,
-  FeatureISAVersion8_1_0.Features
->;
+def GFX810 : AMDGPUProcessorModel<"gfx810", SIQuarterSpeedModel,
+  FeatureISAVersion8_1_0.Features, [8, 1, 0]> {
+  let ArchFeatures = [FEATURE_FAST_DENORMAL_F32, FEATURE_XNACK, FEATURE_XNACK_ON_OFF_MODES];
+}
 
 def : ProcessorAlias<"stoney", "gfx810">;
 
@@ -118,216 +135,263 @@ def : ProcessorAlias<"stoney", "gfx810">;
 // GCN GFX9.
 //===------------------------------------------------------------===//
 
-def : ProcessorModel<"gfx900", SIQuarterSpeedModel,
-  FeatureISAVersion9_0_0.Features
->;
-
-def : ProcessorModel<"gfx902", SIQuarterSpeedModel,
-  FeatureISAVersion9_0_2.Features
->;
-
-def : ProcessorModel<"gfx904", SIQuarterSpeedModel,
-  FeatureISAVersion9_0_4.Features
->;
-
-def : ProcessorModel<"gfx906", SIQuarterSpeedModel,
-  FeatureISAVersion9_0_6.Features
->;
-
-def : ProcessorModel<"gfx908", SIQuarterSpeedModel,
-  FeatureISAVersion9_0_8.Features
->;
-
-def : ProcessorModel<"gfx909", SIQuarterSpeedModel,
-  FeatureISAVersion9_0_9.Features
->;
-
-def : ProcessorModel<"gfx90a", SIDPFullSpeedModel,
-  FeatureISAVersion9_0_A.Features
->;
-
-def : ProcessorModel<"gfx90c", SIQuarterSpeedModel,
-  FeatureISAVersion9_0_C.Features
->;
-
-def : ProcessorModel<"gfx942", SIDPGFX942FullSpeedModel,
-  FeatureISAVersion9_4_2.Features
->;
-
-def : ProcessorModel<"gfx950", SIDPGFX950FullSpeedModel,
-  FeatureISAVersion9_5_0.Features
->;
-
-// [gfx900, gfx902, gfx904, gfx906, gfx909, gfx90c]
-def : ProcessorModel<"gfx9-generic", SIQuarterSpeedModel,
-  FeatureISAVersion9_Generic.Features
->;
-
-// [gfx942]
-def : ProcessorModel<"gfx9-4-generic", SIDPGFX942FullSpeedModel,
-  FeatureISAVersion9_4_Generic.Features
->;
+def GFX900 : AMDGPUProcessorModel<"gfx900", SIQuarterSpeedModel,
+  FeatureISAVersion9_0_0.Features, [9, 0, 0]> {
+  let ArchFeatures = ArchFeaturesW64Xnack;
+}
+
+def GFX902 : AMDGPUProcessorModel<"gfx902", SIQuarterSpeedModel,
+  FeatureISAVersion9_0_2.Features, [9, 0, 2]> {
+  let ArchFeatures = ArchFeaturesW64Xnack;
+}
+
+def GFX904 : AMDGPUProcessorModel<"gfx904", SIQuarterSpeedModel,
+  FeatureISAVersion9_0_4.Features, [9, 0, 4]> {
+  let ArchFeatures = ArchFeaturesW64Xnack;
+}
+
+def GFX906 : AMDGPUProcessorModel<"gfx906", SIQuarterSpeedModel,
+  FeatureISAVersion9_0_6.Features, [9, 0, 6]> {
+  let ArchFeatures = ArchFeaturesW64XnackSramEcc;
+}
+
+def GFX908 : AMDGPUProcessorModel<"gfx908", SIQuarterSpeedModel,
+  FeatureISAVersion9_0_8.Features, [9, 0, 8]> {
+  let ArchFeatures = ArchFeaturesW64XnackSramEcc;
+}
+
+def GFX909 : AMDGPUProcessorModel<"gfx909", SIQuarterSpeedModel,
+  FeatureISAVersion9_0_9.Features, [9, 0, 9]> {
+  let ArchFeatures = ArchFeaturesW64Xnack;
+}
+
+def GFX90A : AMDGPUProcessorModel<"gfx90a", SIDPFullSpeedModel,
+  FeatureISAVersion9_0_A.Features, [9, 0, 0xa]> {
+  let ArchFeatures = ArchFeaturesW64XnackSramEcc;
+}
+
+def GFX90C : AMDGPUProcessorModel<"gfx90c", SIQuarterSpeedModel,
+  FeatureISAVersion9_0_C.Features, [9, 0, 0xc]> {
+  let ArchFeatures = ArchFeaturesW64Xnack;
+}
+
+def GFX942 : AMDGPUProcessorModel<"gfx942", SIDPGFX942FullSpeedModel,
+  FeatureISAVersion9_4_2.Features, [9, 4, 2]> {
+  let ArchFeatures = ArchFeaturesW64XnackSramEcc;
+}
+
+def GFX950 : AMDGPUProcessorModel<"gfx950", SIDPGFX950FullSpeedModel,
+  FeatureISAVersion9_5_0.Features, [9, 5, 0]> {
+  let ArchFeatures = ArchFeaturesW64XnackSramEcc;
+}
+
+def GFX9_GENERIC : AMDGPUProcessorModel<"gfx9-generic", SIQuarterSpeedModel,
+  FeatureISAVersion9_Generic.Features, [9, 0, 0]> {
+  let ArchFeatures = ArchFeaturesW64Xnack;
+  let CoveredGPUs = [GFX900, GFX902, GFX904, GFX906, GFX909, GFX90C];
+}
+
+def GFX9_4_GENERIC : AMDGPUProcessorModel<"gfx9-4-generic", SIDPGFX942FullSpeedModel,
+  FeatureISAVersion9_4_Generic.Features, [9, 4, 0]> {
+  let ArchFeatures = ArchFeaturesW64XnackSramEcc;
+  let CoveredGPUs = [GFX942, GFX950];
+}
 
 //===----------------------------------------------------------------------===//
 // GCN GFX10.
 //===----------------------------------------------------------------------===//
 
-def : ProcessorModel<"gfx1010", GFX10SpeedModel,
-  FeatureISAVersion10_1_0.Features
->;
-
-def : ProcessorModel<"gfx1011", GFX10SpeedModel,
-  FeatureISAVersion10_1_1.Features
->;
-
-def : ProcessorModel<"gfx1012", GFX10SpeedModel,
-  FeatureISAVersion10_1_2.Features
->;
-
-def : ProcessorModel<"gfx1013", GFX10SpeedModel,
-  FeatureISAVersion10_1_3.Features
->;
-
-def : ProcessorModel<"gfx1030", GFX10SpeedModel,
-  FeatureISAVersion10_3_0.Features
->;
-
-def : ProcessorModel<"gfx1031", GFX10SpeedModel,
-  FeatureISAVersion10_3_0.Features
->;
-
-def : ProcessorModel<"gfx1032", GFX10SpeedModel,
-  FeatureISAVersion10_3_0.Features
->;
-
-def : ProcessorModel<"gfx1033", GFX10SpeedModel,
-  FeatureISAVersion10_3_0.Features
->;
-
-def : ProcessorModel<"gfx1034", GFX10SpeedModel,
-  FeatureISAVersion10_3_0.Features
->;
-
-def : ProcessorModel<"gfx1035", GFX10SpeedModel,
-  FeatureISAVersion10_3_0.Features
->;
-
-def : ProcessorModel<"gfx1036", GFX10SpeedModel,
-  FeatureISAVersion10_3_0.Features
->;
-
-// [gfx1010, gfx1011, gfx1012, gfx1013]
-def : ProcessorModel<"gfx10-1-generic", GFX10SpeedModel,
-  FeatureISAVersion10_1_Generic.Features
->;
-
-// [gfx1030, gfx1031, gfx1032, gfx1033, gfx1034, gfx1035, gfx1036]
-def : ProcessorModel<"gfx10-3-generic", GFX10SpeedModel,
-  FeatureISAVersion10_3_Generic.Features
->;
+def GFX1010 : AMDGPUProcessorModel<"gfx1010", GFX10SpeedModel,
+  FeatureISAVersion10_1_0.Features, [10, 1, 0]> {
+  let ArchFeatures = ArchFeaturesW32XnackWgp;
+}
+
+def GFX1011 : AMDGPUProcessorModel<"gfx1011", GFX10SpeedModel,
+  FeatureISAVersion10_1_1.Features, [10, 1, 1]> {
+  let ArchFeatures = ArchFeaturesW32XnackWgp;
+}
+
+def GFX1012 : AMDGPUProcessorModel<"gfx1012", GFX10SpeedModel,
+  FeatureISAVersion10_1_2.Features, [10, 1, 2]> {
+  let ArchFeatures = ArchFeaturesW32XnackWgp;
+}
+
+def GFX1013 : AMDGPUProcessorModel<"gfx1013", GFX10SpeedModel,
+  FeatureISAVersion10_1_3.Features, [10, 1, 3]> {
+  let ArchFeatures = ArchFeaturesW32XnackWgp;
+}
+
+def GFX1030 : AMDGPUProcessorModel<"gfx1030", GFX10SpeedModel,
+  FeatureISAVersion10_3_0.Features, [10, 3, 0]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1031 : AMDGPUProcessorModel<"gfx1031", GFX10SpeedModel,
+  FeatureISAVersion10_3_0.Features, [10, 3, 1]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1032 : AMDGPUProcessorModel<"gfx1032", GFX10SpeedModel,
+  FeatureISAVersion10_3_0.Features, [10, 3, 2]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1033 : AMDGPUProcessorModel<"gfx1033", GFX10SpeedModel,
+  FeatureISAVersion10_3_0.Features, [10, 3, 3]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1034 : AMDGPUProcessorModel<"gfx1034", GFX10SpeedModel,
+  FeatureISAVersion10_3_0.Features, [10, 3, 4]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1035 : AMDGPUProcessorModel<"gfx1035", GFX10SpeedModel,
+  FeatureISAVersion10_3_0.Features, [10, 3, 5]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1036 : AMDGPUProcessorModel<"gfx1036", GFX10SpeedModel,
+  FeatureISAVersion10_3_0.Features, [10, 3, 6]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX10_1_GENERIC : AMDGPUProcessorModel<"gfx10-1-generic", GFX10SpeedModel,
+  FeatureISAVersion10_1_Generic.Features, [10, 1, 0]> {
+  let ArchFeatures = ArchFeaturesW32XnackWgp;
+  let CoveredGPUs = [GFX1010, GFX1011, GFX1012, GFX1013];
+}
+
+def GFX10_3_GENERIC : AMDGPUProcessorModel<"gfx10-3-generic", GFX10SpeedModel,
+  FeatureISAVersion10_3_Generic.Features, [10, 3, 0]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+  let CoveredGPUs = [GFX1030, GFX1031, GFX1032, GFX1033, GFX1034, GFX1035, GFX1036];
+}
 
 //===----------------------------------------------------------------------===//
 // GCN GFX11.
 //===----------------------------------------------------------------------===//
 
-def : ProcessorModel<"gfx1100", GFX11SpeedModel,
-  FeatureISAVersion11_0_0.Features
->;
-
-def : ProcessorModel<"gfx1101", GFX11SpeedModel,
-  FeatureISAVersion11_0_1.Features
->;
-
-def : ProcessorModel<"gfx1102", GFX11SpeedModel,
-  FeatureISAVersion11_0_2.Features
->;
-
-def : ProcessorModel<"gfx1103", GFX11SpeedModel,
-  FeatureISAVersion11_0_3.Features
->;
-
-def : ProcessorModel<"gfx1150", GFX11SpeedModel,
-  FeatureISAVersion11_5_0.Features
->;
-
-def : ProcessorModel<"gfx1151", GFX11SpeedModel,
-  FeatureISAVersion11_5_1.Features
->;
-
-def : ProcessorModel<"gfx1152", GFX11SpeedModel,
-  FeatureISAVersion11_5_2.Features
->;
-
-def : ProcessorModel<"gfx1153", GFX11SpeedModel,
-  FeatureISAVersion11_5_Common.Features
->;
-
-def : ProcessorModel<"gfx1154", GFX11SpeedModel,
-  FeatureISAVersion11_5_Common.Features
->;
-
-def : ProcessorModel<"gfx1170", GFX11SpeedModel,
-  FeatureISAVersion11_7_Common.Features
->;
-
-def : ProcessorModel<"gfx1171", GFX11SpeedModel,
-  FeatureISAVersion11_7_Common.Features
->;
-
-def : ProcessorModel<"gfx1172", GFX11SpeedModel,
-  FeatureISAVersion11_7_Common.Features
->;
-
-// [gfx1100, gfx1101, gfx1102, gfx1103,
-//  gfx1150, gfx1151, gfx1152, gfx1153, gfx1154]
-def : ProcessorModel<"gfx11-generic", GFX11SpeedModel,
-  FeatureISAVersion11_Generic.Features
->;
-
-// [gfx1170, gfx1171, gfx1172]
-def : ProcessorModel<"gfx11-7-generic", GFX11SpeedModel,
-  FeatureISAVersion11_7_Generic.Features
->;
+def GFX1100 : AMDGPUProcessorModel<"gfx1100", GFX11SpeedModel,
+  FeatureISAVersion11_0_0.Features, [11, 0, 0]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1101 : AMDGPUProcessorModel<"gfx1101", GFX11SpeedModel,
+  FeatureISAVersion11_0_1.Features, [11, 0, 1]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1102 : AMDGPUProcessorModel<"gfx1102", GFX11SpeedModel,
+  FeatureISAVersion11_0_2.Features, [11, 0, 2]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1103 : AMDGPUProcessorModel<"gfx1103", GFX11SpeedModel,
+  FeatureISAVersion11_0_3.Features, [11, 0, 3]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1150 : AMDGPUProcessorModel<"gfx1150", GFX11SpeedModel,
+  FeatureISAVersion11_5_0.Features, [11, 5, 0]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1151 : AMDGPUProcessorModel<"gfx1151", GFX11SpeedModel,
+  FeatureISAVersion11_5_1.Features, [11, 5, 1]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1152 : AMDGPUProcessorModel<"gfx1152", GFX11SpeedModel,
+  FeatureISAVersion11_5_2.Features, [11, 5, 2]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1153 : AMDGPUProcessorModel<"gfx1153", GFX11SpeedModel,
+  FeatureISAVersion11_5_Common.Features, [11, 5, 3]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1154 : AMDGPUProcessorModel<"gfx1154", GFX11SpeedModel,
+  FeatureISAVersion11_5_Common.Features, [11, 5, 4]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1170 : AMDGPUProcessorModel<"gfx1170", GFX11SpeedModel,
+  FeatureISAVersion11_7_Common.Features, [11, 7, 0]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1171 : AMDGPUProcessorModel<"gfx1171", GFX11SpeedModel,
+  FeatureISAVersion11_7_Common.Features, [11, 7, 1]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1172 : AMDGPUProcessorModel<"gfx1172", GFX11SpeedModel,
+  FeatureISAVersion11_7_Common.Features, [11, 7, 2]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX11_GENERIC : AMDGPUProcessorModel<"gfx11-generic", GFX11SpeedModel,
+  FeatureISAVersion11_Generic.Features, [11, 0, 3]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+  let CoveredGPUs = [GFX1100, GFX1101, GFX1102, GFX1103, GFX1150, GFX1151, GFX1152, GFX1153,
+                     GFX1154];
+}
+
+def GFX11_7_GENERIC : AMDGPUProcessorModel<"gfx11-7-generic", GFX11SpeedModel,
+  FeatureISAVersion11_7_Generic.Features, [11, 7, 0]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+  let CoveredGPUs = [GFX1170, GFX1171, GFX1172];
+}
 
 //===----------------------------------------------------------------------===//
 // GCN GFX12.
 //===----------------------------------------------------------------------===//
 
-def : ProcessorModel<"gfx1200", GFX12SpeedModel,
-  FeatureISAVersion12.Features
->;
-
-def : ProcessorModel<"gfx1201", GFX12SpeedModel,
-  FeatureISAVersion12.Features
->;
-
-// [gfx1200, gfx1201]
-def : ProcessorModel<"gfx12-generic", GFX12SpeedModel,
-  FeatureISAVersion12_Generic.Features
->;
-
-def : ProcessorModel<"gfx1250", GFX1250SpeedModel,
-  FeatureISAVersion12_50.Features
->;
-
-def : ProcessorModel<"gfx1251", GFX1251SpeedModel,
-  FeatureISAVersion12_51.Features
->;
-
-// [gfx1250, gfx1251]
-def : ProcessorModel<"gfx12-5-generic", GFX125xGenericSpeedModel,
-  FeatureISAVersion12_5_Generic.Features
->;
+def GFX1200 : AMDGPUProcessorModel<"gfx1200", GFX12SpeedModel,
+  FeatureISAVersion12.Features, [12, 0, 0]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX1201 : AMDGPUProcessorModel<"gfx1201", GFX12SpeedModel,
+  FeatureISAVersion12.Features, [12, 0, 1]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
+
+def GFX12_GENERIC : AMDGPUProcessorModel<"gfx12-generic", GFX12SpeedModel,
+  FeatureISAVersion12_Generic.Features, [12, 0, 0]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+  let CoveredGPUs = [GFX1200, GFX1201];
+}
+
+def GFX1250 : AMDGPUProcessorModel<"gfx1250", GFX1250SpeedModel,
+  FeatureISAVersion12_50.Features, [12, 5, 0]> {
+  let ArchFeatures = [FEATURE_FAST_FMA_F32, FEATURE_FAST_DENORMAL_F32, FEATURE_WAVE32, FEATURE_XNACK, FEATURE_SRAMECC];
+}
+
+def GFX1251 : AMDGPUProcessorModel<"gfx1251", GFX1251SpeedModel,
+  FeatureISAVersion12_51.Features, [12, 5, 1]> {
+  let ArchFeatures = [FEATURE_FAST_FMA_F32, FEATURE_FAST_DENORMAL_F32, FEATURE_WAVE32, FEATURE_XNACK, FEATURE_SRAMECC];
+}
+
+def GFX12_5_GENERIC : AMDGPUProcessorModel<"gfx12-5-generic", GFX125xGenericSpeedModel,
+  FeatureISAVersion12_5_Generic.Features, [12, 5, 0]> {
+  let ArchFeatures = [FEATURE_FAST_FMA_F32, FEATURE_FAST_DENORMAL_F32, FEATURE_WAVE32, FEATURE_XNACK, FEATURE_SRAMECC];
+  let CoveredGPUs = [GFX1250, GFX1251];
+}
 
 //===----------------------------------------------------------------------===//
 // GCN GFX13.
 //===----------------------------------------------------------------------===//
 
-def : ProcessorModel<"gfx1310", GFX12SpeedModel,
-  FeatureISAVersion13.Features
->;
+def GFX1310 : AMDGPUProcessorModel<"gfx1310", GFX12SpeedModel,
+  FeatureISAVersion13.Features, [13, 1, 0]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+}
 
-// [gfx1310]
-def : ProcessorModel<"gfx13-generic", GFX12SpeedModel,
-  FeatureISAVersion13_Generic.Features
->;
+def GFX13_GENERIC : AMDGPUProcessorModel<"gfx13-generic", GFX12SpeedModel,
+  FeatureISAVersion13_Generic.Features, [13, 1, 0]> {
+  let ArchFeatures = ArchFeaturesW32Wgp;
+  let CoveredGPUs = [GFX1310];
+}

diff  --git a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp
index b42e0f34ff860..de6ed11f2d242 100644
--- a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp
+++ b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp
@@ -24,10 +24,10 @@ using namespace AMDGPU;
 
 StringRef llvm::AMDGPU::getArchFamilyNameAMDGCN(GPUKind AK) {
   StringRef ArchName = getArchNameAMDGCN(AK);
-  assert((AK >= GK_AMDGCN_GENERIC_FIRST && AK <= GK_AMDGCN_GENERIC_LAST) ==
+  assert((AK >= GK_AMDGPU_GENERIC_FIRST && AK <= GK_AMDGPU_GENERIC_LAST) ==
              ArchName.ends_with("-generic") &&
          "Generic AMDGCN arch not classified correctly!");
-  if (AK >= GK_AMDGCN_GENERIC_FIRST && AK <= GK_AMDGCN_GENERIC_LAST) {
+  if (AK >= GK_AMDGPU_GENERIC_FIRST && AK <= GK_AMDGPU_GENERIC_LAST) {
     // Return the part before the first '-', e.g. "gfx9-4-generic" -> "gfx9".
     return ArchName.take_front(ArchName.find('-'));
   }
@@ -36,10 +36,10 @@ StringRef llvm::AMDGPU::getArchFamilyNameAMDGCN(GPUKind AK) {
 
 Triple::SubArchType llvm::AMDGPU::getSubArch(GPUKind AK) {
   switch (AK) {
-#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
+#define AMDGPU_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
   case ENUM:                                                                   \
     return SUBARCH;
-#include "llvm/TargetParser/AMDGPUTargetParser.def"
+#include "llvm/TargetParser/AMDGPUTargetParserDef.inc"
   default:
     return Triple::SubArchType::NoSubArch;
   }
@@ -48,10 +48,10 @@ Triple::SubArchType llvm::AMDGPU::getSubArch(GPUKind AK) {
 AMDGPU::GPUKind
 llvm::AMDGPU::getGPUKindFromSubArch(Triple::SubArchType SubArch) {
   switch (SubArch) {
-#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
+#define AMDGPU_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
   case SUBARCH:                                                                \
     return ENUM;
-#include "llvm/TargetParser/AMDGPUTargetParser.def"
+#include "llvm/TargetParser/AMDGPUTargetParserDef.inc"
   default:
     return GK_NONE;
   }
@@ -186,10 +186,10 @@ std::string AMDGPU::mergeSubArch(const Triple &A, const Triple &B) {
 
 StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) {
   switch (AK) {
-#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
+#define AMDGPU_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
   case ENUM:                                                                   \
     return NAME;
-#include "llvm/TargetParser/AMDGPUTargetParser.def"
+#include "llvm/TargetParser/AMDGPUTargetParserDef.inc"
   default:
     return "";
   }
@@ -253,9 +253,9 @@ StringRef llvm::AMDGPU::getArchNameR600(GPUKind AK) {
 
 AMDGPU::GPUKind llvm::AMDGPU::parseArchAMDGCN(StringRef CPU) {
   return StringSwitch<AMDGPU::GPUKind>(CPU)
-#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES) .Case(NAME, ENUM)
-#define AMDGCN_GPU_ALIAS(NAME, ENUM) .Case(NAME, ENUM)
-#include "llvm/TargetParser/AMDGPUTargetParser.def"
+#define AMDGPU_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES) .Case(NAME, ENUM)
+#define AMDGPU_GPU_ALIAS(NAME, ENUM) .Case(NAME, ENUM)
+#include "llvm/TargetParser/AMDGPUTargetParserDef.inc"
       .Case("generic", AMDGPU::GPUKind::GK_GFX600)
       .Case("generic-hsa", AMDGPU::GPUKind::GK_GFX700)
       .Default(AMDGPU::GPUKind::GK_NONE);
@@ -271,10 +271,10 @@ AMDGPU::GPUKind llvm::AMDGPU::parseArchR600(StringRef CPU) {
 
 unsigned AMDGPU::getArchAttrAMDGCN(GPUKind AK) {
   switch (AK) {
-#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
+#define AMDGPU_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
   case ENUM:                                                                   \
     return FEATURES;
-#include "llvm/TargetParser/AMDGPUTargetParser.def"
+#include "llvm/TargetParser/AMDGPUTargetParserDef.inc"
   default:
     return FEATURE_NONE;
   }
@@ -282,10 +282,10 @@ unsigned AMDGPU::getArchAttrAMDGCN(GPUKind AK) {
 
 unsigned AMDGPU::getArchAttrAMDGCN(Triple::SubArchType SubArch) {
   switch (SubArch) {
-#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
+#define AMDGPU_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
   case SUBARCH:                                                                \
     return FEATURES;
-#include "llvm/TargetParser/AMDGPUTargetParser.def"
+#include "llvm/TargetParser/AMDGPUTargetParserDef.inc"
   default:
     return FEATURE_NONE;
   }
@@ -306,13 +306,13 @@ void AMDGPU::fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values,
                                      Triple::SubArchType SubArch) {
   // XXX: Should this only report unique canonical names?
   // An alias shares its GPU's GPUKind, so it is filtered alongside it.
-#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
+#define AMDGPU_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
   if (isCPUValidForSubArch(SubArch, ENUM))                                     \
     Values.push_back(NAME);
-#define AMDGCN_GPU_ALIAS(NAME, ENUM)                                           \
+#define AMDGPU_GPU_ALIAS(NAME, ENUM)                                           \
   if (isCPUValidForSubArch(SubArch, ENUM))                                     \
     Values.push_back(NAME);
-#include "llvm/TargetParser/AMDGPUTargetParser.def"
+#include "llvm/TargetParser/AMDGPUTargetParserDef.inc"
 }
 
 void AMDGPU::fillValidArchListR600(SmallVectorImpl<StringRef> &Values) {
@@ -335,10 +335,10 @@ AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) {
 
   switch (AK) {
 #define MAKE_ISAVERSION(A, B, C) {A, B, C}
-#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
+#define AMDGPU_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
   case ENUM:                                                                   \
     return MAKE_ISAVERSION ISAVERSION;
-#include "llvm/TargetParser/AMDGPUTargetParser.def"
+#include "llvm/TargetParser/AMDGPUTargetParserDef.inc"
 #undef MAKE_ISAVERSION
   default:
     return {0, 0, 0};
@@ -348,10 +348,10 @@ AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) {
 AMDGPU::IsaVersion AMDGPU::getIsaVersion(Triple::SubArchType SubArch) {
   switch (SubArch) {
 #define MAKE_ISAVERSION(A, B, C) {A, B, C}
-#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
+#define AMDGPU_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
   case SUBARCH:                                                                \
     return MAKE_ISAVERSION ISAVERSION;
-#include "llvm/TargetParser/AMDGPUTargetParser.def"
+#include "llvm/TargetParser/AMDGPUTargetParserDef.inc"
 #undef MAKE_ISAVERSION
   default:
     return {0, 0, 0};

diff  --git a/llvm/test/TableGen/AMDGPUTargetDefErrors.td b/llvm/test/TableGen/AMDGPUTargetDefErrors.td
index 922ca47353d58..7697f37b955a6 100644
--- a/llvm/test/TableGen/AMDGPUTargetDefErrors.td
+++ b/llvm/test/TableGen/AMDGPUTargetDefErrors.td
@@ -5,6 +5,8 @@
 // RUN:   | FileCheck %t/dup-processor.td -DFILE=%t/dup-processor.td --implicit-check-not="error:"
 // RUN: not llvm-tblgen -gen-amdgpu-target-def -I %p/../../include %t/alias-shadows-processor.td 2>&1 \
 // RUN:   | FileCheck %t/alias-shadows-processor.td -DFILE=%t/alias-shadows-processor.td --implicit-check-not="error:"
+// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %p/../../include %t/bad-isa-version.td 2>&1 \
+// RUN:   | FileCheck %t/bad-isa-version.td -DFILE=%t/bad-isa-version.td --implicit-check-not="error:"
 
 // Verify the validation performed by the -gen-amdgpu-target-def backend.
 
@@ -12,9 +14,13 @@
 include "llvm/Target/Target.td"
 def MyTarget : Target;
 class AMDGPUArchFeature<string spelling> { string Spelling = spelling; }
-class AMDGPUGPUInfo { list<AMDGPUArchFeature> ArchFeatures = []; }
+class AMDGPUGPUInfo<list<int> isa = []> {
+  list<AMDGPUArchFeature> ArchFeatures = [];
+  list<int> IsaVersion = isa;
+  list<Processor> CoveredGPUs = [];
+}
 
-def : ProcessorModel<"gfx900", NoSchedModel, []>, AMDGPUGPUInfo;
+def : ProcessorModel<"gfx900", NoSchedModel, []>, AMDGPUGPUInfo<[9, 0, 0]>;
 // An alias must resolve to a canonical AMDGPU GPU.
 // CHECK: [[FILE]]:[[#@LINE+1]]:1: error: ProcessorAlias 'foo' aliases 'gfx-missing' which is not a canonical AMDGPU GPU
 def : ProcessorAlias<"foo", "gfx-missing">;
@@ -23,20 +29,42 @@ def : ProcessorAlias<"foo", "gfx-missing">;
 include "llvm/Target/Target.td"
 def MyTarget : Target;
 class AMDGPUArchFeature<string spelling> { string Spelling = spelling; }
-class AMDGPUGPUInfo { list<AMDGPUArchFeature> ArchFeatures = []; }
+class AMDGPUGPUInfo<list<int> isa = []> {
+  list<AMDGPUArchFeature> ArchFeatures = [];
+  list<int> IsaVersion = isa;
+  list<Processor> CoveredGPUs = [];
+}
 
-def DupA : ProcessorModel<"gfx900", NoSchedModel, []>, AMDGPUGPUInfo;
+def DupA : ProcessorModel<"gfx900", NoSchedModel, []>, AMDGPUGPUInfo<[9, 0, 0]>;
 // A canonical GPU name must be unique.
 // CHECK: [[FILE]]:[[#@LINE+1]]:5: error: duplicate AMDGPU processor name 'gfx900'
-def DupB : ProcessorModel<"gfx900", NoSchedModel, []>, AMDGPUGPUInfo;
+def DupB : ProcessorModel<"gfx900", NoSchedModel, []>, AMDGPUGPUInfo<[9, 0, 0]>;
 
 //--- alias-shadows-processor.td
 include "llvm/Target/Target.td"
 def MyTarget : Target;
 class AMDGPUArchFeature<string spelling> { string Spelling = spelling; }
-class AMDGPUGPUInfo { list<AMDGPUArchFeature> ArchFeatures = []; }
+class AMDGPUGPUInfo<list<int> isa = []> {
+  list<AMDGPUArchFeature> ArchFeatures = [];
+  list<int> IsaVersion = isa;
+  list<Processor> CoveredGPUs = [];
+}
 
-def : ProcessorModel<"gfx900", NoSchedModel, []>, AMDGPUGPUInfo;
+def : ProcessorModel<"gfx900", NoSchedModel, []>, AMDGPUGPUInfo<[9, 0, 0]>;
 // An alias name must not collide with a canonical GPU name.
 // CHECK: [[FILE]]:[[#@LINE+1]]:1: error: duplicate AMDGPU processor name 'gfx900'
 def : ProcessorAlias<"gfx900", "gfx900">;
+
+//--- bad-isa-version.td
+include "llvm/Target/Target.td"
+def MyTarget : Target;
+class AMDGPUArchFeature<string spelling> { string Spelling = spelling; }
+class AMDGPUGPUInfo<list<int> isa = []> {
+  list<AMDGPUArchFeature> ArchFeatures = [];
+  list<int> IsaVersion = isa;
+  list<Processor> CoveredGPUs = [];
+}
+// A malformed IsaVersion is reported (not asserted), so this stays a clean
+// diagnostic in release builds.
+// CHECK: [[FILE]]:[[#@LINE+1]]:1: error: GPU 'gfx900' must have a 3-element [major, minor, stepping] IsaVersion
+def : ProcessorModel<"gfx900", NoSchedModel, []>, AMDGPUGPUInfo<[9, 0]>;

diff  --git a/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp b/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp
index d982fb45da9cc..66d9d3b66350c 100644
--- a/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp
+++ b/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp
@@ -29,11 +29,47 @@ static void emitGPUKindEnum(raw_ostream &OS, StringRef Name) {
     OS << ((C == '-') ? '_' : toUpper(C));
 }
 
+// Derive the Triple::SubArchType from an AMDGPU processor name, e.g. "gfx90a"
+// -> Triple::AMDGPUSubArch90A. A generic target uses its family's major
+// subarch, e.g. "gfx9-generic" -> Triple::AMDGPUSubArch9.
+static void emitSubArch(raw_ostream &OS, StringRef Name) {
+  StringRef Suffix = Name;
+  Suffix.consume_front("gfx");
+  Suffix.consume_back("-generic");
+
+  OS << "Triple::AMDGPUSubArch";
+  for (char C : Suffix)
+    OS << ((C == '-') ? '_' : toUpper(C));
+}
+
+// Emit the ISA version tuple "(major, minor, stepping)".
+static void emitIsaVersion(raw_ostream &OS, const Record *Rec) {
+  std::vector<int64_t> V = Rec->getValueAsListOfInts("IsaVersion");
+  if (V.size() != 3) {
+    PrintFatalError(Rec->getLoc(),
+                    "GPU '" + Rec->getValueAsString("Name") +
+                        "' must have a 3-element [major, minor, stepping] "
+                        "IsaVersion");
+  }
+
+  OS << '(' << V[0] << ", " << V[1] << ", " << V[2] << ')';
+}
+
 // A canonical GPU or a ProcessorAlias.
 namespace {
 struct GPUEntry {
   const Record *Rec;
   bool IsAlias;
+
+  // An entry is generic if it is (or aliases) a "gfxN-generic" family target,
+  // i.e. a canonical that covers a set of concrete GPUs (non-empty
+  // CoveredGPUs).
+  // \p Canonicals maps canonical GPU names to their records.
+  bool isGeneric(const StringMap<const Record *> &Canonicals) const {
+    const Record *Canon =
+        IsAlias ? Canonicals.lookup(Rec->getValueAsString("Alias")) : Rec;
+    return Canon && !Canon->getValueAsListOfDefs("CoveredGPUs").empty();
+  }
 };
 } // namespace
 
@@ -52,18 +88,29 @@ static void emitFeatureExpr(raw_ostream &OS, const Record *Rec,
     OS << NoneSpelling;
 }
 
-// Collect canonical GPUs and their aliases, in TableGen definition order.
-static std::vector<GPUEntry> collectGPUs(const RecordKeeper &RK) {
+// Collect canonical GPUs and their aliases, in TableGen definition order. R600
+// GPUs are plain Processor records; AMDGPU GPUs are ProcessorModel records (a
+// Processor subclass), so \p WantR600 selects the family to emit.
+static std::vector<GPUEntry> collectGPUs(const RecordKeeper &RK,
+                                         bool WantR600) {
   ArrayRef<const Record *> GPUs = RK.getAllDerivedDefinitions("AMDGPUGPUInfo");
   std::vector<GPUEntry> Entries;
   Entries.reserve(GPUs.size());
-  for (const Record *Rec : GPUs)
+  for (const Record *Rec : GPUs) {
+    if (Rec->isSubClassOf("ProcessorModel") == WantR600)
+      continue;
     Entries.push_back({Rec, /*IsAlias=*/false});
+  }
 
-  for (const Record *Rec :
-       RK.getAllDerivedDefinitionsIfDefined("ProcessorAlias"))
-    Entries.push_back({Rec, /*IsAlias=*/true});
+  // Aliases only make sense when their canonical is present, so only gather
+  // them for the family being emitted.
+  if (!Entries.empty()) {
+    for (const Record *Rec :
+         RK.getAllDerivedDefinitionsIfDefined("ProcessorAlias"))
+      Entries.push_back({Rec, /*IsAlias=*/true});
+  }
 
+  // Sort to preserve declaration order instead of name order.
   sort(Entries, [](const GPUEntry &A, const GPUEntry &B) {
     return A.Rec->getID() < B.Rec->getID();
   });
@@ -98,8 +145,10 @@ static void validate(ArrayRef<GPUEntry> Entries) {
 }
 
 static void emitR600(raw_ostream &OS, const RecordKeeper &RK) {
-  std::vector<GPUEntry> Entries = collectGPUs(RK);
+  std::vector<GPUEntry> Entries = collectGPUs(RK, /*WantR600=*/true);
   validate(Entries);
+  if (Entries.empty())
+    return;
 
   OS << "#ifndef R600_GPU\n"
         "#define R600_GPU(NAME, ENUM, FEATURES)\n"
@@ -127,9 +176,70 @@ static void emitR600(raw_ostream &OS, const RecordKeeper &RK) {
         "#undef R600_GPU_ALIAS\n";
 }
 
+static void emitAMDGPUEntry(raw_ostream &OS, const GPUEntry &E) {
+  StringRef Name = E.Rec->getValueAsString("Name");
+  if (E.IsAlias) {
+    OS << "AMDGPU_GPU_ALIAS(\"" << Name << "\", ";
+    emitGPUKindEnum(OS, E.Rec->getValueAsString("Alias"));
+    OS << ")\n";
+  } else {
+    OS << "AMDGPU_GPU(\"" << Name << "\", ";
+    emitGPUKindEnum(OS, Name);
+    OS << ", ";
+    emitSubArch(OS, Name);
+    OS << ", ";
+    emitIsaVersion(OS, E.Rec);
+    OS << ", ";
+    emitFeatureExpr(OS, E.Rec, "FEATURE_NONE");
+    OS << ")\n";
+  }
+}
+
+static void emitAMDGPU(raw_ostream &OS, const RecordKeeper &RK) {
+  std::vector<GPUEntry> Entries = collectGPUs(RK, /*WantR600=*/false);
+  validate(Entries);
+  if (Entries.empty())
+    return;
+
+  StringMap<const Record *> Canonicals;
+  for (const GPUEntry &E : Entries) {
+    if (!E.IsAlias)
+      Canonicals[E.Rec->getValueAsString("Name")] = E.Rec;
+  }
+
+  OS << "#ifndef AMDGPU_GPU\n"
+        "#define AMDGPU_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)\n"
+        "#endif\n\n"
+        "#ifndef AMDGPU_GPU_ALIAS\n"
+        "#define AMDGPU_GPU_ALIAS(NAME, ENUM)\n"
+        "#endif\n\n";
+
+  // The GPUKind enum is positional and code relies on the generic targets
+  // being a contiguous block at the end (GK_AMDGPU_GENERIC_FIRST/LAST), so emit
+  // all non-generic entries first, then the generics, each group preserving
+  // TableGen definition order.
+  for (const GPUEntry &E : Entries) {
+    if (!E.isGeneric(Canonicals))
+      emitAMDGPUEntry(OS, E);
+  }
+
+  for (const GPUEntry &E : Entries) {
+    if (E.isGeneric(Canonicals))
+      emitAMDGPUEntry(OS, E);
+  }
+
+  OS << "\n#undef AMDGPU_GPU\n"
+        "#undef AMDGPU_GPU_ALIAS\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
+  // ProcessorModel records. R600.td and AMDGPU.td are separate top-level files
+  // (neither includes the other), so exactly one family is present in a given
+  // run; the other section emits nothing.
   emitR600(OS, RK);
+  emitAMDGPU(OS, RK);
 }
 
 static TableGen::Emitter::Opt X("gen-amdgpu-target-def", emitAMDGPUTargetDef,


        


More information about the cfe-commits mailing list