[flang-commits] [clang] [flang] [lld] [lldb] [llvm] AMDGPU: Introduce amdgpu triple arch (PR #206480)

Matt Arsenault via flang-commits flang-commits at lists.llvm.org
Tue Jul 7 03:55:40 PDT 2026


https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/206480

>From 081fb14af41c50a5508b7214a7d66fe66bfe324c Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Mon, 1 Sep 2025 14:51:44 +0900
Subject: [PATCH 1/2] AMDGPU: Introduce amdgpu triple arch

Move towards using the triple for representing incompatible
ISA changes. Use the subarch field to represent the various
incompatible cases. Previously we pretended a single triple arch
was universally compatible, and only distinguished by function
level subtargets. Move towards using distinct triples to enable
more sophisticated toolchain handling in the future, like proper
runtime library linking.

Introduce a new subarch per unique ISA, but also introduce
"major subarches" which are compatible by a set of covered
minor ISA versions. These map to the existing generic targets.
There are a few placeholder subarch entries, which currently
have missing backing generic arches for codegen.

This should be the preferred triple arch name going forward,
but is treated as an alias of amdgcn. This does not yet change
clang to emit the new triples.

Part of #154925
---
 clang/include/clang/Basic/Attr.td             |    4 +-
 clang/lib/Basic/OffloadArch.cpp               |    3 +-
 clang/lib/Basic/Targets.cpp                   |    2 +-
 clang/lib/Basic/Targets/SPIR.cpp              |    2 +-
 clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp       |    2 +-
 clang/lib/CIR/CodeGen/CIRGenModule.cpp        |    2 +-
 .../Transforms/TargetLowering/LowerModule.cpp |    2 +-
 clang/lib/CodeGen/CGBuiltin.cpp               |    2 +-
 clang/lib/CodeGen/CodeGenModule.cpp           |    6 +-
 clang/lib/Driver/Driver.cpp                   |   11 +-
 clang/lib/Driver/ToolChain.cpp                |    2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp    |    6 +-
 clang/lib/Driver/ToolChains/Darwin.cpp        |    2 +-
 clang/lib/Driver/ToolChains/Flang.cpp         |    3 +-
 clang/lib/Driver/ToolChains/Gnu.cpp           |    2 +-
 clang/lib/Sema/SemaAMDGPU.cpp                 |    2 +-
 clang/lib/Sema/SemaChecking.cpp               |    6 +-
 clang/test/Driver/amdgpu-toolchain.c          |    8 +
 .../ClangLinkerWrapper.cpp                    |    2 +-
 flang/include/flang/Tools/TargetSetup.h       |    2 +-
 flang/lib/Optimizer/CodeGen/Target.cpp        |    2 +-
 lld/ELF/InputFiles.cpp                        |    2 +-
 lldb/source/Utility/ArchSpec.cpp              |   12 +-
 .../ObjectFile/ELF/TestObjectFileELF.cpp      |    2 +-
 lldb/unittests/Utility/ArchSpecTest.cpp       |    6 +-
 llvm/docs/AMDGPUUsage.rst                     | 1054 +++++++++--------
 llvm/docs/ReleaseNotes.md                     |    3 +
 llvm/include/llvm/Object/ELFObjectFile.h      |    2 +-
 .../llvm/TargetParser/AMDGPUTargetParser.def  |  124 +-
 .../llvm/TargetParser/AMDGPUTargetParser.h    |   50 +-
 llvm/include/llvm/TargetParser/Triple.h       |   95 +-
 llvm/lib/Frontend/OpenMP/OMPContext.cpp       |    4 +-
 llvm/lib/Object/RelocationResolver.cpp        |    2 +-
 llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp   |    2 +
 .../lib/Target/AMDGPU/AMDGPUTargetMachine.cpp |   43 +
 .../AMDGPU/AsmParser/AMDGPUAsmParser.cpp      |   32 +-
 .../Disassembler/AMDGPUDisassembler.cpp       |    4 +
 llvm/lib/Target/AMDGPU/GCNSubtarget.cpp       |   43 +-
 .../AMDGPU/MCA/AMDGPUCustomBehaviour.cpp      |    5 +
 .../MCTargetDesc/AMDGPUMCTargetDesc.cpp       |   32 +-
 .../MCTargetDesc/AMDGPUTargetStreamer.cpp     |    2 +-
 .../AMDGPU/TargetInfo/AMDGPUTargetInfo.cpp    |   20 +-
 .../AMDGPU/TargetInfo/AMDGPUTargetInfo.h      |    4 +
 llvm/lib/TargetParser/AMDGPUTargetParser.cpp  |  252 +++-
 llvm/lib/TargetParser/TargetDataLayout.cpp    |    2 +-
 llvm/lib/TargetParser/Triple.cpp              |  162 ++-
 llvm/lib/Transforms/IPO/ExpandVariadics.cpp   |    4 +-
 llvm/lib/Transforms/IPO/OpenMPOpt.cpp         |    2 +-
 llvm/lib/Transforms/Utils/CodeExtractor.cpp   |    2 +-
 llvm/test/CodeGen/AMDGPU/amdgpu-triple.ll     |   78 ++
 .../CodeGen/AMDGPU/elf-header-flags-mach.ll   |    2 +-
 llvm/test/CodeGen/AMDGPU/loop-prefetch.ll     |    2 +-
 .../AMDGPU/march-amdgcn-legacy-arch-name.ll   |   10 +
 .../CodeGen/AMDGPU/target-id-from-triple.ll   |  177 +++
 ...validate-subtarget-subarch-empty-module.ll |   10 +
 .../AMDGPU/validate-subtarget-subarch.ll      |   47 +
 .../CodeGen/MIR/AMDGPU/init-whole.wave.ll     |    4 +-
 .../Linker/Inputs/amdgpu-amdpal-no-subarch.ll |    5 +
 llvm/test/Linker/Inputs/amdgpu-no-subarch.ll  |    5 +
 llvm/test/Linker/Inputs/amdgpu10-subarch.ll   |    5 +
 llvm/test/Linker/Inputs/amdgpu9.00-subarch.ll |    5 +
 llvm/test/Linker/amdgpu-triple-os-mismatch.ll |   19 +
 llvm/test/Linker/amdgpu-triple-subarch.ll     |   42 +
 .../amd-amdgpu-isa-malformed-target-id.s      |    2 +-
 ...mdgcn-target-directive-subarch-cpu-field.s |   58 +
 .../amdgcn-target-malformed-target-id.s       |    2 +-
 .../amdgcn_target_directive_from_eflags.s     |   28 +-
 .../MC/AMDGPU/arch-amdgcn-legacy-arch-name.s  |    7 +
 .../Object/AMDGPU/elf-header-flags-mach.yaml  |    2 +-
 llvm/test/Object/AMDGPU/objdump.s             |    2 +-
 .../AMDGPU/arch-amdgcn-legacy-arch-name.s     |    8 +
 .../llvm-objdump/ELF/AMDGPU/kd-zeroed-gfx10.s |    2 +-
 .../llvm-objdump/ELF/AMDGPU/subarch-triple.s  |   37 +
 .../llvm-objdump/ELF/AMDGPU/subtarget.ll      |   96 +-
 .../llvm-readobj/ELF/AMDGPU/elf-headers.test  |    2 +-
 llvm/tools/llvm-objdump/llvm-objdump.cpp      |    4 +-
 llvm/unittests/Object/ELFObjectFileTest.cpp   |    2 +-
 .../TargetParser/TargetParserTest.cpp         |  427 +++++++
 llvm/unittests/TargetParser/TripleTest.cpp    |  212 +++-
 llvm/utils/UpdateTestChecks/asm.py            |    1 +
 offload/plugins-nextgen/amdgpu/src/rtl.cpp    |    2 +-
 81 files changed, 2623 insertions(+), 722 deletions(-)
 create mode 100644 llvm/test/CodeGen/AMDGPU/amdgpu-triple.ll
 create mode 100644 llvm/test/CodeGen/AMDGPU/march-amdgcn-legacy-arch-name.ll
 create mode 100644 llvm/test/CodeGen/AMDGPU/target-id-from-triple.ll
 create mode 100644 llvm/test/CodeGen/AMDGPU/validate-subtarget-subarch-empty-module.ll
 create mode 100644 llvm/test/CodeGen/AMDGPU/validate-subtarget-subarch.ll
 create mode 100644 llvm/test/Linker/Inputs/amdgpu-amdpal-no-subarch.ll
 create mode 100644 llvm/test/Linker/Inputs/amdgpu-no-subarch.ll
 create mode 100644 llvm/test/Linker/Inputs/amdgpu10-subarch.ll
 create mode 100644 llvm/test/Linker/Inputs/amdgpu9.00-subarch.ll
 create mode 100644 llvm/test/Linker/amdgpu-triple-os-mismatch.ll
 create mode 100644 llvm/test/Linker/amdgpu-triple-subarch.ll
 create mode 100644 llvm/test/MC/AMDGPU/amdgcn-target-directive-subarch-cpu-field.s
 create mode 100644 llvm/test/MC/AMDGPU/arch-amdgcn-legacy-arch-name.s
 create mode 100644 llvm/test/tools/llvm-objdump/AMDGPU/arch-amdgcn-legacy-arch-name.s
 create mode 100644 llvm/test/tools/llvm-objdump/ELF/AMDGPU/subarch-triple.s

diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td
index 3f57104d474a7..de3e0f7b563a7 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -477,7 +477,7 @@ class TargetArch<list<string> arches> : TargetSpec {
 }
 def TargetARM : TargetArch<["arm", "thumb", "armeb", "thumbeb"]>;
 def TargetAArch64 : TargetArch<["aarch64", "aarch64_be", "aarch64_32"]>;
-def TargetAMDGPU : TargetArch<["amdgcn", "r600"]>;
+def TargetAMDGPU : TargetArch<["amdgpu", "r600"]>;
 def TargetAnyArm : TargetArch<!listconcat(TargetARM.Arches, TargetAArch64.Arches)>;
 def TargetAVR : TargetArch<["avr"]>;
 def TargetBPF : TargetArch<["bpfel", "bpfeb"]>;
@@ -512,7 +512,7 @@ def TargetMicrosoftCXXABI : TargetArch<["x86", "x86_64", "arm", "thumb", "aarch6
 // environment on Windows 2. an offloading target e.g. amdgcn or nvptx with
 // a host target in MSVC environment on Windows.
 def TargetMicrosoftRecordLayout : TargetArch<["x86", "x86_64", "arm", "thumb",
-                                              "aarch64", "amdgcn", "nvptx",
+                                              "aarch64", "amdgpu", "nvptx",
                                               "nvptx64", "spirv", "spirv32",
                                               "spirv64"]> {
   let CustomCode = [{ Target.hasMicrosoftRecordLayout() }];
diff --git a/clang/lib/Basic/OffloadArch.cpp b/clang/lib/Basic/OffloadArch.cpp
index 2a333662455e4..5d12f257f3680 100644
--- a/clang/lib/Basic/OffloadArch.cpp
+++ b/clang/lib/Basic/OffloadArch.cpp
@@ -173,8 +173,7 @@ llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple,
   }
 
   if (IsAMDOffloadArch(ID))
-    return llvm::Triple(llvm::Triple::amdgcn, llvm::Triple::NoSubArch,
-                        llvm::Triple::AMD, llvm::Triple::AMDHSA);
+    return llvm::Triple("amdgcn-amd-amdhsa");
 
   return {};
 }
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index ed88ae7173bad..8c01cfca8ccb4 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -434,7 +434,7 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
     return std::make_unique<NVPTXTargetInfo>(Triple, Opts,
                                              /*TargetPointerWidth=*/64);
 
-  case llvm::Triple::amdgcn:
+  case llvm::Triple::amdgpu:
   case llvm::Triple::r600:
     return std::make_unique<AMDGPUTargetInfo>(Triple, Opts);
 
diff --git a/clang/lib/Basic/Targets/SPIR.cpp b/clang/lib/Basic/Targets/SPIR.cpp
index 8fdb45acf381f..3eb62c9051b58 100644
--- a/clang/lib/Basic/Targets/SPIR.cpp
+++ b/clang/lib/Basic/Targets/SPIR.cpp
@@ -111,7 +111,7 @@ void SPIRV64TargetInfo::getTargetDefines(const LangOptions &Opts,
 }
 
 static const AMDGPUTargetInfo
-    AMDGPUTI(llvm::Triple(llvm::Triple::amdgcn, llvm::Triple::NoSubArch,
+    AMDGPUTI(llvm::Triple(llvm::Triple::amdgpu, llvm::Triple::NoSubArch,
                           llvm::Triple::AMD, llvm::Triple::AMDHSA),
              {});
 
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index 425e07715c9f4..3c48b8b67d9ee 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -2815,7 +2815,7 @@ emitTargetArchBuiltinExpr(CIRGenFunction *cgf, unsigned builtinID,
     // These are actually NYI, but that will be reported by emitBuiltinExpr.
     // At this point, we don't even know that the builtin is target-specific.
     return std::nullopt;
-  case llvm::Triple::amdgcn:
+  case llvm::Triple::amdgpu:
     return cgf->emitAMDGPUBuiltinExpr(builtinID, e);
   case llvm::Triple::systemz:
     return std::nullopt;
diff --git a/clang/lib/CIR/CodeGen/CIRGenModule.cpp b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
index 7a05aed4c33e0..feb84c7323c39 100644
--- a/clang/lib/CIR/CodeGen/CIRGenModule.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
@@ -310,7 +310,7 @@ const TargetCIRGenInfo &CIRGenModule::getTargetCIRGenInfo() {
   case llvm::Triple::nvptx64:
     theTargetCIRGenInfo = createNVPTXTargetCIRGenInfo(genTypes);
     return *theTargetCIRGenInfo;
-  case llvm::Triple::amdgcn: {
+  case llvm::Triple::amdgpu: {
     theTargetCIRGenInfo = createAMDGPUTargetCIRGenInfo(genTypes);
     return *theTargetCIRGenInfo;
   }
diff --git a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp
index cccbfdde3bfdf..4061d3b2e58c7 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp
@@ -48,7 +48,7 @@ createTargetLoweringInfo(LowerModule &lm) {
   const llvm::Triple &triple = lm.getTarget().getTriple();
 
   switch (triple.getArch()) {
-  case llvm::Triple::amdgcn:
+  case llvm::Triple::amdgpu:
     return createAMDGPUTargetLoweringInfo();
   case llvm::Triple::nvptx:
   case llvm::Triple::nvptx64:
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 475bfec6199fc..91080c2f5ec37 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -108,8 +108,8 @@ static Value *EmitTargetArchBuiltinExpr(CodeGenFunction *CGF,
   case llvm::Triple::ppc64:
   case llvm::Triple::ppc64le:
     return CGF->EmitPPCBuiltinExpr(BuiltinID, E);
+  case llvm::Triple::amdgpu:
   case llvm::Triple::r600:
-  case llvm::Triple::amdgcn:
     return CGF->EmitAMDGPUBuiltinExpr(BuiltinID, E);
   case llvm::Triple::systemz:
     return CGF->EmitSystemZBuiltinExpr(BuiltinID, E);
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index e155fdd752d7f..f52fdbf78303d 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -291,7 +291,7 @@ createTargetCodeGenInfo(CodeGenModule &CGM) {
     return createLanaiTargetCodeGenInfo(CGM);
   case llvm::Triple::r600:
     return createAMDGPUTargetCodeGenInfo(CGM);
-  case llvm::Triple::amdgcn:
+  case llvm::Triple::amdgpu:
     return createAMDGPUTargetCodeGenInfo(CGM);
   case llvm::Triple::sparc:
     return createSparcV8TargetCodeGenInfo(CGM);
@@ -629,7 +629,7 @@ void CodeGenModule::createOpenMPRuntime() {
   switch (getTriple().getArch()) {
   case llvm::Triple::nvptx:
   case llvm::Triple::nvptx64:
-  case llvm::Triple::amdgcn:
+  case llvm::Triple::amdgpu:
   case llvm::Triple::spirv64:
     assert(
         getLangOpts().OpenMPIsTargetDevice &&
@@ -6211,7 +6211,7 @@ LangAS CodeGenModule::GetGlobalConstantAddressSpace() const {
 }
 
 // In address space agnostic languages, string literals are in default address
-// space in AST. However, certain targets (e.g. amdgcn) request them to be
+// space in AST. However, certain targets (e.g. amdgpu) request them to be
 // emitted in constant address space in LLVM IR. To be consistent with other
 // parts of AST, string literal global variables in constant address space
 // need to be casted to default address space before being put into address
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 1a91b353a27e4..609a8d47d6d07 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -941,10 +941,8 @@ static TripleSet inferOffloadToolchains(Compilation &C,
   for (llvm::StringRef Arch : Archs) {
     OffloadArch ID = StringToOffloadArch(Arch);
     if (ID == OffloadArch::Unknown)
-      ID = StringToOffloadArch(getProcessorFromTargetID(
-          llvm::Triple(llvm::Triple::amdgcn, llvm::Triple::NoSubArch,
-                       llvm::Triple::AMD, llvm::Triple::AMDHSA),
-          Arch));
+      ID = StringToOffloadArch(
+          getProcessorFromTargetID(llvm::Triple("amdgcn-amd-amdhsa"), Arch));
 
     if (Kind == Action::OFK_HIP && !IsAMDOffloadArch(ID)) {
       C.getDriver().Diag(clang::diag::err_drv_offload_bad_gpu_arch)
@@ -990,8 +988,7 @@ static TripleSet inferOffloadToolchains(Compilation &C,
 
   // Infer the default target triple if no specific architectures are given.
   if (Archs.empty() && Kind == Action::OFK_HIP)
-    Triples.insert(llvm::Triple(llvm::Triple::amdgcn, llvm::Triple::NoSubArch,
-                                llvm::Triple::AMD, llvm::Triple::AMDHSA));
+    Triples.insert(llvm::Triple("amdgcn-amd-amdhsa"));
   else if (Archs.empty() && Kind == Action::OFK_Cuda) {
     llvm::Triple::ArchType Arch =
         C.getDefaultToolChain().getTriple().isArch64Bit()
@@ -7238,7 +7235,7 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
       case llvm::Triple::csky:
         TC = std::make_unique<toolchains::CSKYToolChain>(*this, Target, Args);
         break;
-      case llvm::Triple::amdgcn:
+      case llvm::Triple::amdgpu:
       case llvm::Triple::r600:
         TC = std::make_unique<toolchains::AMDGPUToolChain>(*this, Target, Args);
         break;
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 21d2fbef59fc6..f894a0635de13 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -1482,7 +1482,7 @@ std::string ToolChain::ComputeLLVMTriple(const ArgList &Args, BoundArch BA,
   }
   case llvm::Triple::aarch64_32:
     return getTripleString().str();
-  case llvm::Triple::amdgcn: {
+  case llvm::Triple::amdgpu: {
     llvm::Triple Triple = getTriple();
     tools::AMDGPU::setArchNameInTriple(getDriver(), Args, InputType, Triple);
     return Triple.getTriple();
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index dfd13fbe8a4eb..6a52f026598d1 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -95,7 +95,7 @@ static bool useFramePointerForTargetByDefault(const llvm::opt::ArgList &Args,
   case llvm::Triple::sparc:
   case llvm::Triple::sparcel:
   case llvm::Triple::sparcv9:
-  case llvm::Triple::amdgcn:
+  case llvm::Triple::amdgpu:
   case llvm::Triple::r600:
   case llvm::Triple::csky:
   case llvm::Triple::loongarch32:
@@ -817,8 +817,8 @@ std::string tools::getCPUName(const Driver &D, const ArgList &Args,
   case llvm::Triple::systemz:
     return systemz::getSystemZTargetCPU(Args, T);
 
+  case llvm::Triple::amdgpu:
   case llvm::Triple::r600:
-  case llvm::Triple::amdgcn:
     return getAMDGPUTargetGPU(T, Args);
 
   case llvm::Triple::wasm32:
@@ -899,8 +899,8 @@ void tools::getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
   case llvm::Triple::sparcv9:
     sparc::getSparcTargetFeatures(D, Triple, Args, Features);
     break;
+  case llvm::Triple::amdgpu:
   case llvm::Triple::r600:
-  case llvm::Triple::amdgcn:
     amdgpu::getAMDGPUTargetFeatures(D, Triple, Args, Features);
     break;
   case llvm::Triple::nvptx:
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp
index 64bc96a900f30..a729fb4fc1a4f 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -66,8 +66,8 @@ llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
       .Cases({"armv8m.base", "armv8m.main", "armv8.1m.main"}, llvm::Triple::arm)
       .Cases({"arm64", "arm64e"}, llvm::Triple::aarch64)
       .Case("arm64_32", llvm::Triple::aarch64_32)
+      .Cases({"amdgpu", "amdgcn"}, llvm::Triple::amdgpu)
       .Case("r600", llvm::Triple::r600)
-      .Case("amdgcn", llvm::Triple::amdgcn)
       .Case("nvptx", llvm::Triple::nvptx)
       .Case("nvptx64", llvm::Triple::nvptx64)
       .Case("amdil", llvm::Triple::amdil)
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 662c0c8d9bd4a..1c3389853b950 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -605,9 +605,8 @@ void Flang::addTargetOptions(const ArgList &Args, ArgStringList &CmdArgs,
     getTargetFeatures(D, Triple, Args, CmdArgs, /*ForAs*/ false);
     AddAArch64TargetArgs(Args, CmdArgs);
     break;
-
+  case llvm::Triple::amdgpu:
   case llvm::Triple::r600:
-  case llvm::Triple::amdgcn:
     getTargetFeatures(D, Triple, Args, CmdArgs, /*ForAs*/ false);
     AddAMDGPUTargetArgs(Args, CmdArgs, BA, DeviceOffloadKind);
     break;
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
index b58c10145e7f3..24076d8814322 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -3067,7 +3067,7 @@ Generic_GCC::getDefaultUnwindTableLevel(const ArgList &Args) const {
   switch (getArch()) {
   case llvm::Triple::aarch64:
   case llvm::Triple::aarch64_be:
-  case llvm::Triple::amdgcn:
+  case llvm::Triple::amdgpu:
   case llvm::Triple::ppc:
   case llvm::Triple::ppcle:
   case llvm::Triple::ppc64:
diff --git a/clang/lib/Sema/SemaAMDGPU.cpp b/clang/lib/Sema/SemaAMDGPU.cpp
index bd9e7e7b71ed6..f1de44e3d2ed7 100644
--- a/clang/lib/Sema/SemaAMDGPU.cpp
+++ b/clang/lib/Sema/SemaAMDGPU.cpp
@@ -1034,7 +1034,7 @@ bool DiagnoseUnguardedBuiltins::VisitCallExpr(CallExpr *CE) {
       for (auto &&F : llvm::split(BInfo.getRequiredFeatures(GID), ','))
         FeatureMap[F] = true;
   } else {
-    static const llvm::Triple AMDGCN(llvm::Triple::amdgcn,
+    static const llvm::Triple AMDGCN(llvm::Triple::amdgpu,
                                      llvm::Triple::NoSubArch, llvm::Triple::AMD,
                                      llvm::Triple::AMDHSA);
     llvm::AMDGPU::fillAMDGPUFeatureMap(CurrentGFXIP.back().second, AMDGCN,
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index d52c12670a57b..88a46982f6767 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -2197,7 +2197,7 @@ bool Sema::CheckTSBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
   case llvm::Triple::ppc64:
   case llvm::Triple::ppc64le:
     return PPC().CheckPPCBuiltinFunctionCall(TI, BuiltinID, TheCall);
-  case llvm::Triple::amdgcn:
+  case llvm::Triple::amdgpu:
     return AMDGPU().CheckAMDGCNBuiltinFunctionCall(BuiltinID, TheCall);
   case llvm::Triple::riscv32:
   case llvm::Triple::riscv64:
@@ -3043,7 +3043,7 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
     if (CheckBuiltinTargetInSupported(
             *this, TheCall,
             {llvm::Triple::x86_64, llvm::Triple::arm, llvm::Triple::thumb,
-             llvm::Triple::aarch64, llvm::Triple::amdgcn}))
+             llvm::Triple::aarch64, llvm::Triple::amdgpu}))
       return ExprError();
     break;
 
@@ -3062,7 +3062,7 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
     if (CheckBuiltinTargetInSupported(
             *this, TheCall,
             {llvm::Triple::x86, llvm::Triple::x86_64, llvm::Triple::arm,
-             llvm::Triple::thumb, llvm::Triple::aarch64, llvm::Triple::amdgcn,
+             llvm::Triple::thumb, llvm::Triple::aarch64, llvm::Triple::amdgpu,
              llvm::Triple::ppc, llvm::Triple::ppc64, llvm::Triple::ppcle,
              llvm::Triple::ppc64le}))
       return ExprError();
diff --git a/clang/test/Driver/amdgpu-toolchain.c b/clang/test/Driver/amdgpu-toolchain.c
index 135129b739603..78b76aa8bc8c5 100644
--- a/clang/test/Driver/amdgpu-toolchain.c
+++ b/clang/test/Driver/amdgpu-toolchain.c
@@ -1,5 +1,9 @@
 // RUN: %clang -### --target=amdgcn--amdhsa -x assembler -mcpu=kaveri %s 2>&1 | FileCheck -check-prefix=AS_LINK %s
 // RUN: %clang -### -g --target=amdgcn--amdhsa -mcpu=kaveri -nogpulib %s 2>&1 | FileCheck -check-prefix=DWARF_VER %s
+
+// RUN: %clang -### --target=amdgpu7--amdhsa -x assembler -mcpu=kaveri %s 2>&1 | FileCheck -check-prefix=AS_LINK %s
+// RUN: %clang -### -g --target=amdgpu7--amdhsa -mcpu=kaveri -nogpulib %s 2>&1 | FileCheck -check-prefix=DWARF_VER %s
+
 // RUN: %clang -### --target=amdgcn-amd-amdpal -x assembler -mcpu=kaveri %s 2>&1 | FileCheck -check-prefix=AS_LINK %s
 // RUN: %clang -### -g --target=amdgcn-amd-amdpal -mcpu=kaveri %s 2>&1 | FileCheck -check-prefix=DWARF_VER %s
 // RUN: %clang -### --target=amdgcn-mesa-mesa3d -x assembler -mcpu=kaveri %s 2>&1 | FileCheck -check-prefix=AS_LINK %s
@@ -29,6 +33,10 @@
 
 // RUN: %clang -### --target=amdgcn-amd-amdhsa -mcpu=gfx90a:xnack+:sramecc- -nogpulib \
 // RUN:   -L. -fconvergent-functions %s 2>&1 | FileCheck -check-prefix=MCPU %s
+
+// RUN: %clang -### --target=amdgpu9.0a-amd-amdhsa -mcpu=gfx90a:xnack+:sramecc- -nogpulib \
+// RUN:   -L. -fconvergent-functions %s 2>&1 | FileCheck -check-prefix=MCPU %s
+
 // MCPU: ld.lld{{.*}}"-plugin-opt=mcpu=gfx90a"{{.*}}"-plugin-opt=-mattr=+xnack,-sramecc"{{.*}}
 
 // RUN: %clang -### --target=amdgcn-amd-amdhsa -mcpu=gfx906 -nogpulib \
diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
index 5abda37ada7fb..878f56f2d7979 100644
--- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
+++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
@@ -619,7 +619,7 @@ Expected<StringRef> linkDevice(ArrayRef<StringRef> InputFiles,
   switch (Triple.getArch()) {
   case Triple::nvptx:
   case Triple::nvptx64:
-  case Triple::amdgcn:
+  case Triple::amdgpu:
   case Triple::x86:
   case Triple::x86_64:
   case Triple::aarch64:
diff --git a/flang/include/flang/Tools/TargetSetup.h b/flang/include/flang/Tools/TargetSetup.h
index 002e82aa72484..3fc08ec5ae870 100644
--- a/flang/include/flang/Tools/TargetSetup.h
+++ b/flang/include/flang/Tools/TargetSetup.h
@@ -47,7 +47,7 @@ namespace Fortran::tools {
   }
 
   switch (targetTriple.getArch()) {
-  case llvm::Triple::ArchType::amdgcn:
+  case llvm::Triple::ArchType::amdgpu:
   case llvm::Triple::ArchType::x86_64:
     break;
   default:
diff --git a/flang/lib/Optimizer/CodeGen/Target.cpp b/flang/lib/Optimizer/CodeGen/Target.cpp
index 45311850e38df..2042b8b0c06fe 100644
--- a/flang/lib/Optimizer/CodeGen/Target.cpp
+++ b/flang/lib/Optimizer/CodeGen/Target.cpp
@@ -1950,7 +1950,7 @@ std::unique_ptr<fir::CodeGenSpecifics> fir::CodeGenSpecifics::get(
     return std::make_unique<TargetRISCV64>(ctx, std::move(trp),
                                            std::move(kindMap), targetCPU,
                                            targetFeatures, targetABI, dl);
-  case llvm::Triple::ArchType::amdgcn:
+  case llvm::Triple::ArchType::amdgpu:
     return std::make_unique<TargetAMDGPU>(ctx, std::move(trp),
                                           std::move(kindMap), targetCPU,
                                           targetFeatures, targetABI, dl);
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index 12d09213c9d2d..05c0f3f1c445b 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -1746,7 +1746,7 @@ static uint16_t getBitcodeMachineKind(Ctx &ctx, StringRef path,
   case Triple::aarch64:
   case Triple::aarch64_be:
     return EM_AARCH64;
-  case Triple::amdgcn:
+  case Triple::amdgpu:
   case Triple::r600:
     return EM_AMDGPU;
   case Triple::arm:
diff --git a/lldb/source/Utility/ArchSpec.cpp b/lldb/source/Utility/ArchSpec.cpp
index 0a27e2d2b30ec..bd3660f906011 100644
--- a/lldb/source/Utility/ArchSpec.cpp
+++ b/lldb/source/Utility/ArchSpec.cpp
@@ -54,9 +54,9 @@ struct CoreDefinition {
    8,                                                                          \
    4,                                                                          \
    16,                                                                         \
-   llvm::Triple::amdgcn,                                                       \
+   llvm::Triple::amdgpu,                                                       \
    ArchSpec::eCore_amd_gpu_gcn_##sub,                                          \
-   "amdgcn"}
+   "amdgpu"}
 // This core information can be looked using the ArchSpec::Core as the index
 static constexpr const CoreDefinition g_core_definitions[] = {
     {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_generic,
@@ -348,8 +348,8 @@ static constexpr const CoreDefinition g_core_definitions[] = {
     AMD_GPU_CORE_DEF_GCN(GFX12_5_GENERIC),
     AMD_GPU_CORE_DEF_GCN(GFX11_7_GENERIC),
     AMD_GPU_CORE_DEF_GCN(GFX13_GENERIC),
-    {eByteOrderLittle, 8, 4, 16, llvm::Triple::amdgcn,
-     ArchSpec::eCore_amd_gpu_unknown, "amdgcn"},
+    {eByteOrderLittle, 8, 4, 16, llvm::Triple::amdgpu,
+     ArchSpec::eCore_amd_gpu_unknown, "amdgpu"},
 };
 
 // Ensure that we have an entry in the g_core_definitions for each core. If you
@@ -1370,7 +1370,7 @@ bool ArchSpec::SetArchitecture(ArchitectureType arch_type, uint32_t cpu,
           m_triple.setArch(core_def->machine);
           break;
         case llvm::Triple::r600:
-        case llvm::Triple::amdgcn: {
+        case llvm::Triple::amdgpu: {
           // AMDGPU arches are special: they append a 5th element to the triple
           // that comes after the environment and contains the sub type name.
           std::string environment("-");
@@ -1532,7 +1532,7 @@ void ArchSpec::UpdateCore() {
     // little endian
     m_byte_order = core_def->default_byte_order;
 
-    // amdgcn/r600 match their first table entry (GFX600/R600), so refine the
+    // amdgpu/r600 match their first table entry (GFX600/R600), so refine the
     // core from the model in the triple environment.
     if (m_core == eCore_amd_gpu_gcn_GFX600) {
       m_core = GetAMDGPUVariantToCoreGCN(
diff --git a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
index 63c8c9e6fd79d..c6ca7e878dafa 100644
--- a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
+++ b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
@@ -310,7 +310,7 @@ TEST_P(ObjectFileELFAMDGPUTest, DecodesAMDGPUModel) {
   EXPECT_NE(ArchSpec::eCore_amd_gpu_unknown, arch.GetCore());
   EXPECT_EQ(model.name, arch.GetClangTargetCPU());
   bool is_gcn = llvm::StringRef(model.name).starts_with("gfx");
-  EXPECT_EQ(is_gcn ? llvm::Triple::amdgcn : llvm::Triple::r600,
+  EXPECT_EQ(is_gcn ? llvm::Triple::amdgpu : llvm::Triple::r600,
             arch.GetTriple().getArch());
   EXPECT_EQ(llvm::Triple::AMD, arch.GetTriple().getVendor());
   EXPECT_EQ(llvm::Triple::AMDHSA, arch.GetTriple().getOS());
diff --git a/lldb/unittests/Utility/ArchSpecTest.cpp b/lldb/unittests/Utility/ArchSpecTest.cpp
index 32ea5796650b7..4d914315dd1a0 100644
--- a/lldb/unittests/Utility/ArchSpecTest.cpp
+++ b/lldb/unittests/Utility/ArchSpecTest.cpp
@@ -189,11 +189,11 @@ TEST_P(ArchSpecAMDGPUTest, SetTriple) {
   const AMDGPUModel &model = GetParam();
   bool is_gcn = llvm::StringRef(model.name).starts_with("gfx");
   std::string triple =
-      (is_gcn ? "amdgcn" : "r600") + std::string("-amd-amdhsa--") + model.name;
+      (is_gcn ? "amdgpu" : "r600") + std::string("-amd-amdhsa--") + model.name;
 
   ArchSpec AS;
   EXPECT_TRUE(AS.SetTriple(triple));
-  EXPECT_EQ(is_gcn ? llvm::Triple::amdgcn : llvm::Triple::r600,
+  EXPECT_EQ(is_gcn ? llvm::Triple::amdgpu : llvm::Triple::r600,
             AS.GetTriple().getArch());
   EXPECT_NE(ArchSpec::eCore_amd_gpu_unknown, AS.GetCore());
   EXPECT_EQ(model.name, AS.GetClangTargetCPU());
@@ -208,7 +208,7 @@ TEST_P(ArchSpecAMDGPUTest, SetArchitectureFromELF) {
   ArchSpec AS;
   EXPECT_TRUE(AS.SetArchitecture(eArchTypeELF, llvm::ELF::EM_AMDGPU, model.mach,
                                  llvm::ELF::ELFOSABI_AMDGPU_HSA));
-  EXPECT_EQ(is_gcn ? llvm::Triple::amdgcn : llvm::Triple::r600,
+  EXPECT_EQ(is_gcn ? llvm::Triple::amdgpu : llvm::Triple::r600,
             AS.GetTriple().getArch());
   EXPECT_EQ(llvm::Triple::AMD, AS.GetTriple().getVendor());
   EXPECT_EQ(llvm::Triple::AMDHSA, AS.GetTriple().getOS());
diff --git a/llvm/docs/AMDGPUUsage.rst b/llvm/docs/AMDGPUUsage.rst
index 2b3d396965f7a..d5dc9f8acd684 100644
--- a/llvm/docs/AMDGPUUsage.rst
+++ b/llvm/docs/AMDGPUUsage.rst
@@ -49,17 +49,25 @@ LLVM
 Target Triples
 --------------
 
-Use the Clang option ``--target=<Architecture>-<Vendor>-<OS>-<Environment>``
-to specify the target triple:
+Use the Clang option ``--target=<Architecture><SubArch>-<Vendor>-<OS>-<Environment>``
+to specify the target triple.
 
-  .. table:: AMDGPU Architectures
+.. note::
+   Historically, the single top-level ``amdgcn`` architecture was used
+   for all devices and specific devices by the subtarget. It has been
+   replaced with the ``amdgpu`` architecture combined with a subarch
+   suffix. The legacy spelling is accepted for accepted for
+   compatibility.
+
+.. table:: AMDGPU Architectures
      :name: amdgpu-architecture-table
 
      ============ ==============================================================
      Architecture Description
      ============ ==============================================================
      ``r600``     AMD GPUs HD2XXX-HD6XXX for graphics and compute shaders.
-     ``amdgcn``   AMD GPUs GCN GFX6 onwards for graphics and compute shaders.
+     ``amdgpu``   AMD GPUs GCN GFX6 onwards for graphics and compute shaders.
+     ``amdgcn``   Legacy alias for ``amdgpu``.
      ============ ==============================================================
 
   .. table:: AMDGPU Vendors
@@ -105,6 +113,114 @@ to specify the target triple:
      *<empty>*    Default.
      ============ ==============================================================
 
+.. _amdgpu-subarch-compatibility:
+
+Subarchitecture Compatibility
+-----------------------------
+
+For the ``amdgpu`` architecture the ISA version is encoded in the
+triple's *SubArch* component. Every unique ISA has its own *minor
+subarch* (for example ``amdgpu9.00`` for ``gfx900``). ``amdgcn`` is a
+legacy alias of ``amdgpu`` (see :ref:`amdgpu-architecture-table`)
+which does not support subarches.
+
+Minor subarches are grouped into *major subarches* that name a family
+of largely compatible ISA versions (for example ``amdgpu9``). A major
+subarch corresponds to a :ref:`generic processor
+<amdgpu-generic-processor-table>` when one exists for that family; the
+remaining major subarches are placeholders for families that do not
+yet have a generic target for code generation.
+
+Two subarches are considered *compatible* when:
+
+* they are identical, or
+* one of them is the major subarch of the family that the other belongs to.
+
+In particular, two distinct *minor* subarches are never compatible
+with each other, even within the same family (for example
+``amdgpu9.00`` and ``amdgpu9.06`` are not compatible). A minor subarch
+is compatible with itself and its own major subarch, and a major
+subarch is compatible with itself and every minor subarch it covers. A
+triple with no subarch (``amdgpu``) is treated as compatible with
+anything, as a backwards-compatibility allowance. When linking modules
+with compatible-but-unequal subarches, the more specific (minor)
+subarch is selected for the merged module.
+
+The following table lists each major subarch and the minor subarches it covers.
+The *Default Processor* column gives the generic processor that a major
+subarch selects by default for code generation; this is the corresponding
+generic processor for families that have one (see
+:ref:`amdgpu-generic-processor-table`). Major subarches listed as *(none)* are
+placeholders for families that do not yet have a generic target.
+
+  .. list-table:: AMDGPU Major SubArchitecture Coverage
+     :name: amdgpu-major-subarch-table
+     :header-rows: 1
+
+     * - Major SubArch
+       - Default Processor
+       - Covered SubArches (Processor)
+     * - ``amdgpu6``
+       - *(none)*
+       - ``amdgpu6.00`` (``gfx600``), ``amdgpu6.01`` (``gfx601``),
+         ``amdgpu6.02`` (``gfx602``)
+     * - ``amdgpu7``
+       - *(none)*
+       - ``amdgpu7.00`` (``gfx700``), ``amdgpu7.01`` (``gfx701``),
+         ``amdgpu7.02`` (``gfx702``), ``amdgpu7.03`` (``gfx703``),
+         ``amdgpu7.04`` (``gfx704``), ``amdgpu7.05`` (``gfx705``)
+     * - ``amdgpu8``
+       - *(none)*
+       - ``amdgpu8.01`` (``gfx801``), ``amdgpu8.02`` (``gfx802``),
+         ``amdgpu8.03`` (``gfx803``), ``amdgpu8.05`` (``gfx805``)
+     * - ``amdgpu8.10``
+       - *(none)*
+       - ``amdgpu8.10`` (``gfx810``)
+     * - ``amdgpu9``
+       - ``gfx9-generic``
+       - ``amdgpu9.00`` (``gfx900``), ``amdgpu9.02`` (``gfx902``),
+         ``amdgpu9.04`` (``gfx904``), ``amdgpu9.06`` (``gfx906``),
+         ``amdgpu9.09`` (``gfx909``), ``amdgpu9.0c`` (``gfx90c``)
+     * - ``amdgpu9.08``
+       - *(none)*
+       - ``amdgpu9.08`` (``gfx908``)
+     * - ``amdgpu9.0a``
+       - *(none)*
+       - ``amdgpu9.0a`` (``gfx90a``)
+     * - ``amdgpu9.4``
+       - ``gfx9-4-generic``
+       - ``amdgpu9.42`` (``gfx942``), ``amdgpu9.50`` (``gfx950``)
+     * - ``amdgpu10.1``
+       - ``gfx10-1-generic``
+       - ``amdgpu10.10`` (``gfx1010``), ``amdgpu10.11`` (``gfx1011``),
+         ``amdgpu10.12`` (``gfx1012``), ``amdgpu10.13`` (``gfx1013``)
+     * - ``amdgpu10.3``
+       - ``gfx10-3-generic``
+       - ``amdgpu10.30`` (``gfx1030``), ``amdgpu10.31`` (``gfx1031``),
+         ``amdgpu10.32`` (``gfx1032``), ``amdgpu10.33`` (``gfx1033``),
+         ``amdgpu10.34`` (``gfx1034``), ``amdgpu10.35`` (``gfx1035``),
+         ``amdgpu10.36`` (``gfx1036``)
+     * - ``amdgpu11``
+       - ``gfx11-generic``
+       - ``amdgpu11.00`` (``gfx1100``), ``amdgpu11.01`` (``gfx1101``),
+         ``amdgpu11.02`` (``gfx1102``), ``amdgpu11.03`` (``gfx1103``),
+         ``amdgpu11.50`` (``gfx1150``), ``amdgpu11.51`` (``gfx1151``),
+         ``amdgpu11.52`` (``gfx1152``), ``amdgpu11.53`` (``gfx1153``)
+         ``amdgpu11.54`` (``gfx1154``)
+     * - ``amdgpu11.7``
+       - ``gfx11-7-generic``
+       - ``amdgpu11.70`` (``gfx1170``), ``amdgpu11.71`` (``gfx1171``),
+         ``amdgpu11.72`` (``gfx1172``)
+     * - ``amdgpu12``
+       - ``gfx12-generic``
+       - ``amdgpu12.00`` (``gfx1200``), ``amdgpu12.01`` (``gfx1201``)
+     * - ``amdgpu12.5``
+       - ``gfx12-5-generic``
+       - ``amdgpu12.50`` (``gfx1250``), ``amdgpu12.51`` (``gfx1251``)
+     * - ``amdgpu13``
+       - ``gfx13-generic``
+       - ``amdgpu13.10`` (``gfx1310``)
+
 .. _amdgpu-processors:
 
 Processors
@@ -123,488 +239,492 @@ Every processor supports every OS ABI (see :ref:`amdgpu-os`) with the following
   .. table:: AMDGPU Processors
      :name: amdgpu-processor-table
 
-     =========== =============== ============ ===== ================= =============== =============== ======================
-     Processor   Alternative     Target       dGPU/ Target            Target          OS Support      Example
-                 Processor       Triple       APU   Features          Properties      *(see*          Products
-                                 Architecture       Supported                         `amdgpu-os`_
-                                                                                      *and
-                                                                                      corresponding
-                                                                                      runtime release
-                                                                                      notes for
-                                                                                      current
-                                                                                      information and
-                                                                                      level of
-                                                                                      support)*
-     =========== =============== ============ ===== ================= =============== =============== ======================
+     =========== =============== =============== ===== ================= =============== =============== ======================
+     Processor   Alternative     Target          dGPU/ Target            Target          OS Support      Example
+                 Processor       Triple          APU   Features          Properties      *(see*          Products
+                                 Architecture          Supported                         `amdgpu-os`_
+                                                                                         *and
+                                                                                         corresponding
+                                                                                         runtime
+                                                                                         release
+                                                                                         notes for
+                                                                                         current
+                                                                                         information
+                                                                                         and
+                                                                                         level
+                                                                                         of
+                                                                                         support)*
+     =========== =============== =============== ===== ================= =============== =============== ======================
      **Radeon HD 2000/3000 Series (R600)** [AMD-RADEON-HD-2000-3000]_
-     -----------------------------------------------------------------------------------------------------------------------
-     ``r600``                    ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``r630``                    ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``rs880``                   ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``rv670``                   ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
+     --------------------------------------------------------------------------------------------------------------------------
+     ``r600``                    ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``r630``                    ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``rs880``                   ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``rv670``                   ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
      **Radeon HD 4000 Series (R700)** [AMD-RADEON-HD-4000]_
-     -----------------------------------------------------------------------------------------------------------------------
-     ``rv710``                   ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``rv730``                   ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``rv770``                   ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
+     --------------------------------------------------------------------------------------------------------------------------
+     ``rv710``                   ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``rv730``                   ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``rv770``                   ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
      **Radeon HD 5000 Series (Evergreen)** [AMD-RADEON-HD-5000]_
-     -----------------------------------------------------------------------------------------------------------------------
-     ``cedar``                   ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``cypress``                 ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``juniper``                 ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``redwood``                 ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``sumo``                    ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
+     --------------------------------------------------------------------------------------------------------------------------
+     ``cedar``                   ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``cypress``                 ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``juniper``                 ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``redwood``                 ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``sumo``                    ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
      **Radeon HD 6000 Series (Northern Islands)** [AMD-RADEON-HD-6000]_
-     -----------------------------------------------------------------------------------------------------------------------
-     ``barts``                   ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``caicos``                  ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``cayman``                  ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``turks``                   ``r600``     dGPU                    - Does not
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
+     --------------------------------------------------------------------------------------------------------------------------
+     ``barts``                   ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``caicos``                  ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``cayman``                  ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``turks``                   ``r600``        dGPU                    - Does not
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
      **GCN GFX6 (Southern Islands (SI))** [AMD-GCN-GFX6]_
-     -----------------------------------------------------------------------------------------------------------------------
-     ``gfx600``  - ``tahiti``    ``amdgcn``   dGPU                    - Does not      - *pal-amdpal*
-                                                                        support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``gfx601``  - ``pitcairn``  ``amdgcn``   dGPU                    - Does not      - *pal-amdpal*
-                 - ``verde``                                            support
-                                                                        generic
-                                                                        address
-                                                                        space
-     ``gfx602``  - ``hainan``    ``amdgcn``   dGPU                    - Does not      - *pal-amdpal*
-                 - ``oland``                                            support
-                                                                        generic
-                                                                        address
-                                                                        space
+     --------------------------------------------------------------------------------------------------------------------------
+     ``gfx600``  - ``tahiti``    ``amdgpu6.00``   dGPU                   - Does not      - *pal-amdpal*
+                                                                           support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``gfx601``  - ``pitcairn``  ``amdgpu6.01``   dGPU                   - Does not      - *pal-amdpal*
+                 - ``verde``                                               support
+                                                                           generic
+                                                                           address
+                                                                           space
+     ``gfx602``  - ``hainan``    ``amdgpu6.02``   dGPU                   - Does not      - *pal-amdpal*
+                 - ``oland``                                               support
+                                                                           generic
+                                                                           address
+                                                                           space
      **GCN GFX7 (Sea Islands (CI))** [AMD-GCN-GFX7]_
-     -----------------------------------------------------------------------------------------------------------------------
-     ``gfx700``  - ``kaveri``    ``amdgcn``   APU                     - Offset        - *rocm-amdhsa* - A6-7000
-                                                                        flat          - *pal-amdhsa*  - A6 Pro-7050B
-                                                                        scratch       - *pal-amdpal*  - A8-7100
-                                                                                                      - A8 Pro-7150B
-                                                                                                      - A10-7300
-                                                                                                      - A10 Pro-7350B
-                                                                                                      - FX-7500
-                                                                                                      - A8-7200P
-                                                                                                      - A10-7400P
-                                                                                                      - FX-7600P
-     ``gfx701``  - ``hawaii``    ``amdgcn``   dGPU                    - Offset        - *rocm-amdhsa* - FirePro W8100
-                                                                        flat          - *pal-amdhsa*  - FirePro W9100
-                                                                        scratch       - *pal-amdpal*  - FirePro S9150
-                                                                                                      - FirePro S9170
-     ``gfx702``                  ``amdgcn``   dGPU                    - Offset        - *rocm-amdhsa* - Radeon R9 290
-                                                                        flat          - *pal-amdhsa*  - Radeon R9 290x
-                                                                        scratch       - *pal-amdpal*  - Radeon R390
-                                                                                                      - Radeon R390x
-     ``gfx703``  - ``kabini``    ``amdgcn``   APU                     - Offset        - *pal-amdhsa*  - E1-2100
-                 - ``mullins``                                          flat          - *pal-amdpal*  - E1-2200
-                                                                        scratch                       - E1-2500
-                                                                                                      - E2-3000
-                                                                                                      - E2-3800
-                                                                                                      - A4-5000
-                                                                                                      - A4-5100
-                                                                                                      - A6-5200
-                                                                                                      - A4 Pro-3340B
-     ``gfx704``  - ``bonaire``   ``amdgcn``   dGPU                    - Offset        - *pal-amdhsa*  - Radeon HD 7790
-                                                                        flat          - *pal-amdpal*  - Radeon HD 8770
-                                                                        scratch                       - R7 260
-                                                                                                      - R7 260X
-     ``gfx705``                  ``amdgcn``   APU                     - Offset        - *pal-amdhsa*  *TBA*
-                                                                        flat          - *pal-amdpal*
-                                                                        scratch                       .. TODO::
-
-                                                                                                        Add product
-                                                                                                        names.
+     --------------------------------------------------------------------------------------------------------------------------
+     ``gfx700``  - ``kaveri``    ``amdgpu7.00``   APU                    - Offset        - *rocm-amdhsa* - A6-7000
+                                                                           flat          - *pal-amdhsa*  - A6 Pro-7050B
+                                                                           scratch       - *pal-amdpal*  - A8-7100
+                                                                                                         - A8 Pro-7150B
+                                                                                                         - A10-7300
+                                                                                                         - A10 Pro-7350B
+                                                                                                         - FX-7500
+                                                                                                         - A8-7200P
+                                                                                                         - A10-7400P
+                                                                                                         - FX-7600P
+     ``gfx701``  - ``hawaii``    ``amdgpu7.01``   dGPU                   - Offset        - *rocm-amdhsa* - FirePro W8100
+                                                                           flat          - *pal-amdhsa*  - FirePro W9100
+                                                                           scratch       - *pal-amdpal*  - FirePro S9150
+                                                                                                         - FirePro S9170
+     ``gfx702``                  ``amdgpu7.02``   dGPU                   - Offset        - *rocm-amdhsa* - Radeon R9 290
+                                                                           flat          - *pal-amdhsa*  - Radeon R9 290x
+                                                                           scratch       - *pal-amdpal*  - Radeon R390
+                                                                                                         - Radeon R390x
+     ``gfx703``  - ``kabini``    ``amdgpu7.03``   APU                    - Offset        - *pal-amdhsa*  - E1-2100
+                 - ``mullins``                                             flat          - *pal-amdpal*  - E1-2200
+                                                                           scratch                       - E1-2500
+                                                                                                         - E2-3000
+                                                                                                         - E2-3800
+                                                                                                         - A4-5000
+                                                                                                         - A4-5100
+                                                                                                         - A6-5200
+                                                                                                         - A4 Pro-3340B
+     ``gfx704``  - ``bonaire``   ``amdgpu7.04``   dGPU                   - Offset        - *pal-amdhsa*  - Radeon HD 7790
+                                                                           flat          - *pal-amdpal*  - Radeon HD 8770
+                                                                           scratch                       - R7 260
+                                                                                                         - R7 260X
+     ``gfx705``                  ``amdgpu7.05``   APU                    - Offset        - *pal-amdhsa*  *TBA*
+                                                                           flat          - *pal-amdpal*
+                                                                           scratch                       .. TODO::
+                                                                                                           Add product
+                                                                                                           names.
 
      **GCN GFX8 (Volcanic Islands (VI))** [AMD-GCN-GFX8]_
-     -----------------------------------------------------------------------------------------------------------------------
-     ``gfx801``  - ``carrizo``   ``amdgcn``   APU   - xnack           - Offset        - *rocm-amdhsa* - A6-8500P
-                                                                        flat          - *pal-amdhsa*  - Pro A6-8500B
-                                                                        scratch       - *pal-amdpal*  - A8-8600P
-                                                                                                      - Pro A8-8600B
-                                                                                                      - FX-8800P
-                                                                                                      - Pro A12-8800B
-                                                                                                      - A10-8700P
-                                                                                                      - Pro A10-8700B
-                                                                                                      - A10-8780P
-                                                                                                      - A10-9600P
-                                                                                                      - A10-9630P
-                                                                                                      - A12-9700P
-                                                                                                      - A12-9730P
-                                                                                                      - FX-9800P
-                                                                                                      - FX-9830P
-                                                                                                      - E2-9010
-                                                                                                      - A6-9210
-                                                                                                      - A9-9410
-     ``gfx802``  - ``iceland``   ``amdgcn``   dGPU                    - Offset        - *rocm-amdhsa* - Radeon R9 285
-                 - ``tonga``                                            flat          - *pal-amdhsa*  - Radeon R9 380
-                                                                        scratch       - *pal-amdpal*  - Radeon R9 385
-     ``gfx803``  - ``fiji``      ``amdgcn``   dGPU                                    - *rocm-amdhsa* - Radeon R9 Nano
-                                                                                      - *pal-amdhsa*  - Radeon R9 Fury
-                                                                                      - *pal-amdpal*  - Radeon R9 FuryX
-                                                                                                      - Radeon Pro Duo
-                                                                                                      - FirePro S9300x2
-                                                                                                      - Radeon Instinct MI8
-     \           - ``polaris10`` ``amdgcn``   dGPU                    - Offset        - *rocm-amdhsa* - Radeon RX 470
-                                                                        flat          - *pal-amdhsa*  - Radeon RX 480
-                                                                        scratch       - *pal-amdpal*  - Radeon Instinct MI6
-     \           - ``polaris11`` ``amdgcn``   dGPU                    - Offset        - *rocm-amdhsa* - Radeon RX 460
-                                                                        flat          - *pal-amdhsa*
-                                                                        scratch       - *pal-amdpal*
-     ``gfx805``  - ``tongapro``  ``amdgcn``   dGPU                    - Offset        - *rocm-amdhsa* - FirePro S7150
-                                                                        flat          - *pal-amdhsa*  - FirePro S7100
-                                                                        scratch       - *pal-amdpal*  - FirePro W7100
-                                                                                                      - Mobile FirePro
-                                                                                                        M7170
-     ``gfx810``  - ``stoney``    ``amdgcn``   APU   - xnack           - Offset        - *rocm-amdhsa* *TBA*
-                                                                        flat          - *pal-amdhsa*
-                                                                        scratch       - *pal-amdpal*  .. TODO::
-
-                                                                                                        Add product
-                                                                                                        names.
+     --------------------------------------------------------------------------------------------------------------------------
+     ``gfx801``  - ``carrizo``   ``amdgpu8.01``  APU   - xnack           - Offset        - *rocm-amdhsa* - A6-8500P
+                                                                           flat          - *pal-amdhsa*  - Pro A6-8500B
+                                                                           scratch       - *pal-amdpal*  - A8-8600P
+                                                                                                         - Pro A8-8600B
+                                                                                                         - FX-8800P
+                                                                                                         - Pro A12-8800B
+                                                                                                         - A10-8700P
+                                                                                                         - Pro A10-8700B
+                                                                                                         - A10-8780P
+                                                                                                         - A10-9600P
+                                                                                                         - A10-9630P
+                                                                                                         - A12-9700P
+                                                                                                         - A12-9730P
+                                                                                                         - FX-9800P
+                                                                                                         - FX-9830P
+                                                                                                         - E2-9010
+                                                                                                         - A6-9210
+                                                                                                         - A9-9410
+     ``gfx802``  - ``iceland``   ``amdgpu8.02``   dGPU                   - Offset        - *rocm-amdhsa* - Radeon R9 285
+                 - ``tonga``                                               flat          - *pal-amdhsa*  - Radeon R9 380
+                                                                           scratch       - *pal-amdpal*  - Radeon R9 385
+     ``gfx803``  - ``fiji``      ``amdgpu8.03``   dGPU                                   - *rocm-amdhsa* - Radeon R9 Nano
+                                                                                         - *pal-amdhsa*  - Radeon R9 Fury
+                                                                                         - *pal-amdpal*  - Radeon R9 FuryX
+                                                                                                         - Radeon Pro Duo
+                                                                                                         - FirePro S9300x2
+                                                                                                         - Radeon Instinct MI8
+     \           - ``polaris10`` ``amdgpu8.03``   dGPU                   - Offset        - *rocm-amdhsa* - Radeon RX 470
+                                                                           flat          - *pal-amdhsa*  - Radeon RX 480
+                                                                           scratch       - *pal-amdpal*  - Radeon Instinct MI6
+     \           - ``polaris11`` ``amdgpu8.03``   dGPU                   - Offset        - *rocm-amdhsa* - Radeon RX 460
+                                                                           flat          - *pal-amdhsa*
+                                                                           scratch       - *pal-amdpal*
+     ``gfx805``  - ``tongapro``  ``amdgpu8.05``   dGPU                   - Offset        - *rocm-amdhsa* - FirePro S7150
+                                                                           flat          - *pal-amdhsa*  - FirePro S7100
+                                                                           scratch       - *pal-amdpal*  - FirePro W7100
+                                                                                                         - Mobile FirePro
+                                                                                                           M7170
+     ``gfx810``  - ``stoney``    ``amdgpu8.10``   APU   - xnack          - Offset        - *rocm-amdhsa* *TBA*
+                                                                           flat          - *pal-amdhsa*
+                                                                           scratch       - *pal-amdpal*  .. TODO::
+                                                                                                           Add product
+                                                                                                           names.
 
      **GCN GFX9 (Vega)** [AMD-GCN-GFX900-GFX904-VEGA]_ [AMD-GCN-GFX906-VEGA7NM]_ [AMD-GCN-GFX908-CDNA1]_ [AMD-GCN-GFX90A-CDNA2]_ [AMD-GCN-GFX942-CDNA3]_
-     -----------------------------------------------------------------------------------------------------------------------
-     ``gfx900``                  ``amdgcn``   dGPU  - xnack           - Absolute      - *rocm-amdhsa* - Radeon Vega
-                                                                        flat          - *pal-amdhsa*    Frontier Edition
-                                                                        scratch       - *pal-amdpal*  - Radeon RX Vega 56
-                                                                                                      - Radeon RX Vega 64
-                                                                                                      - Radeon RX Vega 64
-                                                                                                        Liquid
-                                                                                                      - Radeon Instinct MI25
-     ``gfx902``                  ``amdgcn``   APU   - xnack           - Absolute      - *rocm-amdhsa* - Ryzen 3 2200G
-                                                                        flat          - *pal-amdhsa*  - Ryzen 5 2400G
-                                                                        scratch       - *pal-amdpal*
-     ``gfx904``                  ``amdgcn``   dGPU  - xnack                           - *rocm-amdhsa* *TBA*
-                                                                                      - *pal-amdhsa*
-                                                                                      - *pal-amdpal*  .. TODO::
-
-                                                                                                        Add product
-                                                                                                        names.
-
-     ``gfx906``                  ``amdgcn``   dGPU  - sramecc         - Absolute      - *rocm-amdhsa* - Radeon Instinct MI50
-                                                    - xnack             flat          - *pal-amdhsa*  - Radeon Instinct MI60
-                                                                        scratch       - *pal-amdpal*  - Radeon VII
-                                                                                                      - Radeon Pro VII
-     ``gfx908``                  ``amdgcn``   dGPU  - sramecc                         - *rocm-amdhsa* - AMD Instinct MI100 Accelerator
-                                                    - xnack           - Absolute
-                                                                        flat
-                                                                        scratch
-     ``gfx909``                  ``amdgcn``   APU   - xnack           - Absolute      - *pal-amdpal*  *TBA*
-                                                                        flat
-                                                                        scratch                       .. TODO::
-
-                                                                                                        Add product
-                                                                                                        names.
-
-     ``gfx90a``                  ``amdgcn``   dGPU  - sramecc         - Absolute      - *rocm-amdhsa* - AMD Instinct MI210 Accelerator
-                                                    - tgsplit           flat          - *rocm-amdhsa* - AMD Instinct MI250 Accelerator
-                                                    - xnack             scratch       - *rocm-amdhsa* - AMD Instinct MI250X Accelerator
-                                                    - kernarg preload - Packed
-                                                      (except MI210)    work-item
-                                                                        IDs
-
-     ``gfx90c``                  ``amdgcn``   APU   - xnack           - Absolute      - *pal-amdpal*  - Ryzen 7 4700G
-                                                                        flat                          - Ryzen 7 4700GE
-                                                                        scratch                       - Ryzen 5 4600G
-                                                                                                      - Ryzen 5 4600GE
-                                                                                                      - Ryzen 3 4300G
-                                                                                                      - Ryzen 3 4300GE
-                                                                                                      - Ryzen Pro 4000G
-                                                                                                      - Ryzen 7 Pro 4700G
-                                                                                                      - Ryzen 7 Pro 4750GE
-                                                                                                      - Ryzen 5 Pro 4650G
-                                                                                                      - Ryzen 5 Pro 4650GE
-                                                                                                      - Ryzen 3 Pro 4350G
-                                                                                                      - Ryzen 3 Pro 4350GE
-
-     ``gfx942``                  ``amdgcn``   dGPU  - sramecc         - Architected                   - AMD Instinct MI300X
-                                                    - tgsplit           flat                          - AMD Instinct MI300A
-                                                    - xnack             scratch
-                                                    - kernarg preload - Packed
-                                                                        work-item
-                                                                        IDs
-
-     ``gfx950``                  ``amdgcn``   dGPU  - sramecc         - Architected                   *TBA*
-                                                    - tgsplit           flat
-                                                    - xnack             scratch                       .. TODO::
-                                                    - kernarg preload - Packed
-                                                                        work-item                       Add product
-                                                                        IDs                             names.
+     --------------------------------------------------------------------------------------------------------------------------
+     ``gfx900``                  ``amdgpu9.00``   dGPU  - xnack          - Absolute      - *rocm-amdhsa* - Radeon Vega
+                                                                           flat          - *pal-amdhsa*    Frontier Edition
+                                                                           scratch       - *pal-amdpal*  - Radeon RX Vega 56
+                                                                                                         - Radeon RX Vega 64
+                                                                                                         - Radeon RX Vega 64
+                                                                                                           Liquid
+                                                                                                         - Radeon Instinct MI25
+     ``gfx902``                  ``amdgpu9.02``   APU   - xnack          - Absolute      - *rocm-amdhsa* - Ryzen 3 2200G
+                                                                           flat          - *pal-amdhsa*  - Ryzen 5 2400G
+                                                                           scratch       - *pal-amdpal*
+     ``gfx904``                  ``amdgpu9.05``   dGPU  - xnack                          - *rocm-amdhsa* *TBA*
+                                                                                         - *pal-amdhsa*
+                                                                                         - *pal-amdpal*  .. TODO::
+                                                                                                           Add product
+                                                                                                           names.
+
+     ``gfx906``                  ``amdgpu9.06``   dGPU  - sramecc        - Absolute      - *rocm-amdhsa* - Radeon Instinct MI50
+                                                        - xnack            flat          - *pal-amdhsa*  - Radeon Instinct MI60
+                                                                           scratch       - *pal-amdpal*  - Radeon VII
+                                                                                                         - Radeon Pro VII
+     ``gfx908``                  ``amdgpu9.08``   dGPU  - sramecc                        - *rocm-amdhsa* - AMD Instinct MI100 Accelerator
+                                                        - xnack          - Absolute
+                                                                           flat
+                                                                           scratch
+     ``gfx909``                  ``amdgpu9.09``   APU   - xnack          - Absolute      - *pal-amdpal*  *TBA*
+                                                                           flat
+                                                                           scratch                       .. TODO::
+
+                                                                                                          Add product
+                                                                                                          names.
+
+     ``gfx90a``                  ``amdgpu9.0a``   dGPU  - sramecc        - Absolute      - *rocm-amdhsa* - AMD Instinct MI210 Accelerator
+                                                        - tgsplit          flat          - *rocm-amdhsa* - AMD Instinct MI250 Accelerator
+                                                        - xnack            scratch       - *rocm-amdhsa* - AMD Instinct MI250X Accelerator
+                                                        - kernarg
+                                                          preload        - Packed
+                                                          (except          work-item
+                                                          MI210)           IDs
+
+
+     ``gfx90c``                  ``amdgpu9.0c``   APU   - xnack          - Absolute      - *pal-amdpal*  - Ryzen 7 4700G
+                                                                           flat                          - Ryzen 7 4700GE
+                                                                           scratch                       - Ryzen 5 4600G
+                                                                                                         - Ryzen 5 4600GE
+                                                                                                         - Ryzen 3 4300G
+                                                                                                         - Ryzen 3 4300GE
+                                                                                                         - Ryzen Pro 4000G
+                                                                                                         - Ryzen 7 Pro 4700G
+                                                                                                         - Ryzen 7 Pro 4750GE
+                                                                                                         - Ryzen 5 Pro 4650G
+                                                                                                         - Ryzen 5 Pro 4650GE
+                                                                                                         - Ryzen 3 Pro 4350G
+                                                                                                         - Ryzen 3 Pro 4350GE
+
+     ``gfx942``                  ``amdgpu9.42``   dGPU  - sramecc        - Architected                   - AMD Instinct MI300X
+                                                        - tgsplit          flat                          - AMD Instinct MI300A
+                                                        - xnack            scratch
+                                                        - kernarg        - Packed
+                                                          preload          work-item
+                                                                           IDs
+
+     ``gfx950``                  ``amdgpu9.50``   dGPU  - sramecc        - Architected                   *TBA*
+                                                        - tgsplit          flat
+                                                        - xnack            scratch                       .. TODO::
+                                                        - kernarg        - Packed
+                                                          preload          work-item                       Add product
+                                                                           IDs                             names.
 
      **GCN GFX10.1 (RDNA 1)** [AMD-GCN-GFX10-RDNA1]_
-     -----------------------------------------------------------------------------------------------------------------------
-     ``gfx1010``                 ``amdgcn``   dGPU  - cumode          - Absolute      - *rocm-amdhsa* - Radeon Pro 5600 XT
-                                                    - wavefrontsize64   flat          - *pal-amdhsa*  - Radeon RX 5600M
-                                                    - xnack             scratch       - *pal-amdpal*  - Radeon RX 5700
-                                                                                                      - Radeon RX 5700 XT
-     ``gfx1011``                 ``amdgcn``   dGPU  - cumode                          - *rocm-amdhsa* - Radeon Pro V520
-                                                    - wavefrontsize64 - Absolute      - *pal-amdhsa*  - Radeon Pro 5600M
-                                                    - xnack             flat          - *pal-amdpal*
-                                                                        scratch
-     ``gfx1012``                 ``amdgcn``   dGPU  - cumode          - Absolute      - *rocm-amdhsa* - Radeon RX 5500
-                                                    - wavefrontsize64   flat          - *pal-amdhsa*  - Radeon RX 5500 XT
-                                                    - xnack             scratch       - *pal-amdpal*
-     ``gfx1013``                 ``amdgcn``   APU   - cumode          - Absolute      - *rocm-amdhsa* *TBA*
-                                                    - wavefrontsize64   flat          - *pal-amdhsa*
-                                                    - xnack             scratch       - *pal-amdpal*  .. TODO::
-
-                                                                                                        Add product
-                                                                                                        names.
+     --------------------------------------------------------------------------------------------------------------------------
+     ``gfx1010``                 ``amdgpu10.10`` dGPU  - cumode          - Absolute      - *rocm-amdhsa* - Radeon Pro 5600 XT
+                                                       - wavefrontsize64   flat          - *pal-amdhsa*  - Radeon RX 5600M
+                                                       - xnack             scratch       - *pal-amdpal*  - Radeon RX 5700
+                                                                                                         - Radeon RX 5700 XT
+     ``gfx1011``                 ``amdgpu10.11`` dGPU  - cumode                          - *rocm-amdhsa* - Radeon Pro V520
+                                                       - wavefrontsize64 - Absolute      - *pal-amdhsa*  - Radeon Pro 5600M
+                                                       - xnack             flat          - *pal-amdpal*
+                                                                           scratch
+     ``gfx1012``                 ``amdgpu10.12`` dGPU  - cumode          - Absolute      - *rocm-amdhsa* - Radeon RX 5500
+                                                       - wavefrontsize64   flat          - *pal-amdhsa*  - Radeon RX 5500 XT
+                                                       - xnack             scratch       - *pal-amdpal*
+     ``gfx1013``                 ``amdgpu10.13`` APU   - cumode          - Absolute      - *rocm-amdhsa* *TBA*
+                                                       - wavefrontsize64   flat          - *pal-amdhsa*
+                                                       - xnack             scratch       - *pal-amdpal*  . TODO::
+
+                                                                                                          Add product
+                                                                                                          names.
 
      **GCN GFX10.3 (RDNA 2)** [AMD-GCN-GFX10-RDNA2]_
-     -----------------------------------------------------------------------------------------------------------------------
-     ``gfx1030``                 ``amdgcn``   dGPU  - cumode          - Absolute      - *rocm-amdhsa* - Radeon RX 6800
-                                                    - wavefrontsize64   flat          - *pal-amdhsa*  - Radeon RX 6800 XT
-                                                                        scratch       - *pal-amdpal*  - Radeon RX 6900 XT
-                                                                                                      - Radeon PRO W6800
-                                                                                                      - Radeon PRO V620
-     ``gfx1031``                 ``amdgcn``   dGPU  - cumode          - Absolute      - *rocm-amdhsa* - Radeon RX 6700 XT
-                                                    - wavefrontsize64   flat          - *pal-amdhsa*
-                                                                        scratch       - *pal-amdpal*
-     ``gfx1032``                 ``amdgcn``   dGPU  - cumode          - Absolute      - *rocm-amdhsa* *TBA*
-                                                    - wavefrontsize64   flat          - *pal-amdhsa*
-                                                                        scratch       - *pal-amdpal*  .. TODO::
-
-                                                                                                        Add product
-                                                                                                        names.
-
-     ``gfx1033``                 ``amdgcn``   APU   - cumode          - Absolute      - *pal-amdpal*  *TBA*
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-
-                                                                                                        Add product
-                                                                                                        names.
-     ``gfx1034``                 ``amdgcn``   dGPU  - cumode          - Absolute      - *pal-amdpal*  *TBA*
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-
-                                                                                                        Add product
-                                                                                                        names.
-
-     ``gfx1035``                 ``amdgcn``   APU   - cumode          - Absolute      - *pal-amdpal*  *TBA*
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-                                                                                                        Add product
-                                                                                                        names.
-
-     ``gfx1036``                 ``amdgcn``   APU   - cumode          - Absolute      - *pal-amdpal*  *TBA*
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-
-                                                                                                        Add product
-                                                                                                        names.
+     --------------------------------------------------------------------------------------------------------------------------
+     ``gfx1030``                 ``amdgpu10.30`` dGPU  - cumode          - Absolute      - *rocm-amdhsa* - Radeon RX 6800
+                                                       - wavefrontsize64   flat          - *pal-amdhsa*  - Radeon RX 6800 XT
+                                                                           scratch       - *pal-amdpal*  - Radeon RX 6900 XT
+                                                                                                         - Radeon PRO W6800
+                                                                                                         - Radeon PRO V620
+     ``gfx1031``                 ``amdgpu10.31`` dGPU  - cumode          - Absolute      - *rocm-amdhsa* - Radeon RX 6700 XT
+                                                       - wavefrontsize64   flat          - *pal-amdhsa*
+                                                                           scratch       - *pal-amdpal*
+     ``gfx1032``                 ``amdgpu10.32`` dGPU  - cumode          - Absolute      - *rocm-amdhsa*  *TBA*
+                                                       - wavefrontsize64   flat          - *pal-amdhsa*
+                                                                           scratch       - *pal-amdpal*   .. TODO::
+
+                                                                                                           Add product
+                                                                                                           names.
+
+     ``gfx1033``                 ``amdgpu10.33`` APU   - cumode          - Absolute      - *pal-amdpal*   *TBA*
+                                                       - wavefrontsize64   flat
+                                                                           scratch                       . TODO::
+
+                                                                                                           Add product
+                                                                                                           names.
+     ``gfx1034``                 ``amdgpu10.34`` dGPU  - cumode          - Absolute      - *pal-amdpal*  *TBA*
+                                                       - wavefrontsize64   flat
+                                                                           scratch                       .. TODO::
+
+                                                                                                           Add product
+                                                                                                           names.
+
+     ``gfx1035``                 ``amdgpu10.35`` APU   - cumode          - Absolute      - *pal-amdpal*   *TBA*
+                                                       - wavefrontsize64   flat
+                                                                           scratch                       .. TODO::
+                                                                                                           Add product
+                                                                                                           names.
+
+     ``gfx1036``                 ``amdgpu10.36`` APU   - cumode          - Absolute      - *pal-amdpal*  *TBA*
+                                                       - wavefrontsize64   flat
+                                                                           scratch                       .. TODO::
+
+                                                                                                           Add product
+                                                                                                           names.
 
      **GCN GFX11 (RDNA 3)** [AMD-GCN-GFX11-RDNA3]_
-     -----------------------------------------------------------------------------------------------------------------------
-     ``gfx1100``                 ``amdgcn``   dGPU  - cumode          - Architected   - *pal-amdpal*  - Radeon PRO W7900 Dual Slot
-                                                    - wavefrontsize64   flat                          - Radeon PRO W7900
-                                                                        scratch                       - Radeon PRO W7800
-                                                                      - Packed                        - Radeon RX 7900 XTX
-                                                                        work-item                     - Radeon RX 7900 XT
-                                                                        IDs                           - Radeon RX 7900 GRE
-
-     ``gfx1101``                 ``amdgcn``   dGPU  - cumode          - Architected                   - Radeon RX 7800 XT
-                                                    - wavefrontsize64   flat                          - Radeon RX 7700 XT
-                                                                        scratch                       - Radeon RX 7700
-                                                                      - Packed
-                                                                        work-item
-                                                                        IDs
-
-     ``gfx1102``                 ``amdgcn``   dGPU  - cumode          - Architected                   - Radeon RX 7600 XT
-                                                    - wavefrontsize64   flat                          - Radeon RX 7600
-                                                                        scratch
-                                                                      - Packed
-                                                                        work-item
-                                                                        IDs
-
-     ``gfx1103``                 ``amdgcn``   APU   - cumode          - Architected                   *TBA*
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-                                                                      - Packed
-                                                                        work-item                       Add product
-                                                                        IDs                             names.
+     --------------------------------------------------------------------------------------------------------------------------
+     ``gfx1100``                 ``amdgpu11.00`` dGPU  - cumode          - Architected   - *pal-amdpal*  - Radeon PRO W7900 Dual Slot
+                                                       - wavefrontsize64   flat                          - Radeon PRO W7900
+                                                                           scratch                       - Radeon PRO W7800
+                                                                         - Packed                        - Radeon RX 7900 XTX
+                                                                           work-item                     - Radeon RX 7900 XT
+                                                                           IDs                           - Radeon RX 7900 GRE
+
+     ``gfx1101``                 ``amdgpu11.01`` dGPU  - cumode          - Architected                   - Radeon RX 7800 XT
+                                                       - wavefrontsize64   flat                          - Radeon RX 7700 XT
+                                                                           scratch                       - Radeon RX 7700
+                                                                         - Packed
+                                                                           work-item
+                                                                           IDs
+
+     ``gfx1102``                 ``amdgpu11.02`` dGPU  - cumode          - Architected                   - Radeon RX 7600 XT
+                                                       - wavefrontsize64   flat                          - Radeon RX 7600
+                                                                           scratch
+                                                                         - Packed
+                                                                           work-item
+                                                                           IDs
+
+     ``gfx1103``                 ``amdgpu11.03`` APU   - cumode          - Architected                   *TBA*
+                                                       - wavefrontsize64   flat
+                                                                           scratch                        .. TODO::
+                                                                         - Packed
+                                                                           work-item                        Add product
+                                                                           IDs                              names.
 
      **GCN GFX11.5 (RDNA 3.5)** [AMD-GCN-GFX11-RDNA3.5]_
-     -----------------------------------------------------------------------------------------------------------------------
-     ``gfx1150``                 ``amdgcn``   APU   - cumode          - Architected                   Radeon 890M
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-                                                                      - Packed
-                                                                        work-item                       Add product
-                                                                        IDs                             names.
-
-     ``gfx1151``                 ``amdgcn``   APU   - cumode          - Architected                   Radeon 8060S
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-                                                                      - Packed
-                                                                        work-item                       Add product
-                                                                        IDs                             names.
-
-     ``gfx1152``                 ``amdgcn``   APU   - cumode          - Architected                   Radeon 860M
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-                                                                      - Packed
-                                                                        work-item                       Add product
-                                                                        IDs                             names.
-
-     ``gfx1153``                 ``amdgcn``   APU   - cumode          - Architected                   *TBA*
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-                                                                      - Packed
-                                                                        work-item                       Add product
-                                                                        IDs                             names.
-
-     ``gfx1154``                 ``amdgcn``   APU   - cumode          - Architected                   *TBA*
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-                                                                      - Packed
-                                                                        work-item                       Add product
-                                                                        IDs                             names.
+     --------------------------------------------------------------------------------------------------------------------------
+     ``gfx1150``                 ``amdgpu11.50``  APU  - cumode          - Architected                   Radeon 890M
+                                                       - wavefrontsize64   flat
+                                                                           scratch                        .. TODO::
+                                                                         - Packed
+                                                                           work-item                        Add product
+                                                                           IDs                              names.
+
+     ``gfx1151``                 ``amdgpu11.51``  APU  - cumode          - Architected                   Radeon 8060S
+                                                       - wavefrontsize64   flat
+                                                                           scratch                       .. TODO::
+                                                                         - Packed
+                                                                           work-item                       Add product
+                                                                           IDs                             names.
+
+     ``gfx1152``                 ``amdgpu11.52``  APU  - cumode          - Architected                   Radeon 860M
+                                                       - wavefrontsize64   flat
+                                                                           scratch                       .. TODO::
+                                                                         - Packed
+                                                                           work-item                       Add product
+                                                                           IDs                             names.
+
+     ``gfx1153``                 ``amdgpu11.53`` APU   - cumode          - Architected                   *TBA*
+                                                       - wavefrontsize64   flat
+                                                                           scratch                       .. TODO::
+                                                                         - Packed
+                                                                           work-item                       Add product
+                                                                           IDs                             names.
+
+     ``gfx1154``                 ``amdgpu11.54`` APU   - cumode          - Architected                   *TBA*
+                                                       - wavefrontsize64   flat
+                                                                           scratch                       .. TODO::
+                                                                         - Packed
+                                                                           work-item                       Add product
+                                                                           IDs                             names.
 
      **GCN GFX11.7 (RDNA 4m)**
-     -----------------------------------------------------------------------------------------------------------------------
-     ``gfx1170``                 ``amdgcn``   APU   - cumode          - Architected                   *TBA*
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-                                                                      - Packed
-                                                                        work-item                       Add product
-                                                                        IDs                             names.
-
-     ``gfx1171``                 ``amdgcn``   APU   - cumode          - Architected                   *TBA*
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-                                                                      - Packed
-                                                                        work-item                       Add product
-                                                                        IDs                             names.
-
-     ``gfx1172``                 ``amdgcn``   APU   - cumode          - Architected                   *TBA*
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-                                                                      - Packed
-                                                                        work-item                       Add product
-                                                                        IDs                             names.
+     --------------------------------------------------------------------------------------------------------------------------
+     ``gfx1170``                 ``amdgpu11.70`` APU   - cumode          - Architected                   *TBA*
+                                                       - wavefrontsize64   flat
+                                                                           scratch                       .. TODO::
+                                                                         - Packed
+                                                                           work-item                       Add product
+                                                                           IDs                             names.
+
+     ``gfx1171``                 ``amdgpu11.71`` APU   - cumode          - Architected                   *TBA*
+                                                       - wavefrontsize64   flat
+                                                                           scratch                       .. TODO::
+                                                                         - Packed
+                                                                           work-item                       Add product
+                                                                           IDs                             names.
+
+     ``gfx1172``                 ``amdgpu11.72`` APU   - cumode          - Architected                   *TBA*
+                                                       - wavefrontsize64   flat
+                                                                           scratch                       .. TODO::
+                                                                         - Packed
+                                                                           work-item                      Add product
+                                                                           IDs                            names.
 
      **GCN GFX12 (RDNA 4)** [AMD-GCN-GFX12-RDNA4]_
-     -----------------------------------------------------------------------------------------------------------------------
-     ``gfx1200``                 ``amdgcn``   dGPU  - cumode          - Architected                   - Radeon RX 9060
-                                                    - wavefrontsize64   flat                          - Radeon RX 9060 XT
-                                                                        scratch
-                                                                      - Packed
-                                                                        work-item
-                                                                        IDs
-
-     ``gfx1201``                 ``amdgcn``   dGPU  - cumode          - Architected                   - Radeon RX 9070
-                                                    - wavefrontsize64   flat                          - Radeon RX 9070 XT
-                                                                        scratch                       - Radeon RX 9070 GRE
-                                                                      - Packed
-                                                                        work-item
-                                                                        IDs
-
-     ``gfx1250``                 ``amdgcn``   APU                     - Architected                   *TBA*
-                                                                        flat
-                                                                        scratch                       .. TODO::
-                                                                      - Packed
-                                                                        work-item                       Add product
-                                                                        IDs                             names.
-                                                                      - Globally
-                                                                        Accessible
-                                                                        Scratch
-                                                                      - Workgroup
-                                                                        Clusters
-
-     ``gfx1251``                 ``amdgcn``   APU                     - Architected                   *TBA*
-                                                                        flat
-                                                                        scratch                       .. TODO::
-                                                                      - Packed
-                                                                        work-item                       Add product
-                                                                        IDs                             names.
-                                                                      - Globally
-                                                                        Accessible
-                                                                        Scratch
-                                                                      - Workgroup
-                                                                        Clusters
+     --------------------------------------------------------------------------------------------------------------------------
+     ``gfx1200``                 ``amdgpu12.00``  dGPU - cumode          - Architected                   - Radeon RX 9060
+                                                       - wavefrontsize64   flat                          - Radeon RX 9060 XT
+                                                                           scratch
+                                                                         - Packed
+                                                                           work-item
+                                                                           IDs
+
+     ``gfx1201``                 ``amdgpu12.01``  dGPU - cumode          - Architected                   - Radeon RX 9070
+                                                       - wavefrontsize64   flat                          - Radeon RX 9070 XT
+                                                                           scratch                       - Radeon RX 9070 GRE
+                                                                         - Packed
+                                                                           work-item
+                                                                           IDs
+
+     ``gfx1250``                 ``amdgpu12.50``  APU                    - Architected                   *TBA*
+                                                                           flat
+                                                                           scratch                         .. TODO::
+                                                                         - Packed
+                                                                           work-item                         Add product
+                                                                           IDs                               names.
+                                                                         - Globally
+                                                                           Accessible
+                                                                           Scratch
+                                                                         - Workgroup
+                                                                           Clusters
+
+     ``gfx1251``                 ``amdgpu12.51``  APU                    - Architected                   *TBA*
+                                                                           flat
+                                                                           scratch                       .. TODO::
+                                                                         - Packed
+                                                                           work-item                       Add product
+                                                                           IDs                             names.
+                                                                         - Globally
+                                                                           Accessible
+                                                                           Scratch
+                                                                         - Workgroup
+                                                                           Clusters
 
      **GCN GFX13 (RDNA 5)**
-     -----------------------------------------------------------------------------------------------------------------------
-     ``gfx1310``                 ``amdgcn``   dGPU  - cumode          - Architected                   *TBA*
-                                                    - wavefrontsize64   flat
-                                                                        scratch                       .. TODO::
-                                                                      - Packed
-                                                                        work-item                       Add product
-                                                                        IDs                             names.
+     --------------------------------------------------------------------------------------------------------------------------
+     ``gfx1310``                 ``amdgpu13.10`` dGPU  - cumode          - Architected                   *TBA*
+                                                       - wavefrontsize64   flat
+                                                                           scratch                       .. TODO::
+                                                                         - Packed
+                                                                           work-item                       Add product
+                                                                           IDs                             names.
 
-     =========== =============== ============ ===== ================= =============== =============== ======================
+     =========== =============== =============== ===== ================= =============== =============== ======================
 
 Generic processors allow execution of a single code object on any of the processors that
-it supports. Such code objects may not perform as well as those for the non-generic processors.
+it supports. Such code objects may not perform as well as those for
+the non-generic processors.
 
-Generic processors are only available on code object V6 and above (see :ref:`amdgpu-elf-code-object`).
+Generic processors are only available on code object V6 and above (see
+:ref:`amdgpu-elf-code-object`).
 
 Generic processor code objects are versioned. See :ref:`amdgpu-generic-processor-versioning` for more information on how versioning works.
 
@@ -617,7 +737,7 @@ Generic processor code objects are versioned. See :ref:`amdgpu-generic-processor
                            Architecture
 
      ==================== ============== ================= ================== ================= =================================
-     ``gfx9-generic``     ``amdgcn``     - ``gfx900``      - xnack            - Absolute flat   - ``v_mad_mix`` instructions
+     ``gfx9-generic``     ``amdgpu9``    - ``gfx900``      - xnack            - Absolute flat   - ``v_mad_mix`` instructions
                                          - ``gfx902``                           scratch           are not available on
                                          - ``gfx904``                                             ``gfx900``, ``gfx902``,
                                          - ``gfx906``                                             ``gfx909``, ``gfx90c``
@@ -639,13 +759,13 @@ Generic processor code objects are versioned. See :ref:`amdgpu-generic-processor
                                                                                                   - ``v_dot2_f32_f16``
 
 
-     ``gfx9-4-generic``   ``amdgcn``     - ``gfx942``      - sramecc          - Architected     FP8 and BF8 instructions,
+     ``gfx9-4-generic``   ``amdgpu9.4``  - ``gfx942``      - sramecc          - Architected     FP8 and BF8 instructions,
                                          - ``gfx950``      - tgsplit            flat scratch    FP8 and BF8 conversion
                                                            - xnack            - Packed          instructions, as well as
                                                            - kernarg preload    work-item       instructions with XF32 format
                                                                                 IDs             support are not available.
 
-     ``gfx10-1-generic``  ``amdgcn``     - ``gfx1010``     - xnack            - Absolute flat   - The following instructions are
+     ``gfx10-1-generic``  ``amdgpu10.1`` - ``gfx1010``     - xnack            - Absolute flat   - The following instructions are
                                          - ``gfx1011``     - wavefrontsize64    scratch           not available on ``gfx1011``
                                          - ``gfx1012``     - cumode                               and ``gfx1012``
                                          - ``gfx1013``
@@ -664,7 +784,7 @@ Generic processor code objects are versioned. See :ref:`amdgpu-generic-processor
                                                                                                   ``gfx1013``
 
 
-     ``gfx10-3-generic``  ``amdgcn``     - ``gfx1030``     - wavefrontsize64  - Absolute flat   No restrictions.
+     ``gfx10-3-generic``  ``amdgpu10.3`` - ``gfx1030``     - wavefrontsize64  - Absolute flat   No restrictions.
                                          - ``gfx1031``     - cumode             scratch
                                          - ``gfx1032``
                                          - ``gfx1033``
@@ -673,7 +793,7 @@ Generic processor code objects are versioned. See :ref:`amdgpu-generic-processor
                                          - ``gfx1036``
 
 
-     ``gfx11-generic``    ``amdgcn``     - ``gfx1100``     - wavefrontsize64  - Architected     Various codegen pessimizations
+     ``gfx11-generic``    ``amdgpu11``   - ``gfx1100``     - wavefrontsize64  - Architected     Various codegen pessimizations
                                          - ``gfx1101``     - cumode             flat scratch    are applied to work around some
                                          - ``gfx1102``                        - Packed          hazards specific to some targets
                                          - ``gfx1103``                          work-item       within this family.
@@ -701,25 +821,25 @@ Generic processor code objects are versioned. See :ref:`amdgpu-generic-processor
                                                                                                 - ``gfx1103``
 
 
-     ``gfx11-7-generic``  ``amdgcn``     - ``gfx1170``     - wavefrontsize64  - Architected     No restrictions.
+     ``gfx11-7-generic``  ``amdgpu11.7`` - ``gfx1170``     - wavefrontsize64  - Architected     No restrictions.
                                          - ``gfx1171``     - cumode             flat scratch
                                          - ``gfx1172``                        - Packed
                                                                                 work-item
                                                                                 IDs
 
-     ``gfx12-generic``    ``amdgcn``     - ``gfx1200``     - wavefrontsize64  - Architected     No restrictions.
+     ``gfx12-generic``    ``amdgpu12``   - ``gfx1200``     - wavefrontsize64  - Architected     No restrictions.
                                          - ``gfx1201``     - cumode             flat scratch
                                                                               - Packed
                                                                                 work-item
                                                                                 IDs
 
-     ``gfx12-5-generic``  ``amdgcn``     - ``gfx1250``                        - Architected     Functionally equivalent to
+     ``gfx12-5-generic``  ``amdgpu12.5`` - ``gfx1250``                        - Architected     Functionally equivalent to
                                          - ``gfx1251``                          flat scratch    gfx1250.
                                                                               - Packed
                                                                                 work-item
                                                                                 IDs
 
-     ``gfx13-generic``    ``amdgcn``     - ``gfx1310``     - wavefrontsize64  - Architected     No restrictions.
+     ``gfx13-generic``    ``amdgpu13``   - ``gfx1310``     - wavefrontsize64  - Architected     No restrictions.
                                                            - cumode             flat scratch
                                                                               - Packed
                                                                                 work-item
diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index 3ca9f5166ad95..4548be37e7f4c 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -207,6 +207,7 @@ Makes programs 10x faster by doing Special New Thing.
 ### Changes to the AMDGPU Backend
 
 * Initial support for gfx1310
+
 * The `"amdgpu-num-sgpr"` and `"amdgpu-num-vgpr"` IR function attributes
   (generated by the Clang `amdgpu_num_sgpr` and `amdgpu_num_vgpr` attributes)
   are now deprecated. Use `"amdgpu-waves-per-eu"` instead. The backend still
@@ -219,6 +220,8 @@ Makes programs 10x faster by doing Special New Thing.
   must now set the corresponding module flag to `1` (relaxed). An absent flag is
   treated as strict by the backend.
 
+* Changed triple naming system from "amdgcn" to "amdgpu" plus a subarch suffix.
+
 ### Changes to the ARM Backend
 
 * The `r14` register can now be used as an alias for the link register `lr`
diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h
index 297cb69176a2a..6d72741c3bde0 100644
--- a/llvm/include/llvm/Object/ELFObjectFile.h
+++ b/llvm/include/llvm/Object/ELFObjectFile.h
@@ -1424,7 +1424,7 @@ template <class ELFT> Triple::ArchType ELFObjectFile<ELFT>::getArch() const {
       return Triple::r600;
     if (MACH >= ELF::EF_AMDGPU_MACH_AMDGCN_FIRST &&
         MACH <= ELF::EF_AMDGPU_MACH_AMDGCN_LAST)
-      return Triple::amdgcn;
+      return Triple::amdgpu;
 
     return Triple::UnknownArch;
   }
diff --git a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def
index 9e633e16b80dc..4b240a51a9a1f 100644
--- a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def
+++ b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def
@@ -49,7 +49,7 @@ R600_GPU      ("turks",   GK_TURKS,   FEATURE_NONE)
 #undef R600_GPU_ALIAS
 
 #ifndef AMDGCN_GPU
-#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES)
+#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)
 #endif
 
 #ifndef AMDGCN_GPU_ALIAS
@@ -57,76 +57,76 @@ R600_GPU      ("turks",   GK_TURKS,   FEATURE_NONE)
 #endif
 
 // Don't bother listing the implicitly true features
-AMDGCN_GPU      ("gfx600",    GK_GFX600,  ( 6, 0,  0), FEATURE_FAST_FMA_F32)
+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,  ( 6, 0,  1), FEATURE_NONE)
+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,  ( 6, 0,  2), FEATURE_NONE)
+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,  ( 7, 0,  0), FEATURE_NONE)
+AMDGCN_GPU      ("gfx700",    GK_GFX700, Triple::AMDGPUSubArch700,  ( 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      ("gfx701",    GK_GFX701, Triple::AMDGPUSubArch701,  ( 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      ("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,  ( 7, 0,  4), FEATURE_NONE)
+AMDGCN_GPU      ("gfx704",    GK_GFX704, Triple::AMDGPUSubArch704,  ( 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|FEATURE_XNACK_ON_OFF_MODES)
+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,  ( 8, 0,  2), FEATURE_FAST_DENORMAL_F32)
+AMDGCN_GPU      ("gfx802",    GK_GFX802, Triple::AMDGPUSubArch802,  ( 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      ("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,  ( 8, 0,  5), FEATURE_FAST_DENORMAL_F32)
+AMDGCN_GPU      ("gfx805",    GK_GFX805, Triple::AMDGPUSubArch805, ( 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|FEATURE_XNACK_ON_OFF_MODES)
+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,  ( 9, 0,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES)
-AMDGCN_GPU      ("gfx902",    GK_GFX902,  ( 9, 0,  2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES)
-AMDGCN_GPU      ("gfx904",    GK_GFX904,  ( 9, 0,  4), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES)
-AMDGCN_GPU      ("gfx906",    GK_GFX906,  ( 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,  ( 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,  ( 9, 0,  9), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES)
-AMDGCN_GPU      ("gfx90a",    GK_GFX90A,  ( 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,  ( 9, 0, 12), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_XNACK_ON_OFF_MODES)
-AMDGCN_GPU      ("gfx942",    GK_GFX942,  ( 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,  ( 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, (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, (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, (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, (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, (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      ("gfx1154",   GK_GFX1154, (11, 5,  4), 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      ("gfx1171",   GK_GFX1171, (11, 7,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
-AMDGCN_GPU      ("gfx1172",   GK_GFX1172, (11, 7,  2), 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|FEATURE_SRAMECC)
-AMDGCN_GPU      ("gfx1251",   GK_GFX1251, (12, 5,  1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_SRAMECC)
-AMDGCN_GPU      ("gfx1310",   GK_GFX1310, (13, 1,  0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+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
@@ -141,15 +141,15 @@ AMDGCN_GPU      ("gfx1310",   GK_GFX1310, (13, 1,  0), FEATURE_FAST_FMA_F32|FEAT
 //
 // 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|FEATURE_XNACK_ON_OFF_MODES)
-AMDGCN_GPU      ("gfx9-4-generic",  GK_GFX9_4_GENERIC,  ( 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, (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, (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      ("gfx11-7-generic", GK_GFX11_7_GENERIC, (11, 7, 0), 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      ("gfx12-5-generic", GK_GFX12_5_GENERIC, (12, 5, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK)
-AMDGCN_GPU      ("gfx13-generic",   GK_GFX13_GENERIC,   (13, 1, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+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)
+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 ba447dd346d80..4c1f17787e939 100644
--- a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h
+++ b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h
@@ -16,6 +16,7 @@
 #include "llvm/ADT/StringMap.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/Compiler.h"
+#include "llvm/TargetParser/Triple.h"
 #include <cstdint>
 #include <optional>
 #include <string>
@@ -35,7 +36,7 @@ enum GPUKind : uint32_t {
   GK_NONE = 0,
 
 #define R600_GPU(NAME, ENUM, FEATURES) ENUM,
-#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES) ENUM,
+#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES) ENUM,
 #include "AMDGPUTargetParser.def"
 
   GK_AMDGCN_GENERIC_FIRST = GK_GFX9_GENERIC,
@@ -47,6 +48,11 @@ struct IsaVersion {
   unsigned Major;
   unsigned Minor;
   unsigned Stepping;
+
+  bool operator==(const IsaVersion &Other) const {
+    return Major == Other.Major && Minor == Other.Minor &&
+           Stepping == Other.Stepping;
+  }
 };
 
 // This isn't comprehensive for now, just things that are needed from the
@@ -86,19 +92,59 @@ enum FeatureError : uint32_t {
 };
 
 LLVM_ABI StringRef getArchFamilyNameAMDGCN(GPUKind AK);
+LLVM_ABI Triple::SubArchType getSubArch(GPUKind AK);
+LLVM_ABI Triple::SubArchType getMajorSubArch(Triple::SubArchType SubArch);
+
+/// Return true if subarch \p A is compatible with subarch \p B, i.e. they are
+/// equal or one is the major-family subarch of the other (e.g. AMDGPUSubArch9
+/// is compatible with AMDGPUSubArch900). NoSubArch is compatible with anything.
+LLVM_ABI bool isSubArchCompatible(const Triple &A, const Triple &B);
+LLVM_ABI bool isSubArchCompatible(Triple::SubArchType A, Triple::SubArchType B);
+
+/// Return true if the GPU \p AK is usable with the triple subarch \p SubArch.
+/// A NoSubArch triple (legacy "amdgcn") accepts any GPU. Otherwise the GPU's
+/// subarch must equal \p SubArch, or \p SubArch must be the major-family
+/// subarch of the GPU (e.g. the amdgpu9 triple accepts gfx900).
+LLVM_ABI bool isCPUValidForSubArch(Triple::SubArchType SubArch, GPUKind AK);
+
+/// Convenience overload of isCPUValidForSubArch taking a GPU name \p CPU, which
+/// is parsed via parseArchAMDGCN. An unrecognized name is never valid.
+LLVM_ABI bool isCPUValidForSubArch(Triple::SubArchType SubArch, StringRef CPU);
+
+/// Returns the effective triple appropriate to use when linking \p B into \p A
+/// by merging the subarches in case of inexact match.
+///
+/// In cases where isSubArchCompatible would return / false, returns \p B. This
+/// assumes that the non-arch triple components are the same
+LLVM_ABI std::string mergeSubArch(const Triple &A, const Triple &B);
 
 LLVM_ABI StringRef getArchNameAMDGCN(GPUKind AK);
 LLVM_ABI StringRef getArchNameR600(GPUKind AK);
+
+/// Returns the canonical GPU name for an AMDGPU subarch, e.g.
+/// AMDGPUSubArch1030 -> "gfx1030", AMDGPUSubArch9 -> "gfx9-generic",
+/// AMDGPUSubArch6 -> "gfx600". Returns "" for NoSubArch or a non-AMDGPU
+/// subarch. The major-only subarches map to their generic/lowest
+/// representative, matching the default subtarget for an unspecified -mcpu.
+LLVM_ABI StringRef getArchNameFromSubArch(Triple::SubArchType SubArch);
 LLVM_ABI StringRef getCanonicalArchName(const Triple &T, StringRef Arch);
 LLVM_ABI GPUKind parseArchAMDGCN(StringRef CPU);
 LLVM_ABI GPUKind parseArchR600(StringRef CPU);
+LLVM_ABI GPUKind getGPUKindFromSubArch(Triple::SubArchType SubArch);
 LLVM_ABI unsigned getArchAttrAMDGCN(GPUKind AK);
+LLVM_ABI unsigned getArchAttrAMDGCN(Triple::SubArchType SubArch);
 LLVM_ABI unsigned getArchAttrR600(GPUKind AK);
 
-LLVM_ABI void fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values);
+/// Append the valid AMDGCN GPU names to \p Values. If \p SubArch is not
+/// NoSubArch, only GPUs compatible with that subarch (see isCPUValidForSubArch)
+/// are appended.
+LLVM_ABI void
+fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values,
+                        Triple::SubArchType SubArch = Triple::NoSubArch);
 LLVM_ABI void fillValidArchListR600(SmallVectorImpl<StringRef> &Values);
 
 LLVM_ABI IsaVersion getIsaVersion(StringRef GPU);
+LLVM_ABI IsaVersion getIsaVersion(Triple::SubArchType SubArch);
 
 /// Fills Features map with default values for given target GPU.
 /// \p Features contains overriding target features and this function returns
diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h
index 4cf54022c5c32..65eb49776023e 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -74,7 +74,7 @@ class Triple {
     ppc64,       // PPC64: powerpc64, ppu
     ppc64le,     // PPC64LE: powerpc64le
     r600,        // R600: AMD GPUs HD2XXX - HD6XXX
-    amdgcn,      // AMDGCN: AMD GCN GPUs
+    amdgpu,      // AMDGPU: AMD GCN+ GPUs
     riscv32,     // RISC-V (32-bit, little endian): riscv32
     riscv64,     // RISC-V (64-bit, little endian): riscv64
     riscv32be,   // RISC-V (32-bit, big endian): riscv32be
@@ -188,6 +188,90 @@ class Triple {
     DXILSubArch_v1_8,
     DXILSubArch_v1_9,
     LatestDXILSubArch = DXILSubArch_v1_9,
+
+    // AMDGPU sub-arch
+    AMDGPUSubArch6,
+    AMDGPUSubArch600,
+    AMDGPUSubArch601,
+    AMDGPUSubArch602,
+
+    AMDGPUSubArch7,
+    AMDGPUSubArch700,
+    AMDGPUSubArch701,
+    AMDGPUSubArch702,
+    AMDGPUSubArch703,
+    AMDGPUSubArch704,
+    AMDGPUSubArch705,
+
+    AMDGPUSubArch8,
+    AMDGPUSubArch801,
+    AMDGPUSubArch802,
+    AMDGPUSubArch803,
+    AMDGPUSubArch805,
+
+    // 810 is its own major arch.
+    AMDGPUSubArch810,
+
+    AMDGPUSubArch9,
+    AMDGPUSubArch900,
+    AMDGPUSubArch902,
+    AMDGPUSubArch904,
+    AMDGPUSubArch906,
+    AMDGPUSubArch909,
+    AMDGPUSubArch90C,
+
+    // 908 and 90a are not covered by a generic target, and are their own major
+    // subarches.
+    AMDGPUSubArch908,
+    AMDGPUSubArch90A,
+
+    AMDGPUSubArch9_4,
+    AMDGPUSubArch942,
+    AMDGPUSubArch950,
+
+    AMDGPUSubArch10_1,
+    AMDGPUSubArch1010,
+    AMDGPUSubArch1011,
+    AMDGPUSubArch1012,
+    AMDGPUSubArch1013,
+
+    AMDGPUSubArch10_3,
+    AMDGPUSubArch1030,
+    AMDGPUSubArch1031,
+    AMDGPUSubArch1032,
+    AMDGPUSubArch1033,
+    AMDGPUSubArch1034,
+    AMDGPUSubArch1035,
+    AMDGPUSubArch1036,
+
+    AMDGPUSubArch11,
+    AMDGPUSubArch1100,
+    AMDGPUSubArch1101,
+    AMDGPUSubArch1102,
+    AMDGPUSubArch1103,
+    AMDGPUSubArch1150,
+    AMDGPUSubArch1151,
+    AMDGPUSubArch1152,
+    AMDGPUSubArch1153,
+    AMDGPUSubArch1154,
+
+    AMDGPUSubArch11_7,
+    AMDGPUSubArch1170,
+    AMDGPUSubArch1171,
+    AMDGPUSubArch1172,
+
+    AMDGPUSubArch12,
+    AMDGPUSubArch1200,
+    AMDGPUSubArch1201,
+
+    AMDGPUSubArch12_5,
+    AMDGPUSubArch1250,
+    AMDGPUSubArch1251,
+
+    AMDGPUSubArch13,
+    AMDGPUSubArch1310,
+    FirstAMDGPUSubArch = AMDGPUSubArch6,
+    LastAMDGPUSubArch = AMDGPUSubArch1310
   };
   enum VendorType {
     UnknownVendor,
@@ -900,9 +984,9 @@ class Triple {
   }
 
   /// Tests whether the target is AMDGCN
-  bool isAMDGCN() const { return getArch() == Triple::amdgcn; }
+  bool isAMDGCN() const { return getArch() == Triple::amdgpu; }
 
-  bool isAMDGPU() const { return getArch() == Triple::r600 || isAMDGCN(); }
+  bool isAMDGPU() const { return isAMDGCN() || getArch() == Triple::r600; }
 
   /// Tests whether the target is Thumb (little and big endian).
   bool isThumb() const {
@@ -1335,6 +1419,11 @@ class Triple {
   /// triple.
   LLVM_ABI static ArchType parseArch(StringRef Str);
 
+  /// Parse the subarchitecture encoded in the first (architecture) field of the
+  /// triple (e.g. "amdgpu9.00" -> AMDGPUSubArch900). Returns NoSubArch if the
+  /// string does not encode a recognized subarchitecture.
+  LLVM_ABI static SubArchType parseSubArch(StringRef Str);
+
   /// @}
 
   /// Returns a canonicalized OS version number for the specified OS.
diff --git a/llvm/lib/Frontend/OpenMP/OMPContext.cpp b/llvm/lib/Frontend/OpenMP/OMPContext.cpp
index 7443c4c338ada..f2cdd9bbaf5e4 100644
--- a/llvm/lib/Frontend/OpenMP/OMPContext.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPContext.cpp
@@ -49,7 +49,7 @@ OMPContext::OMPContext(bool IsDeviceCompilation, Triple TargetTriple,
     case Triple::x86_64:
       ActiveTraits.set(unsigned(TraitProperty::target_device_kind_cpu));
       break;
-    case Triple::amdgcn:
+    case Triple::amdgpu:
     case Triple::nvptx:
     case Triple::nvptx64:
     case Triple::spirv64:
@@ -92,7 +92,7 @@ OMPContext::OMPContext(bool IsDeviceCompilation, Triple TargetTriple,
       ActiveTraits.set(unsigned(TraitProperty::device_kind_cpu));
       ActiveTraits.set(unsigned(TraitProperty::target_device_kind_cpu));
       break;
-    case Triple::amdgcn:
+    case Triple::amdgpu:
     case Triple::nvptx:
     case Triple::nvptx64:
     case Triple::spirv64:
diff --git a/llvm/lib/Object/RelocationResolver.cpp b/llvm/lib/Object/RelocationResolver.cpp
index b64df07ae7a9b..f88bb17109d99 100644
--- a/llvm/lib/Object/RelocationResolver.cpp
+++ b/llvm/lib/Object/RelocationResolver.cpp
@@ -836,7 +836,7 @@ getRelocationResolver(const ObjectFile &Obj) {
         return {supportsSystemZ, resolveSystemZ};
       case Triple::sparcv9:
         return {supportsSparc64, resolveSparc64};
-      case Triple::amdgcn:
+      case Triple::amdgpu:
         return {supportsAmdgpu, resolveAmdgpu};
       case Triple::riscv64:
       case Triple::riscv64be:
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
index 42650a66b981e..defef811615a0 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
@@ -95,6 +95,8 @@ LLVMInitializeAMDGPUAsmPrinter() {
                                      llvm::createR600AsmPrinterPass);
   TargetRegistry::RegisterAsmPrinter(getTheGCNTarget(),
                                      createAMDGPUAsmPrinterPass);
+  TargetRegistry::RegisterAsmPrinter(getTheGCNLegacyTarget(),
+                                     createAMDGPUAsmPrinterPass);
 }
 
 namespace {
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
index b07905a71b16f..4835fad9f7897 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
@@ -103,6 +103,7 @@
 #include "llvm/Passes/PassBuilder.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/FormatVariadic.h"
+#include "llvm/TargetParser/AMDGPUTargetParser.h"
 #include "llvm/Transforms/HipStdPar/HipStdPar.h"
 #include "llvm/Transforms/IPO.h"
 #include "llvm/Transforms/IPO/AlwaysInliner.h"
@@ -646,6 +647,7 @@ extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAMDGPUTarget() {
   // Register the target
   RegisterTargetMachine<R600TargetMachine> X(getTheR600Target());
   RegisterTargetMachine<GCNTargetMachine> Y(getTheGCNTarget());
+  RegisterTargetMachine<GCNTargetMachine> YLegacy(getTheGCNLegacyTarget());
 
   PassRegistry *PR = PassRegistry::getPassRegistry();
   initializeR600ClauseMergePassPass(*PR);
@@ -848,6 +850,10 @@ static StringRef getGPUOrDefault(const Triple &TT, StringRef GPU) {
   if (!GPU.empty())
     return GPU;
 
+  if (StringRef Name = AMDGPU::getArchNameFromSubArch(TT.getSubArch());
+      !Name.empty())
+    return Name;
+
   // Need to default to a target with flat support for HSA.
   if (TT.isAMDGCN())
     return TT.getOS() == Triple::AMDHSA ? "generic-hsa" : "generic";
@@ -874,6 +880,24 @@ AMDGPUTargetMachine::AMDGPUTargetMachine(const Target &T, const Triple &TT,
       TLOF(createTLOF(getTargetTriple())) {
   initAsmInfo();
   if (TT.isAMDGCN()) {
+    // Triple is missing a representation for non-empty, but unrecognized
+    // subarches. Only permit no subarch for any subtarget if it was really
+    // empty.
+    bool IsUnknownSubArch =
+        TT.getSubArch() == Triple::NoSubArch && TT.getArchName().size() != 6;
+    if (IsUnknownSubArch)
+      reportFatalUsageError("unknown subarch " + TT.getArchName());
+
+    if (TT.getSubArch() != Triple::NoSubArch) {
+      AMDGPU::GPUKind Kind = AMDGPU::parseArchAMDGCN(CPU);
+      Triple::SubArchType GPUSubArch = AMDGPU::getSubArch(Kind);
+      if (Kind != AMDGPU::GK_NONE && GPUSubArch != TT.getSubArch() &&
+          TT.getSubArch() != AMDGPU::getMajorSubArch(GPUSubArch)) {
+        reportFatalUsageError("invalid cpu '" + CPU + "' for subarch " +
+                              TT.getArchName());
+      }
+    }
+
     if (getMCSubtargetInfo().checkFeatures("+wavefrontsize64"))
       MRI.reset(llvm::createGCNMCRegisterInfo(AMDGPUDwarfFlavour::Wave64));
     else if (getMCSubtargetInfo().checkFeatures("+wavefrontsize32"))
@@ -1286,6 +1310,25 @@ GCNTargetMachine::getSubtargetImpl(const Function &F) const {
 
   auto &I = SubtargetMap[SubtargetKey];
   if (!I) {
+    AMDGPU::GPUKind Kind = AMDGPU::parseArchAMDGCN(GPU);
+    Triple::SubArchType GPUSubArch = AMDGPU::getSubArch(Kind);
+
+    // Enforce the subtarget is covered by the subarch. Tolerate no subarch for
+    // legacy compatibility.
+    const Triple &TT = M.getTargetTriple();
+    if (GPUSubArch != TT.getSubArch() && Kind != AMDGPU::GK_NONE) {
+      // Check if this is a generic subarch which has subtargets. Ignore
+      // unknown subtargets with a known subarch, since for whatever reason
+      // the convention is to just print a warning and ignore unrecognized
+      // subtargets.
+      bool IsLegacyEmptySubArch = TT.getSubArch() == Triple::NoSubArch;
+      if (!IsLegacyEmptySubArch &&
+          AMDGPU::getMajorSubArch(GPUSubArch) != TT.getSubArch()) {
+        F.getContext().emitError("invalid subtarget '" + Twine(GPU) +
+                                 "' for subarch " + TT.getArchName());
+      }
+    }
+
     I = std::make_unique<GCNSubtarget>(TargetTriple, GPU, FS, *this, BufRelaxed,
                                        TBufRelaxed);
   }
diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
index 0f70d3ab40892..9c0a5f2ec2773 100644
--- a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
+++ b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
@@ -5983,9 +5983,23 @@ bool AMDGPUAsmParser::ParseDirectiveAMDGCNTarget() {
   std::optional<AMDGPU::TargetID> MaybeParsed =
       AMDGPU::TargetID::parseTargetIDString(TargetIDDirective);
   if (!MaybeParsed)
-    return getParser().Error(TargetStart, "malformed target ID");
+    return getParser().Error(TargetStart,
+                             "malformed target id '" + TargetIDDirective + "'");
 
   const AMDGPU::TargetID &ParsedTargetID = *MaybeParsed;
+  const Triple &TT = getSTI().getTargetTriple();
+
+  // The processor named in the target id must be covered by the triple's
+  // subarch.
+  if (!AMDGPU::isCPUValidForSubArch(TT.getSubArch(),
+                                    ParsedTargetID.getGPUKind())) {
+    return getParser().Error(
+        TargetStart, "target id '" + TargetIDDirective +
+                         "' specifies a processor that is not valid for "
+                         "subarch '" +
+                         TT.getArchName() + "'");
+  }
+
   const std::optional<AMDGPU::TargetID> &CurrentTargetID =
       getTargetStreamer().getTargetID();
 
@@ -6695,9 +6709,22 @@ bool AMDGPUAsmParser::ParseDirectiveISAVersion() {
   std::optional<AMDGPU::TargetID> MaybeParsed =
       AMDGPU::TargetID::parseTargetIDString(TargetIDDirective);
   if (!MaybeParsed)
-    return Error(getParser().getTok().getLoc(), "malformed target id");
+    return Error(getParser().getTok().getLoc(),
+                 "malformed target id '" + TargetIDDirective + "'");
 
   const AMDGPU::TargetID &ParsedTargetID = *MaybeParsed;
+  const Triple &TT = getSTI().getTargetTriple();
+
+  // The processor named in the target id must be covered by the triple's
+  // subarch.
+  if (!AMDGPU::isCPUValidForSubArch(TT.getSubArch(),
+                                    ParsedTargetID.getGPUKind())) {
+    return Error(getParser().getTok().getLoc(),
+                 "target id '" + TargetIDDirective +
+                     "' specifies a processor that is not valid for subarch '" +
+                     TT.getArchName() + "'");
+  }
+
   const std::optional<AMDGPU::TargetID> &CurrentTargetID =
       getTargetStreamer().getTargetID();
 
@@ -10732,6 +10759,7 @@ extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void
 LLVMInitializeAMDGPUAsmParser() {
   RegisterMCAsmParser<AMDGPUAsmParser> A(getTheR600Target());
   RegisterMCAsmParser<AMDGPUAsmParser> B(getTheGCNTarget());
+  RegisterMCAsmParser<AMDGPUAsmParser> C(getTheGCNLegacyTarget());
 }
 
 #define GET_MATCHER_IMPLEMENTATION
diff --git a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp
index dab340053e689..1322aac689800 100644
--- a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp
+++ b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp
@@ -3033,4 +3033,8 @@ LLVMInitializeAMDGPUDisassembler() {
                                          createAMDGPUDisassembler);
   TargetRegistry::RegisterMCSymbolizer(getTheGCNTarget(),
                                        createAMDGPUSymbolizer);
+  TargetRegistry::RegisterMCDisassembler(getTheGCNLegacyTarget(),
+                                         createAMDGPUDisassembler);
+  TargetRegistry::RegisterMCSymbolizer(getTheGCNLegacyTarget(),
+                                       createAMDGPUSymbolizer);
 }
diff --git a/llvm/lib/Target/AMDGPU/GCNSubtarget.cpp b/llvm/lib/Target/AMDGPU/GCNSubtarget.cpp
index 6d2e6568da2ad..03ead5b978d6c 100644
--- a/llvm/lib/Target/AMDGPU/GCNSubtarget.cpp
+++ b/llvm/lib/Target/AMDGPU/GCNSubtarget.cpp
@@ -26,6 +26,7 @@
 #include "llvm/CodeGen/TargetFrameLowering.h"
 #include "llvm/IR/DiagnosticInfo.h"
 #include "llvm/IR/MDBuilder.h"
+#include "llvm/TargetParser/AMDGPUTargetParser.h"
 #include <algorithm>
 
 using namespace llvm;
@@ -54,6 +55,42 @@ static cl::opt<unsigned>
 
 GCNSubtarget::~GCNSubtarget() = default;
 
+static AMDGPUSubtarget::Generation computeDefaultGeneration(const Triple &TT) {
+  // Legacy triples without a subarch default to the first target that supports
+  // flat addressing for HSA, otherwise the first amdgcn target.
+  if (TT.getSubArch() == Triple::NoSubArch)
+    return TT.getOS() == Triple::AMDHSA ? AMDGPUSubtarget::SEA_ISLANDS
+                                        : AMDGPUSubtarget::SOUTHERN_ISLANDS;
+
+  switch (AMDGPU::getMajorSubArch(TT.getSubArch())) {
+  case Triple::AMDGPUSubArch6:
+    return AMDGPUSubtarget::SOUTHERN_ISLANDS;
+  case Triple::AMDGPUSubArch7:
+    return AMDGPUSubtarget::SEA_ISLANDS;
+  case Triple::AMDGPUSubArch8:
+  case Triple::AMDGPUSubArch810:
+    return AMDGPUSubtarget::VOLCANIC_ISLANDS;
+  case Triple::AMDGPUSubArch9:
+  case Triple::AMDGPUSubArch908:
+  case Triple::AMDGPUSubArch90A:
+  case Triple::AMDGPUSubArch9_4:
+    return AMDGPUSubtarget::GFX9;
+  case Triple::AMDGPUSubArch10_1:
+  case Triple::AMDGPUSubArch10_3:
+    return AMDGPUSubtarget::GFX10;
+  case Triple::AMDGPUSubArch11:
+  case Triple::AMDGPUSubArch11_7:
+    return AMDGPUSubtarget::GFX11;
+  case Triple::AMDGPUSubArch12:
+  case Triple::AMDGPUSubArch12_5:
+    return AMDGPUSubtarget::GFX12;
+  case Triple::AMDGPUSubArch13:
+    return AMDGPUSubtarget::GFX13;
+  default:
+    reportFatalUsageError("invalid subarch for amdgpu");
+  }
+}
+
 GCNSubtarget &GCNSubtarget::initializeSubtargetDependencies(const Triple &TT,
                                                             StringRef GPU,
                                                             StringRef FS) {
@@ -94,8 +131,7 @@ GCNSubtarget &GCNSubtarget::initializeSubtargetDependencies(const Triple &TT,
   // the first amdgcn target that supports flat addressing. Other OSes defaults
   // to the first amdgcn target.
   if (Gen == AMDGPUSubtarget::INVALID) {
-    Gen = TT.getOS() == Triple::AMDHSA ? AMDGPUSubtarget::SEA_ISLANDS
-                                       : AMDGPUSubtarget::SOUTHERN_ISLANDS;
+    Gen = computeDefaultGeneration(TT);
     // Assume wave64 for the unknown target, if not explicitly set.
     if (getWavefrontSizeLog2() == 0)
       WavefrontSizeLog2 = 6;
@@ -177,6 +213,8 @@ void GCNSubtarget::checkSubtargetFeatures(const Function &F) const {
   }
 }
 
+// TODO: Validate subarch for subtarget
+
 GCNSubtarget::GCNSubtarget(const Triple &TT, StringRef GPU, StringRef FS,
                            const GCNTargetMachine &TM, bool BufferOOBRelaxed,
                            bool TBufferOOBRelaxed)
@@ -192,6 +230,7 @@ GCNSubtarget::GCNSubtarget(const Triple &TT, StringRef GPU, StringRef FS,
     // Frame index expansion sometimes assumes the low bit of SP is 0
     FrameLowering(TargetFrameLowering::StackGrowsUp, getStackAlignment(), 0,
                   /*TransAl=*/Align(4)) {
+
   // clang-format on
   MaxWavesPerEU = AMDGPU::IsaInfo::getMaxWavesPerEU(*this);
   EUsPerCU = AMDGPU::IsaInfo::getEUsPerCU(*this);
diff --git a/llvm/lib/Target/AMDGPU/MCA/AMDGPUCustomBehaviour.cpp b/llvm/lib/Target/AMDGPU/MCA/AMDGPUCustomBehaviour.cpp
index ba7f215f2c563..264270a00a106 100644
--- a/llvm/lib/Target/AMDGPU/MCA/AMDGPUCustomBehaviour.cpp
+++ b/llvm/lib/Target/AMDGPU/MCA/AMDGPUCustomBehaviour.cpp
@@ -352,4 +352,9 @@ LLVMInitializeAMDGPUTargetMCA() {
                                           createAMDGPUCustomBehaviour);
   TargetRegistry::RegisterInstrPostProcess(getTheGCNTarget(),
                                            createAMDGPUInstrPostProcess);
+
+  TargetRegistry::RegisterCustomBehaviour(getTheGCNLegacyTarget(),
+                                          createAMDGPUCustomBehaviour);
+  TargetRegistry::RegisterInstrPostProcess(getTheGCNLegacyTarget(),
+                                           createAMDGPUInstrPostProcess);
 }
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCTargetDesc.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCTargetDesc.cpp
index 4b0cca29b2660..641b77c150aad 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCTargetDesc.cpp
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCTargetDesc.cpp
@@ -79,8 +79,12 @@ createAMDGPUMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
   if (TT.getArch() == Triple::r600)
     return createR600MCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);
 
-  MCSubtargetInfo *STI =
-      createAMDGPUMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);
+  StringRef ResolvedCPU = CPU;
+  if (ResolvedCPU.empty())
+    ResolvedCPU = AMDGPU::getArchNameFromSubArch(TT.getSubArch());
+
+  MCSubtargetInfo *STI = createAMDGPUMCSubtargetInfoImpl(
+      TT, ResolvedCPU, /*TuneCPU*/ ResolvedCPU, FS);
 
   bool IsWave64 = STI->hasFeature(AMDGPU::FeatureWavefrontSize64);
   bool IsWave32 = STI->hasFeature(AMDGPU::FeatureWavefrontSize32);
@@ -191,9 +195,12 @@ extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void
 LLVMInitializeAMDGPUTargetMC() {
 
   TargetRegistry::RegisterMCInstrInfo(getTheGCNTarget(), createAMDGPUMCInstrInfo);
+  TargetRegistry::RegisterMCInstrInfo(getTheGCNLegacyTarget(),
+                                      createAMDGPUMCInstrInfo);
   TargetRegistry::RegisterMCInstrInfo(getTheR600Target(),
                                       createR600MCInstrInfo);
-  for (Target *T : {&getTheR600Target(), &getTheGCNTarget()}) {
+  for (Target *T :
+       {&getTheR600Target(), &getTheGCNTarget(), &getTheGCNLegacyTarget()}) {
     RegisterMCAsmInfo<AMDGPUMCAsmInfo> X(*T);
 
     TargetRegistry::RegisterMCRegInfo(*T, createAMDGPUMCRegisterInfo);
@@ -211,13 +218,14 @@ LLVMInitializeAMDGPUTargetMC() {
       getTheR600Target(), createAMDGPUObjectTargetStreamer);
 
   // GCN specific registration
-  TargetRegistry::RegisterMCCodeEmitter(getTheGCNTarget(),
-                                        createAMDGPUMCCodeEmitter);
-
-  TargetRegistry::RegisterAsmTargetStreamer(getTheGCNTarget(),
-                                            createAMDGPUAsmTargetStreamer);
-  TargetRegistry::RegisterObjectTargetStreamer(
-      getTheGCNTarget(), createAMDGPUObjectTargetStreamer);
-  TargetRegistry::RegisterNullTargetStreamer(getTheGCNTarget(),
-                                             createAMDGPUNullTargetStreamer);
+  for (Target *T : {&getTheGCNTarget(), &getTheGCNLegacyTarget()}) {
+    TargetRegistry::RegisterMCCodeEmitter(*T, createAMDGPUMCCodeEmitter);
+
+    TargetRegistry::RegisterAsmTargetStreamer(*T,
+                                              createAMDGPUAsmTargetStreamer);
+    TargetRegistry::RegisterObjectTargetStreamer(
+        *T, createAMDGPUObjectTargetStreamer);
+    TargetRegistry::RegisterNullTargetStreamer(*T,
+                                               createAMDGPUNullTargetStreamer);
+  }
 }
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
index 97bcec66fe318..d70ad37cca867 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
@@ -840,7 +840,7 @@ unsigned AMDGPUTargetELFStreamer::getEFlags() {
     llvm_unreachable("Unsupported Arch");
   case Triple::r600:
     return getEFlagsR600();
-  case Triple::amdgcn:
+  case Triple::amdgpu:
     return getEFlagsAMDGCN();
   }
 }
diff --git a/llvm/lib/Target/AMDGPU/TargetInfo/AMDGPUTargetInfo.cpp b/llvm/lib/Target/AMDGPU/TargetInfo/AMDGPUTargetInfo.cpp
index ad547556cf150..6174b6d79b678 100644
--- a/llvm/lib/Target/AMDGPU/TargetInfo/AMDGPUTargetInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/TargetInfo/AMDGPUTargetInfo.cpp
@@ -28,11 +28,27 @@ Target &llvm::getTheGCNTarget() {
   return TheGCNTarget;
 }
 
+/// The target for GCN GPUs, registered under the legacy "amdgcn" name. This
+/// should be removed when all tool users of "amdgcn" are migrated.
+Target &llvm::getTheGCNLegacyTarget() {
+  static Target TheGCNLegacyTarget;
+  return TheGCNLegacyTarget;
+}
+
 /// Extern function to initialize the targets for the AMDGPU backend
 extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void
 LLVMInitializeAMDGPUTargetInfo() {
   RegisterTarget<Triple::r600, false> R600(getTheR600Target(), "r600",
                                            "AMD GPUs HD2XXX-HD6XXX", "AMDGPU");
-  RegisterTarget<Triple::amdgcn, false> GCN(getTheGCNTarget(), "amdgcn",
-                                            "AMD GCN GPUs", "AMDGPU");
+  Target &GCNTgt = getTheGCNTarget();
+  RegisterTarget<Triple::amdgpu, false> GCN(GCNTgt, "amdgpu", "AMDGPU gfx6+",
+                                            "AMDGPU");
+
+  // Register the legacy "amdgcn" name for use with -march. It must not take
+  // possession of the Triple::amdgpu tag, so it uses a match function that
+  // never matches a triple. This hack is copied from AArch64's handling of
+  // "arm64".
+  TargetRegistry::RegisterTarget(getTheGCNLegacyTarget(), "amdgcn",
+                                 "legacy name for amdgpu", "AMDGPU",
+                                 [](Triple::ArchType) { return false; });
 }
diff --git a/llvm/lib/Target/AMDGPU/TargetInfo/AMDGPUTargetInfo.h b/llvm/lib/Target/AMDGPU/TargetInfo/AMDGPUTargetInfo.h
index 45470167a3313..313619da8fbaf 100644
--- a/llvm/lib/Target/AMDGPU/TargetInfo/AMDGPUTargetInfo.h
+++ b/llvm/lib/Target/AMDGPU/TargetInfo/AMDGPUTargetInfo.h
@@ -23,6 +23,10 @@ Target &getTheR600Target();
 /// The target for GCN GPUs.
 Target &getTheGCNTarget();
 
+/// The target for GCN GPUs, registered under the legacy "amdgcn" architecture
+/// name for use with -march. This is an alias for the target returned by
+/// getTheGCNTarget() and does not participate in target-triple based lookup.
+Target &getTheGCNLegacyTarget();
 }
 
 #endif // LLVM_LIB_TARGET_AMDGPU_TARGETINFO_AMDGPUTARGETINFO_H
diff --git a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp
index 08047c8250e45..bf169c5b5ef42 100644
--- a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp
+++ b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp
@@ -34,9 +34,159 @@ StringRef llvm::AMDGPU::getArchFamilyNameAMDGCN(GPUKind AK) {
   return ArchName.empty() ? "" : ArchName.drop_back(2);
 }
 
+Triple::SubArchType llvm::AMDGPU::getSubArch(GPUKind AK) {
+  switch (AK) {
+#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
+  case ENUM:                                                                   \
+    return SUBARCH;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+  default:
+    return Triple::SubArchType::NoSubArch;
+  }
+}
+
+AMDGPU::GPUKind
+llvm::AMDGPU::getGPUKindFromSubArch(Triple::SubArchType SubArch) {
+  switch (SubArch) {
+#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
+  case SUBARCH:                                                                \
+    return ENUM;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+  default:
+    return GK_NONE;
+  }
+}
+
+static const Triple::SubArchType
+    AMDGPUMajorFamilies[Triple::LastAMDGPUSubArch - Triple::FirstAMDGPUSubArch +
+                        1] = {
+        Triple::AMDGPUSubArch6,    Triple::AMDGPUSubArch6,
+        Triple::AMDGPUSubArch6,    Triple::AMDGPUSubArch6,
+
+        Triple::AMDGPUSubArch7,    Triple::AMDGPUSubArch7,
+        Triple::AMDGPUSubArch7,    Triple::AMDGPUSubArch7,
+        Triple::AMDGPUSubArch7,    Triple::AMDGPUSubArch7,
+        Triple::AMDGPUSubArch7,
+
+        Triple::AMDGPUSubArch8,    Triple::AMDGPUSubArch8,
+        Triple::AMDGPUSubArch8,    Triple::AMDGPUSubArch8,
+        Triple::AMDGPUSubArch8,
+
+        Triple::AMDGPUSubArch810,
+
+        Triple::AMDGPUSubArch9,    Triple::AMDGPUSubArch9,
+        Triple::AMDGPUSubArch9,    Triple::AMDGPUSubArch9,
+        Triple::AMDGPUSubArch9,    Triple::AMDGPUSubArch9,
+        Triple::AMDGPUSubArch9,
+
+        Triple::AMDGPUSubArch908,  Triple::AMDGPUSubArch90A,
+
+        Triple::AMDGPUSubArch9_4,  Triple::AMDGPUSubArch9_4,
+        Triple::AMDGPUSubArch9_4,
+
+        Triple::AMDGPUSubArch10_1, Triple::AMDGPUSubArch10_1,
+        Triple::AMDGPUSubArch10_1, Triple::AMDGPUSubArch10_1,
+        Triple::AMDGPUSubArch10_1,
+
+        Triple::AMDGPUSubArch10_3, Triple::AMDGPUSubArch10_3,
+        Triple::AMDGPUSubArch10_3, Triple::AMDGPUSubArch10_3,
+        Triple::AMDGPUSubArch10_3, Triple::AMDGPUSubArch10_3,
+        Triple::AMDGPUSubArch10_3, Triple::AMDGPUSubArch10_3,
+
+        Triple::AMDGPUSubArch11,   Triple::AMDGPUSubArch11,
+        Triple::AMDGPUSubArch11,   Triple::AMDGPUSubArch11,
+        Triple::AMDGPUSubArch11,   Triple::AMDGPUSubArch11,
+        Triple::AMDGPUSubArch11,   Triple::AMDGPUSubArch11,
+        Triple::AMDGPUSubArch11,   Triple::AMDGPUSubArch11,
+
+        Triple::AMDGPUSubArch11_7, Triple::AMDGPUSubArch11_7,
+        Triple::AMDGPUSubArch11_7, Triple::AMDGPUSubArch11_7,
+
+        Triple::AMDGPUSubArch12,   Triple::AMDGPUSubArch12,
+        Triple::AMDGPUSubArch12,
+
+        Triple::AMDGPUSubArch12_5, Triple::AMDGPUSubArch12_5,
+        Triple::AMDGPUSubArch12_5,
+
+        Triple::AMDGPUSubArch13,   Triple::AMDGPUSubArch13};
+
+Triple::SubArchType AMDGPU::getMajorSubArch(Triple::SubArchType X) {
+  if (X < Triple::FirstAMDGPUSubArch || X > Triple::LastAMDGPUSubArch)
+    return Triple::NoSubArch;
+  return AMDGPUMajorFamilies[X - Triple::FirstAMDGPUSubArch];
+}
+
+bool AMDGPU::isSubArchCompatible(Triple::SubArchType A, Triple::SubArchType B) {
+  if (A == B || A == Triple::NoSubArch || B == Triple::NoSubArch)
+    return true;
+
+  Triple::SubArchType MajorA = AMDGPU::getMajorSubArch(A);
+  Triple::SubArchType MajorB = AMDGPU::getMajorSubArch(B);
+
+  // One side is the major-family subarch covering the other's family.
+  if (A == MajorA)
+    return MajorA == MajorB;
+  if (B == MajorB)
+    return MajorA == MajorB;
+
+  return false;
+}
+
+bool AMDGPU::isCPUValidForSubArch(Triple::SubArchType SubArch, GPUKind AK) {
+  // An unrecognized GPU is never valid.
+  if (AK == GK_NONE)
+    return false;
+  // A legacy triple without a subarch accepts any known GPU.
+  if (SubArch == Triple::NoSubArch)
+    return true;
+  return isSubArchCompatible(getSubArch(AK), SubArch);
+}
+
+bool AMDGPU::isCPUValidForSubArch(Triple::SubArchType SubArch, StringRef CPU) {
+  return isCPUValidForSubArch(SubArch, parseArchAMDGCN(CPU));
+}
+
+bool AMDGPU::isSubArchCompatible(const Triple &A, const Triple &B) {
+  // Tolerate subarch mismatch if one entry is none. This is a hack for bitcode
+  // libraries.
+  // There's a missing enum entry for an unknown subarch. Make sure the
+  // subarch is really empty.
+  if (A.getSubArch() == Triple::NoSubArch)
+    return A.getArchName().size() == 6;
+
+  if (B.getSubArch() == Triple::NoSubArch)
+    return B.getArchName().size() == 6;
+
+  return isSubArchCompatible(A.getSubArch(), B.getSubArch());
+}
+
+std::string AMDGPU::mergeSubArch(const Triple &A, const Triple &B) {
+  if (A.getSubArch() == Triple::NoSubArch)
+    return B.str();
+  if (B.getSubArch() == Triple::NoSubArch)
+    return A.str();
+
+  Triple::SubArchType MajorA = AMDGPU::getMajorSubArch(A.getSubArch());
+  Triple::SubArchType MajorB = AMDGPU::getMajorSubArch(B.getSubArch());
+
+  // With a compatible major arch, return the specific subarch.
+  if (A.getSubArch() == MajorA) {
+    if (MajorA == MajorB)
+      return B.str();
+  }
+
+  if (B.getSubArch() == MajorB) {
+    if (MajorA == MajorB)
+      return A.str();
+  }
+
+  // Invalid case.
+  return B.str();
+}
+
 StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) {
   switch (AK) {
-#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES)                           \
+#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
   case ENUM:                                                                   \
     return NAME;
 #include "llvm/TargetParser/AMDGPUTargetParser.def"
@@ -45,6 +195,51 @@ StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) {
   }
 }
 
+// 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];
+}
+
 StringRef llvm::AMDGPU::getArchNameR600(GPUKind AK) {
   switch (AK) {
 #define R600_GPU(NAME, ENUM, FEATURES)                                         \
@@ -58,7 +253,7 @@ StringRef llvm::AMDGPU::getArchNameR600(GPUKind AK) {
 
 AMDGPU::GPUKind llvm::AMDGPU::parseArchAMDGCN(StringRef CPU) {
   return StringSwitch<AMDGPU::GPUKind>(CPU)
-#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES) .Case(NAME, ENUM)
+#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"
       .Case("generic", AMDGPU::GPUKind::GK_GFX600)
@@ -76,7 +271,7 @@ AMDGPU::GPUKind llvm::AMDGPU::parseArchR600(StringRef CPU) {
 
 unsigned AMDGPU::getArchAttrAMDGCN(GPUKind AK) {
   switch (AK) {
-#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES)                           \
+#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
   case ENUM:                                                                   \
     return FEATURES;
 #include "llvm/TargetParser/AMDGPUTargetParser.def"
@@ -85,6 +280,17 @@ unsigned AMDGPU::getArchAttrAMDGCN(GPUKind AK) {
   }
 }
 
+unsigned AMDGPU::getArchAttrAMDGCN(Triple::SubArchType SubArch) {
+  switch (SubArch) {
+#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
+  case SUBARCH:                                                                \
+    return FEATURES;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+  default:
+    return FEATURE_NONE;
+  }
+}
+
 unsigned AMDGPU::getArchAttrR600(GPUKind AK) {
   switch (AK) {
 #define R600_GPU(NAME, ENUM, FEATURES)                                         \
@@ -96,13 +302,17 @@ unsigned AMDGPU::getArchAttrR600(GPUKind AK) {
   }
 }
 
-void AMDGPU::fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values) {
+void AMDGPU::fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values,
+                                     Triple::SubArchType SubArch) {
   // XXX: Should this only report unique canonical names?
-  Values.append({
-#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES) NAME,
-#define AMDGCN_GPU_ALIAS(NAME, ENUM) NAME,
+  // An alias shares its GPU's GPUKind, so it is filtered alongside it.
+#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
+  if (isCPUValidForSubArch(SubArch, ENUM))                                     \
+    Values.push_back(NAME);
+#define AMDGCN_GPU_ALIAS(NAME, ENUM)                                           \
+  if (isCPUValidForSubArch(SubArch, ENUM))                                     \
+    Values.push_back(NAME);
 #include "llvm/TargetParser/AMDGPUTargetParser.def"
-  });
 }
 
 void AMDGPU::fillValidArchListR600(SmallVectorImpl<StringRef> &Values) {
@@ -125,7 +335,7 @@ AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) {
 
   switch (AK) {
 #define MAKE_ISAVERSION(A, B, C) {A, B, C}
-#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES)                           \
+#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)                  \
   case ENUM:                                                                   \
     return MAKE_ISAVERSION ISAVERSION;
 #include "llvm/TargetParser/AMDGPUTargetParser.def"
@@ -135,6 +345,19 @@ 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)                  \
+  case SUBARCH:                                                                \
+    return MAKE_ISAVERSION ISAVERSION;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+#undef MAKE_ISAVERSION
+  default:
+    return {0, 0, 0};
+  }
+}
+
 StringRef AMDGPU::getCanonicalArchName(const Triple &T, StringRef Arch) {
   assert(T.isAMDGPU());
   auto ProcKind = T.isAMDGCN() ? parseArchAMDGCN(Arch) : parseArchR600(Arch);
@@ -726,10 +949,17 @@ TargetID::parseTargetIDString(StringRef TargetIDDirective) {
 
   StringRef CPUName = FeatureSplit[0];
 
-  // Determine xnack/sramecc support based on the architecture attributes
-  GPUKind Arch = parseArchAMDGCN(CPUName);
+  // Prefer the explicitly named processor so the parsed target id reflects it
+  // (e.g. for validation against the triple subarch). The processor field may
+  // be empty when the ISA is already encoded in the triple's subarch
+  // (e.g. "amdgpu12.50-amd-amdhsa-unknown-"), in which case derive the arch
+  // from the subarch.
+  GPUKind Arch = CPUName.empty() ? getGPUKindFromSubArch(TT.getSubArch())
+                                 : parseArchAMDGCN(CPUName);
+
   unsigned ArchAttr = getArchAttrAMDGCN(Arch);
 
+  // Determine xnack/sramecc support based on the architecture attributes.
   TargetIDSetting XnackSetting = (ArchAttr & FEATURE_XNACK)
                                      ? TargetIDSetting::Any
                                      : TargetIDSetting::Unsupported;
diff --git a/llvm/lib/TargetParser/TargetDataLayout.cpp b/llvm/lib/TargetParser/TargetDataLayout.cpp
index cab9d7792c787..18f0c13907e52 100644
--- a/llvm/lib/TargetParser/TargetDataLayout.cpp
+++ b/llvm/lib/TargetParser/TargetDataLayout.cpp
@@ -597,8 +597,8 @@ std::string Triple::computeDataLayout(StringRef ABIName) const {
   case Triple::ppc64:
   case Triple::ppc64le:
     return computePowerDataLayout(*this, ABIName);
+  case Triple::amdgpu:
   case Triple::r600:
-  case Triple::amdgcn:
     return computeAMDDataLayout(*this);
   case Triple::riscv32:
   case Triple::riscv64:
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index 603227e891d4b..6884d43549c71 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -14,9 +14,11 @@
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/SwapByteOrder.h"
 #include "llvm/Support/VersionTuple.h"
+#include "llvm/TargetParser/AMDGPUTargetParser.h"
 #include "llvm/TargetParser/ARMTargetParser.h"
 #include "llvm/TargetParser/ARMTargetParserCommon.h"
 #include "llvm/TargetParser/Host.h"
+#include "llvm/TargetParser/TargetParser.h"
 #include <cassert>
 #include <cstring>
 using namespace llvm;
@@ -44,8 +46,8 @@ StringRef Triple::getArchTypeName(ArchType Kind) {
     return "aarch64_32";
   case aarch64_be:
     return "aarch64_be";
-  case amdgcn:
-    return "amdgcn";
+  case amdgpu:
+    return "amdgpu";
   case amdil64:
     return "amdil64";
   case amdil:
@@ -240,6 +242,51 @@ StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) {
       break;
     }
     break;
+  case Triple::amdgpu: {
+    if (SubArch < Triple::FirstAMDGPUSubArch ||
+        SubArch > Triple::LastAMDGPUSubArch)
+      break;
+
+    static const StringLiteral AMDGPUSubArchNames[Triple::LastAMDGPUSubArch -
+                                                  Triple::FirstAMDGPUSubArch +
+                                                  1] = {
+        "amdgpu6",     "amdgpu6.00",  "amdgpu6.01",  "amdgpu6.02",
+
+        "amdgpu7",     "amdgpu7.00",  "amdgpu7.01",  "amdgpu7.02",
+        "amdgpu7.03",  "amdgpu7.04",  "amdgpu7.05",
+
+        "amdgpu8",     "amdgpu8.01",  "amdgpu8.02",  "amdgpu8.03",
+        "amdgpu8.05",
+
+        "amdgpu8.10",
+
+        "amdgpu9",     "amdgpu9.00",  "amdgpu9.02",  "amdgpu9.04",
+        "amdgpu9.06",  "amdgpu9.09",  "amdgpu9.0c",
+
+        "amdgpu9.08",  "amdgpu9.0a",
+
+        "amdgpu9.4",   "amdgpu9.42",  "amdgpu9.50",
+
+        "amdgpu10.1",  "amdgpu10.10", "amdgpu10.11", "amdgpu10.12",
+        "amdgpu10.13",
+
+        "amdgpu10.3",  "amdgpu10.30", "amdgpu10.31", "amdgpu10.32",
+        "amdgpu10.33", "amdgpu10.34", "amdgpu10.35", "amdgpu10.36",
+
+        "amdgpu11",    "amdgpu11.00", "amdgpu11.01", "amdgpu11.02",
+        "amdgpu11.03", "amdgpu11.50", "amdgpu11.51", "amdgpu11.52",
+        "amdgpu11.53", "amdgpu11.54",
+
+        "amdgpu11.7",  "amdgpu11.70", "amdgpu11.71", "amdgpu11.72",
+
+        "amdgpu12",    "amdgpu12.00", "amdgpu12.01",
+
+        "amdgpu12.5",  "amdgpu12.50", "amdgpu12.51",
+
+        "amdgpu13",    "amdgpu13.10"};
+
+    return AMDGPUSubArchNames[SubArch - Triple::FirstAMDGPUSubArch];
+  }
   default:
     break;
   }
@@ -286,7 +333,8 @@ StringRef Triple::getArchTypePrefix(ArchType Kind) {
   case hexagon:
     return "hexagon";
 
-  case amdgcn:
+  // Intrinsics use amdgcn prefix.
+  case amdgpu:
     return "amdgcn";
   case r600:
     return "r600";
@@ -693,8 +741,9 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
       .Case("ppc32le", ppcle)
       .Case("ppcle", ppcle)
       .Case("ppc64le", ppc64le)
+      .Case("amdgpu", amdgpu)
+      .Case("amdgcn", amdgpu) // Legacy name
       .Case("r600", r600)
-      .Case("amdgcn", amdgcn)
       .Case("riscv32", riscv32)
       .Case("riscv64", riscv64)
       .Case("riscv32be", riscv32be)
@@ -845,8 +894,9 @@ Triple::ArchType Triple::parseArch(StringRef ArchName) {
           .Cases({"mips64el", "mipsn32el", "mipsisa64r6el", "mips64r6el",
                   "mipsn32r6el"},
                  Triple::mips64el)
+          .StartsWith("amdgpu", Triple::amdgpu)
+          .Case("amdgcn", Triple::amdgpu)
           .Case("r600", Triple::r600)
-          .Case("amdgcn", Triple::amdgcn)
           .Case("riscv32", Triple::riscv32)
           .Case("riscv64", Triple::riscv64)
           .Case("riscv32be", Triple::riscv32be)
@@ -1055,7 +1105,7 @@ static Triple::ObjectFormatType parseFormat(StringRef EnvironmentName) {
       .Default(Triple::UnknownObjectFormat);
 }
 
-static Triple::SubArchType parseSubArch(StringRef SubArchName) {
+Triple::SubArchType Triple::parseSubArch(StringRef SubArchName) {
   if (SubArchName.starts_with("mips") &&
       (SubArchName.ends_with("r6el") || SubArchName.ends_with("r6")))
     return Triple::MipsSubArch_r6;
@@ -1097,6 +1147,77 @@ static Triple::SubArchType parseSubArch(StringRef SubArchName) {
         .EndsWith("v1.9", Triple::DXILSubArch_v1_9)
         .Default(Triple::NoSubArch);
 
+  if (SubArchName.consume_front("amdgpu")) {
+    return StringSwitch<Triple::SubArchType>(SubArchName)
+        .Case("6", Triple::AMDGPUSubArch6)
+        .Case("6.00", Triple::AMDGPUSubArch600)
+        .Case("6.01", Triple::AMDGPUSubArch601)
+        .Case("6.02", Triple::AMDGPUSubArch602)
+        .Case("7", Triple::AMDGPUSubArch7)
+        .Case("7.00", Triple::AMDGPUSubArch700)
+        .Case("7.01", Triple::AMDGPUSubArch701)
+        .Case("7.02", Triple::AMDGPUSubArch702)
+        .Case("7.03", Triple::AMDGPUSubArch703)
+        .Case("7.04", Triple::AMDGPUSubArch704)
+        .Case("7.05", Triple::AMDGPUSubArch705)
+        .Case("8", Triple::AMDGPUSubArch8)
+        .Case("8.01", Triple::AMDGPUSubArch801)
+        .Case("8.02", Triple::AMDGPUSubArch802)
+        .Case("8.03", Triple::AMDGPUSubArch803)
+        .Case("8.05", Triple::AMDGPUSubArch805)
+        .Case("8.10", Triple::AMDGPUSubArch810)
+        .Case("9", Triple::AMDGPUSubArch9)
+        .Case("9.00", Triple::AMDGPUSubArch900)
+        .Case("9.02", Triple::AMDGPUSubArch902)
+        .Case("9.04", Triple::AMDGPUSubArch904)
+        .Case("9.06", Triple::AMDGPUSubArch906)
+        .Case("9.08", Triple::AMDGPUSubArch908)
+        .Case("9.09", Triple::AMDGPUSubArch909)
+        .Case("9.0a", Triple::AMDGPUSubArch90A)
+        .Case("9.0c", Triple::AMDGPUSubArch90C)
+        .Case("9.4", Triple::AMDGPUSubArch9_4)
+        .Case("9.5", Triple::AMDGPUSubArch9_4)
+        .Case("9.42", Triple::AMDGPUSubArch942)
+        .Case("9.50", Triple::AMDGPUSubArch950)
+        .Case("10", Triple::AMDGPUSubArch10_1)
+        .Case("10.1", Triple::AMDGPUSubArch10_1)
+        .Case("10.10", Triple::AMDGPUSubArch1010)
+        .Case("10.11", Triple::AMDGPUSubArch1011)
+        .Case("10.12", Triple::AMDGPUSubArch1012)
+        .Case("10.13", Triple::AMDGPUSubArch1013)
+        .Case("10.3", Triple::AMDGPUSubArch10_3)
+        .Case("10.30", Triple::AMDGPUSubArch1030)
+        .Case("10.31", Triple::AMDGPUSubArch1031)
+        .Case("10.32", Triple::AMDGPUSubArch1032)
+        .Case("10.33", Triple::AMDGPUSubArch1033)
+        .Case("10.34", Triple::AMDGPUSubArch1034)
+        .Case("10.35", Triple::AMDGPUSubArch1035)
+        .Case("10.36", Triple::AMDGPUSubArch1036)
+        .Case("11", Triple::AMDGPUSubArch11)
+        .Case("11.00", Triple::AMDGPUSubArch1100)
+        .Case("11.01", Triple::AMDGPUSubArch1101)
+        .Case("11.02", Triple::AMDGPUSubArch1102)
+        .Case("11.03", Triple::AMDGPUSubArch1103)
+        .Case("11.50", Triple::AMDGPUSubArch1150)
+        .Case("11.51", Triple::AMDGPUSubArch1151)
+        .Case("11.52", Triple::AMDGPUSubArch1152)
+        .Case("11.53", Triple::AMDGPUSubArch1153)
+        .Case("11.54", Triple::AMDGPUSubArch1154)
+        .Case("11.7", Triple::AMDGPUSubArch11_7)
+        .Case("11.70", Triple::AMDGPUSubArch1170)
+        .Case("11.71", Triple::AMDGPUSubArch1171)
+        .Case("11.72", Triple::AMDGPUSubArch1172)
+        .Case("12", Triple::AMDGPUSubArch12)
+        .Case("12.00", Triple::AMDGPUSubArch1200)
+        .Case("12.01", Triple::AMDGPUSubArch1201)
+        .Case("12.5", Triple::AMDGPUSubArch12_5)
+        .Case("12.50", Triple::AMDGPUSubArch1250)
+        .Case("12.51", Triple::AMDGPUSubArch1251)
+        .Case("13", Triple::AMDGPUSubArch13)
+        .Case("13.10", Triple::AMDGPUSubArch1310)
+        .Default(Triple::NoSubArch);
+  }
+
   StringRef ARMSubArch = ARM::getCanonicalArchName(SubArchName);
 
   // For now, this is the small part. Early return.
@@ -1209,7 +1330,7 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
       return T.isOSDarwin() ? Triple::MachO : Triple::ELF;
     }
   case Triple::aarch64_be:
-  case Triple::amdgcn:
+  case Triple::amdgpu:
   case Triple::amdil64:
   case Triple::amdil:
   case Triple::arc:
@@ -2024,7 +2145,7 @@ unsigned Triple::getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
 
   case llvm::Triple::aarch64:
   case llvm::Triple::aarch64_be:
-  case llvm::Triple::amdgcn:
+  case llvm::Triple::amdgpu:
   case llvm::Triple::amdil64:
   case llvm::Triple::bpfeb:
   case llvm::Triple::bpfel:
@@ -2086,7 +2207,7 @@ Triple Triple::get32BitArchVariant() const {
   Triple T(*this);
   switch (getArch()) {
   case Triple::UnknownArch:
-  case Triple::amdgcn:
+  case Triple::amdgpu:
   case Triple::avr:
   case Triple::bpfeb:
   case Triple::bpfel:
@@ -2220,7 +2341,7 @@ Triple Triple::get64BitArchVariant() const {
 
   case Triple::aarch64:
   case Triple::aarch64_be:
-  case Triple::amdgcn:
+  case Triple::amdgpu:
   case Triple::amdil64:
   case Triple::bpfeb:
   case Triple::bpfel:
@@ -2323,7 +2444,7 @@ Triple Triple::getBigEndianArchVariant() const {
     return T;
   switch (getArch()) {
   case Triple::UnknownArch:
-  case Triple::amdgcn:
+  case Triple::amdgpu:
   case Triple::amdil64:
   case Triple::amdil:
   case Triple::avr:
@@ -2458,7 +2579,7 @@ bool Triple::isLittleEndian() const {
   switch (getArch()) {
   case Triple::aarch64:
   case Triple::aarch64_32:
-  case Triple::amdgcn:
+  case Triple::amdgpu:
   case Triple::amdil64:
   case Triple::amdil:
   case Triple::arm:
@@ -2538,6 +2659,14 @@ bool Triple::isCompatibleWith(const Triple &Other) const {
              getObjectFormat() == Other.getObjectFormat();
   }
 
+  if (getArch() == Triple::amdgpu && Other.getArch() == Triple::amdgpu) {
+    if (getOS() != Other.getOS() || getVendor() != Other.getVendor() ||
+        getEnvironment() != Other.getEnvironment() ||
+        getObjectFormat() != Other.getObjectFormat())
+      return false;
+    return AMDGPU::isSubArchCompatible(*this, Other);
+  }
+
   // If vendor is apple, ignore the version number (the environment field)
   // and the object format.
   if (getVendor() == Triple::Apple)
@@ -2554,9 +2683,12 @@ bool Triple::isCompatibleWith(const Triple &Other) const {
 
 std::string Triple::merge(const Triple &Other) const {
   // If vendor is apple, pick the triple with the larger version number.
-  if (getVendor() == Triple::Apple)
-    if (Other.isOSVersionLT(*this))
-      return str();
+  if (getVendor() == Triple::Apple && Other.isOSVersionLT(*this))
+    return str();
+
+  if (isAMDGCN() && Other.isAMDGCN() && getOS() == Other.getOS() &&
+      getVendor() == Other.getVendor())
+    return AMDGPU::mergeSubArch(*this, Other);
 
   return Other.str();
 }
diff --git a/llvm/lib/Transforms/IPO/ExpandVariadics.cpp b/llvm/lib/Transforms/IPO/ExpandVariadics.cpp
index 2996657bc693a..4a45e8d5137a4 100644
--- a/llvm/lib/Transforms/IPO/ExpandVariadics.cpp
+++ b/llvm/lib/Transforms/IPO/ExpandVariadics.cpp
@@ -1121,8 +1121,8 @@ struct Wasm final : public VariadicABIInfo {
 
 std::unique_ptr<VariadicABIInfo> VariadicABIInfo::create(const Triple &T) {
   switch (T.getArch()) {
-  case Triple::r600:
-  case Triple::amdgcn: {
+  case Triple::amdgpu:
+  case Triple::r600: {
     return std::make_unique<Amdgpu>();
   }
 
diff --git a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
index 012ea3aad490d..e36b05564ff1c 100644
--- a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
+++ b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
@@ -292,7 +292,7 @@ struct OMPInformationCache : public InformationCache {
     switch (T.getArch()) {
     case llvm::Triple::nvptx:
     case llvm::Triple::nvptx64:
-    case llvm::Triple::amdgcn:
+    case llvm::Triple::amdgpu:
       assert(OMPBuilder.Config.IsTargetDevice &&
              "OpenMP AMDGPU/NVPTX is only prepared to deal with device code.");
       OMPBuilder.Config.IsGPU = true;
diff --git a/llvm/lib/Transforms/Utils/CodeExtractor.cpp b/llvm/lib/Transforms/Utils/CodeExtractor.cpp
index 975294ab00f73..4c33848dacf51 100644
--- a/llvm/lib/Transforms/Utils/CodeExtractor.cpp
+++ b/llvm/lib/Transforms/Utils/CodeExtractor.cpp
@@ -246,7 +246,7 @@ buildExtractionBlockSet(ArrayRef<BasicBlock *> BBs, DominatorTree *DT,
 /// for specified target preserves original alignment
 static bool isAlignmentPreservedForAddrCast(const Triple &TargetTriple) {
   switch (TargetTriple.getArch()) {
-  case Triple::ArchType::amdgcn:
+  case Triple::ArchType::amdgpu:
   case Triple::ArchType::r600:
     return true;
   // TODO: Add other architectures for which we are certain that alignment
diff --git a/llvm/test/CodeGen/AMDGPU/amdgpu-triple.ll b/llvm/test/CodeGen/AMDGPU/amdgpu-triple.ll
new file mode 100644
index 0000000000000..f7187fb03f072
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/amdgpu-triple.ll
@@ -0,0 +1,78 @@
+; RUN: llc -mtriple=amdgpu6-amd-amdhsa < %s | FileCheck -check-prefixes=GFX6 %s
+; RUN: llc -mtriple=amdgpu6-amd-amdhsa -mcpu=gfx601 < %s | FileCheck -check-prefixes=GFX601 %s
+
+; RUN: llc -mtriple=amdgpu7-amd-amdhsa < %s | FileCheck -check-prefixes=GFX7 %s
+; RUN: llc -mtriple=amdgpu7-amd-amdhsa -mcpu=gfx701 < %s | FileCheck -check-prefixes=GFX701 %s
+
+; RUN: llc -mtriple=amdgpu8-amd-amdhsa < %s | FileCheck -check-prefixes=GFX8 %s
+; RUN: llc -mtriple=amdgpu8-amd-amdhsa -mcpu=gfx803 < %s | FileCheck -check-prefixes=GFX803 %s
+
+; RUN: llc -mtriple=amdgpu9-amd-amdhsa < %s | FileCheck -check-prefixes=GFX9 %s
+; RUN: llc -mtriple=amdgpu9.08-amd-amdhsa -mcpu=gfx908 < %s | FileCheck -check-prefixes=GFX908 %s
+
+; RUN: llc -mtriple=amdgpu9.4-amd-amdhsa < %s | FileCheck -check-prefixes=GFX94 %s
+; RUN: llc -mtriple=amdgpu9.4-amd-amdhsa -mcpu=gfx942 < %s | FileCheck -check-prefixes=GFX942 %s
+
+; RUN: llc -mtriple=amdgpu10-amd-amdhsa < %s | FileCheck -check-prefixes=GFX10 %s
+; RUN: llc -mtriple=amdgpu10.1-amd-amdhsa < %s | FileCheck -check-prefixes=GFX10_1 %s
+
+; RUN: llc -mtriple=amdgpu10.1-amd-amdhsa -mcpu=gfx1012 < %s | FileCheck -check-prefixes=GFX1012 %s
+
+; RUN: llc -mtriple=amdgpu10.3-amd-amdhsa < %s | FileCheck -check-prefixes=GFX10_3 %s
+; RUN: llc -mtriple=amdgpu10.3-amd-amdhsa -mcpu=gfx1031 < %s | FileCheck -check-prefixes=GFX1031 %s
+
+; RUN: llc -mtriple=amdgpu11-amd-amdhsa < %s | FileCheck -check-prefixes=GFX11 %s
+; RUN: llc -mtriple=amdgpu11-amd-amdhsa -mcpu=gfx1101 < %s | FileCheck -check-prefixes=GFX1101 %s
+
+; RUN: llc -mtriple=amdgpu11.7-amd-amdhsa < %s | FileCheck -check-prefixes=GFX117 %s
+; RUN: llc -mtriple=amdgpu11.7-amd-amdhsa -mcpu=gfx1170 < %s | FileCheck -check-prefixes=GFX1170 %s
+
+; RUN: llc -mtriple=amdgpu12-amd-amdhsa < %s | FileCheck -check-prefixes=GFX12 %s
+; RUN: llc -mtriple=amdgpu12-amd-amdhsa -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GFX1200 %s
+
+; RUN: llc -mtriple=amdgpu12.5-amd-amdhsa < %s | FileCheck -check-prefixes=GFX125 %s
+; RUN: llc -mtriple=amdgpu12.5-amd-amdhsa -mcpu=gfx1250 < %s | FileCheck -check-prefixes=GFX1250 %s
+
+; RUN: llc -mtriple=amdgpu13-amd-amdhsa < %s | FileCheck -check-prefixes=GFX13 %s
+; RUN: llc -mtriple=amdgpu13-amd-amdhsa -mcpu=gfx1310 < %s | FileCheck -check-prefixes=GFX1310 %s
+
+; GFX6: .amdgcn_target "amdgpu6-amd-amdhsa-unknown-gfx600"
+; GFX601: .amdgcn_target "amdgpu6-amd-amdhsa-unknown-gfx601"
+
+; GFX7: .amdgcn_target "amdgpu7-amd-amdhsa-unknown-gfx700"
+; GFX701: .amdgcn_target "amdgpu7-amd-amdhsa-unknown-gfx701"
+
+; GFX8: .amdgcn_target "amdgpu8-amd-amdhsa-unknown-gfx801"
+; GFX803: .amdgcn_target "amdgpu8-amd-amdhsa-unknown-gfx803"
+
+; GFX9: .amdgcn_target "amdgpu9-amd-amdhsa-unknown-gfx9-generic"
+; GFX908: .amdgcn_target "amdgpu9.08-amd-amdhsa-unknown-gfx908"
+
+; GFX94: .amdgcn_target "amdgpu9.4-amd-amdhsa-unknown-gfx9-4-generic"
+; GFX942: .amdgcn_target "amdgpu9.4-amd-amdhsa-unknown-gfx942"
+
+; FIXME: Normalize this
+; GFX10: .amdgcn_target "amdgpu10-amd-amdhsa-unknown-gfx10-1-generic"
+; GFX10_1: .amdgcn_target "amdgpu10.1-amd-amdhsa-unknown-gfx10-1-generic"
+; GFX1012: .amdgcn_target "amdgpu10.1-amd-amdhsa-unknown-gfx1012"
+
+; GFX10_3: .amdgcn_target "amdgpu10.3-amd-amdhsa-unknown-gfx10-3-generic"
+; GFX1031: .amdgcn_target "amdgpu10.3-amd-amdhsa-unknown-gfx1031"
+
+; GFX11: .amdgcn_target "amdgpu11-amd-amdhsa-unknown-gfx11-generic"
+; GFX1101: .amdgcn_target "amdgpu11-amd-amdhsa-unknown-gfx1101"
+
+; GFX117: .amdgcn_target "amdgpu11.7-amd-amdhsa-unknown-gfx11-7-generic"
+; GFX1170: .amdgcn_target "amdgpu11.7-amd-amdhsa-unknown-gfx1170"
+
+; GFX12: .amdgcn_target "amdgpu12-amd-amdhsa-unknown-gfx12-generic"
+; GFX1200: .amdgcn_target "amdgpu12-amd-amdhsa-unknown-gfx1200"
+
+; GFX125: .amdgcn_target "amdgpu12.5-amd-amdhsa-unknown-gfx12-5-generic"
+; GFX1250: .amdgcn_target "amdgpu12.5-amd-amdhsa-unknown-gfx1250"
+
+; GFX13: .amdgcn_target "amdgpu13-amd-amdhsa-unknown-gfx13-generic"
+; GFX1310: .amdgcn_target "amdgpu13-amd-amdhsa-unknown-gfx1310"
+define amdgpu_kernel void @kernel() {
+  ret void
+}
diff --git a/llvm/test/CodeGen/AMDGPU/elf-header-flags-mach.ll b/llvm/test/CodeGen/AMDGPU/elf-header-flags-mach.ll
index bcc8e96cedd6e..a5ba17d3c644c 100644
--- a/llvm/test/CodeGen/AMDGPU/elf-header-flags-mach.ll
+++ b/llvm/test/CodeGen/AMDGPU/elf-header-flags-mach.ll
@@ -103,7 +103,7 @@
 ; ARCH-R600: AddressSize: 32bit
 
 ; ARCH-GCN: Format: elf64-amdgpu
-; ARCH-GCN: Arch: amdgcn
+; ARCH-GCN: Arch: amdgpu
 ; ARCH-GCN: AddressSize: 64bit
 
 ; ALL:         Flags [
diff --git a/llvm/test/CodeGen/AMDGPU/loop-prefetch.ll b/llvm/test/CodeGen/AMDGPU/loop-prefetch.ll
index 595a78ca0c08c..88a5fec54cbdb 100644
--- a/llvm/test/CodeGen/AMDGPU/loop-prefetch.ll
+++ b/llvm/test/CodeGen/AMDGPU/loop-prefetch.ll
@@ -1,5 +1,5 @@
 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1030 -asm-verbose=0 < %s | FileCheck --check-prefixes=GCN,GFX10,GFX10-ASM %s
-; RUN: llc -mtriple=amdgcn -mcpu=gfx1030 < %s -filetype=obj | llvm-objdump -d --arch-name=amdgcn --mcpu=gfx1030 --symbolize-operands - | FileCheck --check-prefixes=GCN,GFX10,GFX10-DIS %s
+; RUN: llc -mtriple=amdgcn -mcpu=gfx1030 < %s -filetype=obj | llvm-objdump -d --arch-name=amdgpu --mcpu=gfx1030 --symbolize-operands - | FileCheck --check-prefixes=GCN,GFX10,GFX10-DIS %s
 ; RUN: llc -mtriple=amdgcn -mcpu=tonga < %s | FileCheck --check-prefix=GFX8 %s
 
 ; GFX8-NOT: s_inst_prefetch
diff --git a/llvm/test/CodeGen/AMDGPU/march-amdgcn-legacy-arch-name.ll b/llvm/test/CodeGen/AMDGPU/march-amdgcn-legacy-arch-name.ll
new file mode 100644
index 0000000000000..a2110c861128b
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/march-amdgcn-legacy-arch-name.ll
@@ -0,0 +1,10 @@
+; The architecture name was renamed from "amdgcn" to "amdgpu". Check that the
+; legacy "amdgcn" name still works when passed via -march.
+
+; RUN: llc -march=amdgcn -mcpu=gfx900 < %s | FileCheck %s
+
+; CHECK: f:
+; CHECK: s_setpc_b64
+define void @f() {
+  ret void
+}
diff --git a/llvm/test/CodeGen/AMDGPU/target-id-from-triple.ll b/llvm/test/CodeGen/AMDGPU/target-id-from-triple.ll
new file mode 100644
index 0000000000000..ed1ecc844993f
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/target-id-from-triple.ll
@@ -0,0 +1,177 @@
+; RUN: llc -mtriple=amdgpu6-amd-amdhsa < %s | FileCheck -check-prefix=GFX6 %s
+; RUN: llc -mtriple=amdgpu6.00-amd-amdhsa < %s | FileCheck -check-prefix=GFX600 %s
+; RUN: llc -mtriple=amdgpu6.01-amd-amdhsa < %s | FileCheck -check-prefix=GFX601 %s
+; RUN: llc -mtriple=amdgpu6.02-amd-amdhsa < %s | FileCheck -check-prefix=GFX602 %s
+
+; RUN: llc -mtriple=amdgpu7-amd-amdhsa < %s | FileCheck -check-prefix=GFX7 %s
+; RUN: llc -mtriple=amdgpu7.00-amd-amdhsa < %s | FileCheck -check-prefix=GFX700 %s
+; RUN: llc -mtriple=amdgpu7.01-amd-amdhsa < %s | FileCheck -check-prefix=GFX701 %s
+; RUN: llc -mtriple=amdgpu7.02-amd-amdhsa < %s | FileCheck -check-prefix=GFX702 %s
+; RUN: llc -mtriple=amdgpu7.03-amd-amdhsa < %s | FileCheck -check-prefix=GFX703 %s
+; RUN: llc -mtriple=amdgpu7.04-amd-amdhsa < %s | FileCheck -check-prefix=GFX704 %s
+; RUN: llc -mtriple=amdgpu7.05-amd-amdhsa < %s | FileCheck -check-prefix=GFX705 %s
+
+; RUN: llc -mtriple=amdgpu8.01-amd-amdhsa < %s | FileCheck -check-prefix=GFX801 %s
+; RUN: llc -mtriple=amdgpu8.02-amd-amdhsa < %s | FileCheck -check-prefix=GFX802 %s
+; RUN: llc -mtriple=amdgpu8.03-amd-amdhsa < %s | FileCheck -check-prefix=GFX803 %s
+; RUN: llc -mtriple=amdgpu8.05-amd-amdhsa < %s | FileCheck -check-prefix=GFX805 %s
+; RUN: llc -mtriple=amdgpu8.10-amd-amdhsa < %s | FileCheck -check-prefix=GFX810 %s
+
+; RUN: llc -mtriple=amdgpu9-amd-amdhsa < %s | FileCheck -check-prefix=GFX9 %s
+; RUN: llc -mtriple=amdgpu9.00-amd-amdhsa < %s | FileCheck -check-prefix=GFX900 %s
+; RUN: llc -mtriple=amdgpu9.02-amd-amdhsa < %s | FileCheck -check-prefix=GFX902 %s
+; RUN: llc -mtriple=amdgpu9.04-amd-amdhsa < %s | FileCheck -check-prefix=GFX904 %s
+; RUN: llc -mtriple=amdgpu9.06-amd-amdhsa < %s | FileCheck -check-prefix=GFX906 %s
+; RUN: llc -mtriple=amdgpu9.08-amd-amdhsa < %s | FileCheck -check-prefix=GFX908 %s
+; RUN: llc -mtriple=amdgpu9.09-amd-amdhsa < %s | FileCheck -check-prefix=GFX909 %s
+; RUN: llc -mtriple=amdgpu9.0a-amd-amdhsa < %s | FileCheck -check-prefix=GFX90A %s
+; RUN: llc -mtriple=amdgpu9.0c-amd-amdhsa < %s | FileCheck -check-prefix=GFX90C %s
+; RUN: llc -mtriple=amdgpu9.4-amd-amdhsa < %s | FileCheck -check-prefix=GFX94 %s
+; RUN: llc -mtriple=amdgpu9.42-amd-amdhsa < %s | FileCheck -check-prefix=GFX942 %s
+; RUN: llc -mtriple=amdgpu9.50-amd-amdhsa < %s | FileCheck -check-prefix=GFX950 %s
+
+; RUN: llc -mtriple=amdgpu10.1-amd-amdhsa < %s | FileCheck -check-prefix=GFX101 %s
+; RUN: llc -mtriple=amdgpu10.10-amd-amdhsa < %s | FileCheck -check-prefix=GFX1010 %s
+; RUN: llc -mtriple=amdgpu10.11-amd-amdhsa < %s | FileCheck -check-prefix=GFX1011 %s
+; RUN: llc -mtriple=amdgpu10.12-amd-amdhsa < %s | FileCheck -check-prefix=GFX1012 %s
+; RUN: llc -mtriple=amdgpu10.13-amd-amdhsa < %s | FileCheck -check-prefix=GFX1013 %s
+
+; RUN: llc -mtriple=amdgpu10.3-amd-amdhsa < %s | FileCheck -check-prefix=GFX103 %s
+; RUN: llc -mtriple=amdgpu10.30-amd-amdhsa < %s | FileCheck -check-prefix=GFX1030 %s
+; RUN: llc -mtriple=amdgpu10.31-amd-amdhsa < %s | FileCheck -check-prefix=GFX1031 %s
+; RUN: llc -mtriple=amdgpu10.32-amd-amdhsa < %s | FileCheck -check-prefix=GFX1032 %s
+; RUN: llc -mtriple=amdgpu10.33-amd-amdhsa < %s | FileCheck -check-prefix=GFX1033 %s
+; RUN: llc -mtriple=amdgpu10.34-amd-amdhsa < %s | FileCheck -check-prefix=GFX1034 %s
+; RUN: llc -mtriple=amdgpu10.35-amd-amdhsa < %s | FileCheck -check-prefix=GFX1035 %s
+; RUN: llc -mtriple=amdgpu10.36-amd-amdhsa < %s | FileCheck -check-prefix=GFX1036 %s
+
+; RUN: llc -mtriple=amdgpu11-amd-amdhsa < %s | FileCheck -check-prefix=GFX11 %s
+; RUN: llc -mtriple=amdgpu11.00-amd-amdhsa < %s | FileCheck -check-prefix=GFX1100 %s
+; RUN: llc -mtriple=amdgpu11.01-amd-amdhsa < %s | FileCheck -check-prefix=GFX1101 %s
+; RUN: llc -mtriple=amdgpu11.02-amd-amdhsa < %s | FileCheck -check-prefix=GFX1102 %s
+; RUN: llc -mtriple=amdgpu11.03-amd-amdhsa < %s | FileCheck -check-prefix=GFX1103 %s
+; RUN: llc -mtriple=amdgpu11.50-amd-amdhsa < %s | FileCheck -check-prefix=GFX1150 %s
+; RUN: llc -mtriple=amdgpu11.51-amd-amdhsa < %s | FileCheck -check-prefix=GFX1151 %s
+; RUN: llc -mtriple=amdgpu11.52-amd-amdhsa < %s | FileCheck -check-prefix=GFX1152 %s
+; RUN: llc -mtriple=amdgpu11.53-amd-amdhsa < %s | FileCheck -check-prefix=GFX1153 %s
+; RUN: llc -mtriple=amdgpu11.54-amd-amdhsa < %s | FileCheck -check-prefix=GFX1154 %s
+; RUN: llc -mtriple=amdgpu11.7-amd-amdhsa < %s | FileCheck -check-prefix=GFX11_7 %s
+; RUN: llc -mtriple=amdgpu11.70-amd-amdhsa < %s | FileCheck -check-prefix=GFX1170 %s
+; RUN: llc -mtriple=amdgpu11.71-amd-amdhsa < %s | FileCheck -check-prefix=GFX1171 %s
+; RUN: llc -mtriple=amdgpu11.72-amd-amdhsa < %s | FileCheck -check-prefix=GFX1172 %s
+
+; RUN: llc -mtriple=amdgpu12-amd-amdhsa < %s | FileCheck -check-prefix=GFX12 %s
+; RUN: llc -mtriple=amdgpu12.00-amd-amdhsa < %s | FileCheck -check-prefix=GFX1200 %s
+; RUN: llc -mtriple=amdgpu12.01-amd-amdhsa < %s | FileCheck -check-prefix=GFX1201 %s
+
+; RUN: llc -mtriple=amdgpu12.5-amd-amdhsa < %s | FileCheck -check-prefix=GFX12_5 %s
+; RUN: llc -mtriple=amdgpu12.50-amd-amdhsa < %s | FileCheck -check-prefix=GFX1250 %s
+; RUN: llc -mtriple=amdgpu12.51-amd-amdhsa < %s | FileCheck -check-prefix=GFX1251 %s
+
+; RUN: llc -mtriple=amdgpu13-amd-amdhsa < %s | FileCheck -check-prefix=GFX13 %s
+; RUN: llc -mtriple=amdgpu13.10-amd-amdhsa < %s | FileCheck -check-prefix=GFX1310 %s
+
+; A major-family subarch combined with a more specific (valid) -mcpu keeps
+; the specific processor rather than the subarch's generic/default one.
+; RUN: llc -mtriple=amdgpu6-amd-amdhsa -mcpu=gfx602 < %s | FileCheck -check-prefix=MAJOR-GFX602 %s
+; RUN: llc -mtriple=amdgpu8-amd-amdhsa -mcpu=gfx803 < %s | FileCheck -check-prefix=MAJOR-GFX803 %s
+; RUN: llc -mtriple=amdgpu9-amd-amdhsa -mcpu=gfx906 < %s | FileCheck -check-prefix=MAJOR-GFX906 %s
+; RUN: llc -mtriple=amdgpu12-amd-amdhsa -mcpu=gfx1201 < %s | FileCheck -check-prefix=MAJOR-GFX1201 %s
+
+; MAJOR-GFX602: .amdgcn_target "amdgpu6-amd-amdhsa-unknown-gfx602"
+; MAJOR-GFX803: .amdgcn_target "amdgpu8-amd-amdhsa-unknown-gfx803"
+; MAJOR-GFX906: .amdgcn_target "amdgpu9-amd-amdhsa-unknown-gfx906"
+; MAJOR-GFX1201: .amdgcn_target "amdgpu12-amd-amdhsa-unknown-gfx1201"
+
+; An unrecognized -mcpu is ignored. The resulting target ID has an
+; empty processor field.
+; RUN: llc -mtriple=amdgpu6.00-amd-amdhsa -mcpu=invalid < %s | FileCheck -check-prefix=INVALID-CPU-GFX6 %s
+; RUN: llc -mtriple=amdgpu9-amd-amdhsa -mcpu=invalid < %s | FileCheck -check-prefix=INVALID-CPU-GFX9 %s
+; RUN: llc -mtriple=amdgpu12.50-amd-amdhsa -mcpu=invalid < %s | FileCheck -check-prefix=INVALID-CPU-GFX1250 %s
+
+; INVALID-CPU-GFX6: .amdgcn_target "amdgpu6.00-amd-amdhsa-unknown-"
+; INVALID-CPU-GFX9: .amdgcn_target "amdgpu9-amd-amdhsa-unknown-"
+; INVALID-CPU-GFX1250: .amdgcn_target "amdgpu12.50-amd-amdhsa-unknown-"
+
+; GFX6: .amdgcn_target "amdgpu6-amd-amdhsa-unknown-gfx600"
+; GFX600: .amdgcn_target "amdgpu6.00-amd-amdhsa-unknown-gfx600"
+; GFX601: .amdgcn_target "amdgpu6.01-amd-amdhsa-unknown-gfx601"
+; GFX602: .amdgcn_target "amdgpu6.02-amd-amdhsa-unknown-gfx602"
+
+; GFX7: .amdgcn_target "amdgpu7-amd-amdhsa-unknown-gfx700"
+; GFX700: .amdgcn_target "amdgpu7.00-amd-amdhsa-unknown-gfx700"
+; GFX701: .amdgcn_target "amdgpu7.01-amd-amdhsa-unknown-gfx701"
+; GFX702: .amdgcn_target "amdgpu7.02-amd-amdhsa-unknown-gfx702"
+; GFX703: .amdgcn_target "amdgpu7.03-amd-amdhsa-unknown-gfx703"
+; GFX704: .amdgcn_target "amdgpu7.04-amd-amdhsa-unknown-gfx704"
+; GFX705: .amdgcn_target "amdgpu7.05-amd-amdhsa-unknown-gfx705"
+
+; GFX8: .amdgcn_target "amdgpu8-amd-amdhsa-unknown-gfx800"
+; GFX801: .amdgcn_target "amdgpu8.01-amd-amdhsa-unknown-gfx801"
+; GFX802: .amdgcn_target "amdgpu8.02-amd-amdhsa-unknown-gfx802"
+; GFX803: .amdgcn_target "amdgpu8.03-amd-amdhsa-unknown-gfx803"
+; GFX805: .amdgcn_target "amdgpu8.05-amd-amdhsa-unknown-gfx805"
+
+; GFX810: .amdgcn_target "amdgpu8.10-amd-amdhsa-unknown-gfx810"
+
+; GFX9: .amdgcn_target "amdgpu9-amd-amdhsa-unknown-gfx9-generic"
+; GFX900: .amdgcn_target "amdgpu9.00-amd-amdhsa-unknown-gfx900"
+; GFX902: .amdgcn_target "amdgpu9.02-amd-amdhsa-unknown-gfx902"
+; GFX904: .amdgcn_target "amdgpu9.04-amd-amdhsa-unknown-gfx904"
+; GFX906: .amdgcn_target "amdgpu9.06-amd-amdhsa-unknown-gfx906"
+; GFX908: .amdgcn_target "amdgpu9.08-amd-amdhsa-unknown-gfx908"
+; GFX909: .amdgcn_target "amdgpu9.09-amd-amdhsa-unknown-gfx909"
+; GFX90A: .amdgcn_target "amdgpu9.0a-amd-amdhsa-unknown-gfx90a"
+; GFX90C: .amdgcn_target "amdgpu9.0c-amd-amdhsa-unknown-gfx90c"
+
+; GFX94: .amdgcn_target "amdgpu9.4-amd-amdhsa-unknown-gfx9-4-generic"
+; GFX942: .amdgcn_target "amdgpu9.42-amd-amdhsa-unknown-gfx942"
+; GFX950: .amdgcn_target "amdgpu9.50-amd-amdhsa-unknown-gfx950"
+
+; GFX101: .amdgcn_target "amdgpu10.1-amd-amdhsa-unknown-gfx10-1-generic"
+; GFX1010: .amdgcn_target "amdgpu10.10-amd-amdhsa-unknown-gfx1010"
+; GFX1011: .amdgcn_target "amdgpu10.11-amd-amdhsa-unknown-gfx1011"
+; GFX1012: .amdgcn_target "amdgpu10.12-amd-amdhsa-unknown-gfx1012"
+; GFX1013: .amdgcn_target "amdgpu10.13-amd-amdhsa-unknown-gfx1013"
+
+
+; GFX103: .amdgcn_target "amdgpu10.3-amd-amdhsa-unknown-gfx10-3-generic"
+; GFX1030: .amdgcn_target "amdgpu10.30-amd-amdhsa-unknown-gfx1030"
+; GFX1031: .amdgcn_target "amdgpu10.31-amd-amdhsa-unknown-gfx1031"
+; GFX1032: .amdgcn_target "amdgpu10.32-amd-amdhsa-unknown-gfx1032"
+; GFX1033: .amdgcn_target "amdgpu10.33-amd-amdhsa-unknown-gfx1033"
+; GFX1034: .amdgcn_target "amdgpu10.34-amd-amdhsa-unknown-gfx1034"
+; GFX1035: .amdgcn_target "amdgpu10.35-amd-amdhsa-unknown-gfx1035"
+; GFX1036: .amdgcn_target "amdgpu10.36-amd-amdhsa-unknown-gfx1036"
+
+; GFX11: .amdgcn_target "amdgpu11-amd-amdhsa-unknown-gfx11-generic"
+; GFX1100: .amdgcn_target "amdgpu11.00-amd-amdhsa-unknown-gfx1100"
+; GFX1101: .amdgcn_target "amdgpu11.01-amd-amdhsa-unknown-gfx1101"
+; GFX1102: .amdgcn_target "amdgpu11.02-amd-amdhsa-unknown-gfx1102"
+; GFX1103: .amdgcn_target "amdgpu11.03-amd-amdhsa-unknown-gfx1103"
+
+; GFX1150: .amdgcn_target "amdgpu11.50-amd-amdhsa-unknown-gfx1150"
+; GFX1151: .amdgcn_target "amdgpu11.51-amd-amdhsa-unknown-gfx1151"
+; GFX1152: .amdgcn_target "amdgpu11.52-amd-amdhsa-unknown-gfx1152"
+; GFX1153: .amdgcn_target "amdgpu11.53-amd-amdhsa-unknown-gfx1153"
+; GFX1154: .amdgcn_target "amdgpu11.54-amd-amdhsa-unknown-gfx1154"
+
+; GFX11_7: .amdgcn_target "amdgpu11.7-amd-amdhsa-unknown-gfx11-7-generic"
+; GFX1170: .amdgcn_target "amdgpu11.70-amd-amdhsa-unknown-gfx1170"
+; GFX1171: .amdgcn_target "amdgpu11.71-amd-amdhsa-unknown-gfx1171"
+; GFX1172: .amdgcn_target "amdgpu11.72-amd-amdhsa-unknown-gfx1172"
+
+; GFX12: .amdgcn_target "amdgpu12-amd-amdhsa-unknown-gfx12-generic"
+; GFX1200: .amdgcn_target "amdgpu12.00-amd-amdhsa-unknown-gfx1200"
+; GFX1201: .amdgcn_target "amdgpu12.01-amd-amdhsa-unknown-gfx1201"
+
+; GFX12_5: .amdgcn_target "amdgpu12.5-amd-amdhsa-unknown-gfx12-5-generic"
+; GFX1250: .amdgcn_target "amdgpu12.50-amd-amdhsa-unknown-gfx1250"
+; GFX1251: .amdgcn_target "amdgpu12.51-amd-amdhsa-unknown-gfx1251"
+
+; GFX13: .amdgcn_target "amdgpu13-amd-amdhsa-unknown-gfx13-generic"
+; GFX1310: .amdgcn_target "amdgpu13.10-amd-amdhsa-unknown-gfx1310"
+
+define amdgpu_kernel void @foo() {
+  ret void
+}
diff --git a/llvm/test/CodeGen/AMDGPU/validate-subtarget-subarch-empty-module.ll b/llvm/test/CodeGen/AMDGPU/validate-subtarget-subarch-empty-module.ll
new file mode 100644
index 0000000000000..97f4695a681f2
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/validate-subtarget-subarch-empty-module.ll
@@ -0,0 +1,10 @@
+; Make sure we still diagose invalid cpu for the subarch even if there
+; are no functions in the module.  This differs from
+; validate-subtarget-subarch.ll in that a subtarget is never
+; constructed.
+
+; RUN: not llc -mtriple=amdgpu9 -mcpu=gfx1030 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: not llc -mtriple=amdgpu12345 -mcpu=gfx600 -filetype=null %s 2>&1 | FileCheck -check-prefix=UNKNOWN-SUBARCH %s
+
+; ERR: LLVM ERROR: invalid cpu 'gfx1030' for subarch amdgpu9
+; UNKNOWN-SUBARCH: LLVM ERROR: unknown subarch amdgpu12345
diff --git a/llvm/test/CodeGen/AMDGPU/validate-subtarget-subarch.ll b/llvm/test/CodeGen/AMDGPU/validate-subtarget-subarch.ll
new file mode 100644
index 0000000000000..445e1858f70d5
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/validate-subtarget-subarch.ll
@@ -0,0 +1,47 @@
+; RUN: llc -mtriple=amdgpu6 -mcpu=gfx600 -filetype=null %s
+; RUN: llc -mtriple=amdgpu6.00 -mcpu=gfx600 -filetype=null %s
+; RUN: llc -mtriple=amdgpu9 -mcpu=gfx900 -filetype=null %s
+; RUN: llc -mtriple=amdgpu9.0a -mcpu=gfx90a -filetype=null %s
+; RUN: llc -mtriple=amdgpu9.08 -mcpu=gfx908 -filetype=null %s
+; RUN: llc -mtriple=amdgpu9.4 -mcpu=gfx950 -filetype=null %s
+; RUN: llc -mtriple=amdgpu11 -mcpu=gfx1100 -filetype=null %s
+; RUN: llc -mtriple=amdgpu11.7 -mcpu=gfx1170 -filetype=null %s
+
+; Test legacy missing subarch
+; RUN: llc -mtriple=amdgcn -mcpu=gfx950 -filetype=null %s
+; RUN: llc -mtriple=amdgpu -mcpu=gfx950 -filetype=null %s
+; RUN: llc -mtriple=amdgpu -mcpu=gfx600 -filetype=null %s
+
+; RUN: llc -mtriple=amdgpu9 -mcpu=invalid -filetype=null %s 2>&1 | FileCheck -check-prefix=INVALID-MCPU-VALID-SUBARCH %s
+
+; RUN: sed 's/TARGET_CPU/invalid/g' < %s | llc -mtriple=amdgpu12.50-amd-amdhsa -filetype=null 2>&1 | FileCheck -check-prefix=INVALID-MCPU-VALID-SUBARCH %s
+; RUN: sed 's/TARGET_CPU/invalid/g' < %s | llc -mtriple=amdgpu12.51-amd-amdhsa -filetype=null 2>&1 | FileCheck -check-prefix=INVALID-MCPU-VALID-SUBARCH %s
+; RUN: sed 's/TARGET_CPU/gfx900/g'< %s | not llc -mtriple=amdgpu12345 -filetype=null 2>&1 | FileCheck -check-prefix=INVALID-SUBARCH-VALID-MCPU %s
+
+; RUN: sed 's/TARGET_CPU/gfx601/g' < %s | not llc -mtriple=amdgpu6.00 -filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx600/g' < %s | not llc -mtriple=amdgpu6.01 -filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx600/g' < %s | not llc -mtriple=amdgpu7 -filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx810/g' < %s | not llc -mtriple=amdgpu8.03 -filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx810/g' < %s | not llc -mtriple=amdgpu8 -filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx942/g' < %s | not llc -mtriple=amdgpu9 -filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx900/g' < %s | not llc -mtriple=amdgpu9.4 -filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx1030/g' < %s | not llc -mtriple=amdgpu9.4 -filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx900/g' < %s | not llc -mtriple=amdgpu9.08 -filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx90a/g' < %s | not llc -mtriple=amdgpu9 -filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx908/g' < %s | not llc -mtriple=amdgpu9 -filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx1170/g' < %s | not llc -mtriple=amdgpu11 -filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx1100/g' < %s | not llc -mtriple=amdgpu11.7 -filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+
+; Check that subtargets not covered by the subarch are rejected. This
+; tests the error on subtarget construction, which is different from
+; the error on TargetMachine construction.
+
+
+; INVALID-MCPU: error: invalid subtarget 'invalid' for subarch amdgpu{{[0-9.]+}}
+; INVALID-SUBARCH-VALID-MCPU: LLVM ERROR: unknown subarch amdgpu12345
+; INVALID-MCPU-VALID-SUBARCH: 'invalid' is not a recognized processor for this target (ignoring processor)
+
+; ERR: error: invalid subtarget 'gfx{{.+}}' for subarch amdgpu{{[0-9.]+}}
+define amdgpu_kernel void @foo() "target-cpu"="TARGET_CPU" {
+  ret void
+}
diff --git a/llvm/test/CodeGen/MIR/AMDGPU/init-whole.wave.ll b/llvm/test/CodeGen/MIR/AMDGPU/init-whole.wave.ll
index f3b8deff61918..92ba0e548caa9 100644
--- a/llvm/test/CodeGen/MIR/AMDGPU/init-whole.wave.ll
+++ b/llvm/test/CodeGen/MIR/AMDGPU/init-whole.wave.ll
@@ -1,5 +1,5 @@
-; RUN: llc -global-isel=0 -march=amdgcn -mcpu=gfx1100 -stop-after=finalize-isel < %s | FileCheck --check-prefix=GCN %s
-; RUN: llc -global-isel=1 -march=amdgcn -mcpu=gfx1100 -stop-after=finalize-isel < %s | FileCheck --check-prefix=GCN %s
+; RUN: llc -global-isel=0 -march=amdgpu -mcpu=gfx1100 -stop-after=finalize-isel < %s | FileCheck --check-prefix=GCN %s
+; RUN: llc -global-isel=1 -march=amdgpu -mcpu=gfx1100 -stop-after=finalize-isel < %s | FileCheck --check-prefix=GCN %s
 
 ; GCN-LABEL: name: init_wwm
 ; GCN: hasInitWholeWave: true
diff --git a/llvm/test/Linker/Inputs/amdgpu-amdpal-no-subarch.ll b/llvm/test/Linker/Inputs/amdgpu-amdpal-no-subarch.ll
new file mode 100644
index 0000000000000..e254233d258e7
--- /dev/null
+++ b/llvm/test/Linker/Inputs/amdgpu-amdpal-no-subarch.ll
@@ -0,0 +1,5 @@
+target triple = "amdgpu-amd-amdpal"
+
+define i32 @foo() {
+  ret i32 3
+}
diff --git a/llvm/test/Linker/Inputs/amdgpu-no-subarch.ll b/llvm/test/Linker/Inputs/amdgpu-no-subarch.ll
new file mode 100644
index 0000000000000..03e1e03338486
--- /dev/null
+++ b/llvm/test/Linker/Inputs/amdgpu-no-subarch.ll
@@ -0,0 +1,5 @@
+target triple = "amdgpu-amd-amdhsa"
+
+define i32 @foo() {
+  ret i32 3
+}
diff --git a/llvm/test/Linker/Inputs/amdgpu10-subarch.ll b/llvm/test/Linker/Inputs/amdgpu10-subarch.ll
new file mode 100644
index 0000000000000..e8234f059c4a4
--- /dev/null
+++ b/llvm/test/Linker/Inputs/amdgpu10-subarch.ll
@@ -0,0 +1,5 @@
+target triple = "amdgpu10-amd-amdhsa"
+
+define i32 @foo() {
+  ret i32 10
+}
diff --git a/llvm/test/Linker/Inputs/amdgpu9.00-subarch.ll b/llvm/test/Linker/Inputs/amdgpu9.00-subarch.ll
new file mode 100644
index 0000000000000..c4bc4518a3038
--- /dev/null
+++ b/llvm/test/Linker/Inputs/amdgpu9.00-subarch.ll
@@ -0,0 +1,5 @@
+target triple = "amdgpu9.00-amd-amdhsa"
+
+define i32 @foo() {
+  ret i32 10
+}
diff --git a/llvm/test/Linker/amdgpu-triple-os-mismatch.ll b/llvm/test/Linker/amdgpu-triple-os-mismatch.ll
new file mode 100644
index 0000000000000..64c46cc4f3cab
--- /dev/null
+++ b/llvm/test/Linker/amdgpu-triple-os-mismatch.ll
@@ -0,0 +1,19 @@
+; RUN: llvm-link -S %s %S/Inputs/amdgpu-amdpal-no-subarch.ll -o %t0.ll 2>&1 | FileCheck -check-prefix=WARN_A %s
+; RUN: llvm-link -S %S/Inputs/amdgpu-amdpal-no-subarch.ll %s -o %t1.ll 2>&1 | FileCheck -check-prefix=WARN_B %s
+; RUN: FileCheck -check-prefix=LINKED0 %s < %t0.ll
+; RUN: FileCheck -check-prefix=LINKED1 %s < %t1.ll
+
+; WARN_A: warning: Linking two modules of different target triples: '{{.*}}' is 'amdgpu-amd-amdpal' whereas 'llvm-link' is 'amdgpu9-amd-amdhsa'
+; WARN_B: warning: Linking two modules of different target triples: '{{.*}}' is 'amdgpu9-amd-amdhsa' whereas 'llvm-link' is 'amdgpu-amd-amdpal'
+
+; LINKED0: target triple = "amdgpu9-amd-amdhsa"
+; LINKED1: target triple = "amdgpu-amd-amdpal"
+
+target triple = "amdgpu9-amd-amdhsa"
+
+declare i32 @foo()
+
+define i32 @bar() {
+  %x = call i32 @foo()
+  ret i32 %x
+}
diff --git a/llvm/test/Linker/amdgpu-triple-subarch.ll b/llvm/test/Linker/amdgpu-triple-subarch.ll
new file mode 100644
index 0000000000000..1a66fe6fbde22
--- /dev/null
+++ b/llvm/test/Linker/amdgpu-triple-subarch.ll
@@ -0,0 +1,42 @@
+
+; Merge amdgpu + amdgpu9 => amdgpu9 without a warning.
+; RUN: llvm-link -S %s %S/Inputs/amdgpu-no-subarch.ll -o %t0.ll 2>&1 | FileCheck --allow-empty -check-prefix=NO-WARN %s
+; RUN: llvm-link -S %S/Inputs/amdgpu-no-subarch.ll %s -o %t1.ll 2>&1 | FileCheck --allow-empty -check-prefix=NO-WARN %s
+; RUN: FileCheck -check-prefix=LINKED0 %s < %t0.ll
+; RUN: FileCheck -check-prefix=LINKED0 %s < %t1.ll
+
+; Invalid merge of amdgpu9 + amdgpu10, but the second triple wins and a warning is produced
+; RUN: llvm-link -S %s %S/Inputs/amdgpu10-subarch.ll -o %t2.ll 2>&1 | FileCheck -check-prefix=WARN_A %s
+; RUN: llvm-link -S %S/Inputs/amdgpu10-subarch.ll %s -o %t3.ll 2>&1 | FileCheck -check-prefix=WARN_B %s
+; RUN: FileCheck -check-prefix=LINKED1 %s < %t2.ll
+; RUN: FileCheck -check-prefix=LINKED2 %s < %t3.ll
+
+; Merge amdgpu9 + amdgpu9.00 = amdgpu9.00, and do not warn.
+; RUN: llvm-link -S %s %S/Inputs/amdgpu9.00-subarch.ll -o %t4.ll 2>&1 | FileCheck --allow-empty -check-prefix=NO-WARN %s
+; RUN: llvm-link -S %S/Inputs/amdgpu9.00-subarch.ll %s -o %t5.ll 2>&1 | FileCheck --allow-empty -check-prefix=NO-WARN %s
+; RUN: FileCheck -check-prefix=LINKED3 %s < %t4.ll
+; RUN: FileCheck -check-prefix=LINKED3 %s < %t5.ll
+
+; NO-WARN: {{^$}}
+
+; LINKED0: target triple = "amdgpu9-amd-amdhsa"
+; LINKED1: target triple = "amdgpu9-amd-amdhsa"
+; LINKED2: target triple = "amdgpu10-amd-amdhsa"
+; LINKED3: target triple = "amdgpu9.00-amd-amdhsa"
+
+; Check that there is no warning when linking an amdgpu triple without
+; a subarch with one with a subarch.
+
+
+; WARN_A: warning: Linking two modules of different target triples: '{{.*}}' is 'amdgpu10-amd-amdhsa' whereas 'llvm-link' is 'amdgpu9-amd-amdhsa'
+; WARN_B: warning: Linking two modules of different target triples: '{{.*}}' is 'amdgpu9-amd-amdhsa' whereas 'llvm-link' is 'amdgpu10-amd-amdhsa'
+
+
+target triple = "amdgpu9-amd-amdhsa"
+
+declare i32 @foo()
+
+define i32 @bar() {
+  %x = call i32 @foo()
+  ret i32 %x
+}
diff --git a/llvm/test/MC/AMDGPU/amd-amdgpu-isa-malformed-target-id.s b/llvm/test/MC/AMDGPU/amd-amdgpu-isa-malformed-target-id.s
index efce3612f0300..c88e9e464cf8c 100644
--- a/llvm/test/MC/AMDGPU/amd-amdgpu-isa-malformed-target-id.s
+++ b/llvm/test/MC/AMDGPU/amd-amdgpu-isa-malformed-target-id.s
@@ -1,5 +1,5 @@
 // RUN: not llvm-mc -triple amdgcn-amd-unknown -mcpu=gfx900 %s 2>&1 | FileCheck %s
 
 // Test malformed target ID error handling in .amd_amdgpu_isa directive
-// CHECK: [[#@LINE+1]]:17: error: malformed target id
+// CHECK: [[#@LINE+1]]:17: error: malformed target id 'not-a-valid-target-id'
 .amd_amdgpu_isa "not-a-valid-target-id"
diff --git a/llvm/test/MC/AMDGPU/amdgcn-target-directive-subarch-cpu-field.s b/llvm/test/MC/AMDGPU/amdgcn-target-directive-subarch-cpu-field.s
new file mode 100644
index 0000000000000..98613f2bafb4d
--- /dev/null
+++ b/llvm/test/MC/AMDGPU/amdgcn-target-directive-subarch-cpu-field.s
@@ -0,0 +1,58 @@
+// RUN: split-file %s %t
+// RUN: llvm-mc -triple amdgpu12.50-amd-amdhsa %t/amdhsa.s | FileCheck --check-prefix=AMDHSA %s
+// RUN: not llvm-mc -triple amdgpu12.5-amd-amdhsa --amdhsa-code-object-version=6 %t/amdhsa-generic-subarch-cpu.s -filetype=null 2>&1 | FileCheck --check-prefix=AMDHSA-GENERIC-SUBARCH %s
+// RUN: llvm-mc -triple amdgpu12.50-amd-amdpal %t/amdpal.s | FileCheck --check-prefix=AMDPAL %s
+// RUN: not llvm-mc -triple amdgpu12.5-amd-amdpal --amdhsa-code-object-version=6 %t/amdpal-generic-subarch-cpu.s -filetype=null 2>&1 | FileCheck --check-prefix=AMDPAL-GENERIC-SUBARCH %s
+// RUN: llvm-mc -triple amdgpu12.50-amd-amdhsa %t/cpu.s | FileCheck --check-prefix=AMDHSA %s
+// RUN: not llvm-mc -triple amdgpu12.50-amd-amdhsa %t/subarch-mismatch.s -filetype=null 2>&1 | FileCheck --check-prefix=ERR %s
+// RUN: not llvm-mc -triple amdgpu12.50-amd-amdhsa %t/cpu-not-covered.s -filetype=null 2>&1 | FileCheck --check-prefix=NOTCOVERED %s
+// RUN: not llvm-mc -triple amdgpu12.50-amd-amdhsa %t/cpu-not-covered-same-major.s -filetype=null 2>&1 | FileCheck --check-prefix=NOTCOVERED-SAME-MAJOR %s
+// RUN: not llvm-mc -triple amdgpu12.50-amd-amdpal %t/isa-cpu-not-covered.s -filetype=null 2>&1 | FileCheck --check-prefix=ISA-NOTCOVERED %s
+
+// Check how the CPU field is validated against the triple
+// subarch. The processor name field may be empty, but if it's not it
+// must be compatible with triple's subarch.
+
+//--- amdhsa.s
+// AMDHSA: .amdgcn_target "amdgpu12.50-amd-amdhsa-unknown-gfx1250"
+.amdgcn_target "amdgpu12.50-amd-amdhsa-unknown-"
+
+//--- amdhsa-generic-subarch-cpu.s
+// FIXME: This should be accepted and passed through as-is
+// AMDHSA-GENERIC-SUBARCH: error: .amdgcn_target directive's target id amdgpu12.5-amd-amdhsa-unknown-gfx1251 does not match the specified target id amdgpu12.5-amd-amdhsa-unknown-gfx12-5-generic
+.amdgcn_target "amdgpu12.5-amd-amdhsa-unknown-gfx1251"
+
+//--- amdpal.s
+// AMDPAL: .amd_amdgpu_isa "amdgpu12.50-amd-amdpal-unknown-gfx1250"
+.amd_amdgpu_isa "amdgpu12.50-amd-amdpal-unknown-"
+
+//--- amdpal-generic-subarch-cpu.s
+// FIXME: This should be accepted and passed through as-is
+// AMDPAL-GENERIC-SUBARCH: error: .amd_amdgpu_isa directive's target id amdgpu12.5-amd-amdpal-unknown-gfx1251 does not match the specified target id amdgpu12.5-amd-amdpal-unknown-gfx12-5-generic
+.amd_amdgpu_isa "amdgpu12.5-amd-amdpal-unknown-gfx1251"
+
+//--- cpu.s
+// A processor covered by the subarch is accepted.
+.amdgcn_target "amdgpu12.50-amd-amdhsa-unknown-gfx1250"
+
+//--- subarch-mismatch.s
+// A target id whose subarch conflicts with the triple is rejected: the subarch
+// resolves to a processor that is not valid for the triple's subarch.
+// ERR: {{.*}}: error: target id 'amdgpu9.00-amd-amdhsa-unknown-' specifies a processor that is not valid for subarch 'amdgpu12.50'
+.amdgcn_target "amdgpu9.00-amd-amdhsa-unknown-"
+
+//--- cpu-not-covered.s
+// A processor not covered by the triple's subarch is rejected.
+// NOTCOVERED: {{.*}}: error: target id 'amdgpu12.50-amd-amdhsa-unknown-gfx900' specifies a processor that is not valid for subarch 'amdgpu12.50'
+.amdgcn_target "amdgpu12.50-amd-amdhsa-unknown-gfx900"
+
+//--- cpu-not-covered-same-major.s
+// A sibling processor sharing the major subarch (gfx1251 and gfx1250 are both
+// gfx12.5) is still not covered by a specific subarch (amdgpu12.50).
+// NOTCOVERED-SAME-MAJOR: {{.*}}: error: target id 'amdgpu12.50-amd-amdhsa-unknown-gfx1251' specifies a processor that is not valid for subarch 'amdgpu12.50'
+.amdgcn_target "amdgpu12.50-amd-amdhsa-unknown-gfx1251"
+
+//--- isa-cpu-not-covered.s
+// The same check applies to .amd_amdgpu_isa.
+// ISA-NOTCOVERED: {{.*}}: error: target id 'amdgpu12.50-amd-amdpal-unknown-gfx900' specifies a processor that is not valid for subarch 'amdgpu12.50'
+.amd_amdgpu_isa "amdgpu12.50-amd-amdpal-unknown-gfx900"
diff --git a/llvm/test/MC/AMDGPU/amdgcn-target-malformed-target-id.s b/llvm/test/MC/AMDGPU/amdgcn-target-malformed-target-id.s
index d4f89b5ac0142..000ece52ab701 100644
--- a/llvm/test/MC/AMDGPU/amdgcn-target-malformed-target-id.s
+++ b/llvm/test/MC/AMDGPU/amdgcn-target-malformed-target-id.s
@@ -1,5 +1,5 @@
 // RUN: not llvm-mc -triple amdgcn-amd-amdhsa -mcpu=gfx900 %s -filetype=null 2>&1 | FileCheck %s
 
 // Test malformed target ID error handling in .amdgcn_target directive
-// CHECK: [[#@LINE+1]]:16: error: malformed target ID
+// CHECK: [[#@LINE+1]]:16: error: malformed target id 'not-a-valid-target-id'
 .amdgcn_target "not-a-valid-target-id"
diff --git a/llvm/test/MC/AMDGPU/amdgcn_target_directive_from_eflags.s b/llvm/test/MC/AMDGPU/amdgcn_target_directive_from_eflags.s
index 8a91985909ed8..451dc4aa0a5a8 100644
--- a/llvm/test/MC/AMDGPU/amdgcn_target_directive_from_eflags.s
+++ b/llvm/test/MC/AMDGPU/amdgcn_target_directive_from_eflags.s
@@ -43,30 +43,30 @@
 // RUN: llvm-mc -triple=amdgcn-amd-amdhsa -mcpu=gfx908 -mattr=-sramecc -filetype=obj %s -o %t-sramecc-off-only.o
 // RUN: llvm-objdump --disassemble-all %t-sramecc-off-only.o | FileCheck --check-prefix=CHECK-SRAMECC-OFF-ONLY %s
 
-// CHECK-GFX900: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx900"
+// CHECK-GFX900: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx900"
 
-// CHECK-GFX908: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx908"
+// CHECK-GFX908: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx908"
 
-// CHECK-GFX1010: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx1010"
+// CHECK-GFX1010: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx1010"
 
-// CHECK-GFX1100: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx1100"
+// CHECK-GFX1100: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx1100"
 
-// CHECK-GFX1200: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx1200"
+// CHECK-GFX1200: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx1200"
 
-// CHECK-DEFAULT: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx908"
+// CHECK-DEFAULT: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx908"
 
-// CHECK-BOTH-ON: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx908:sramecc+:xnack+"
+// CHECK-BOTH-ON: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx908:sramecc+:xnack+"
 
-// CHECK-BOTH-OFF: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx908:sramecc-:xnack-"
+// CHECK-BOTH-OFF: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx908:sramecc-:xnack-"
 
-// CHECK-XNACK-ON: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx908:sramecc-:xnack+"
+// CHECK-XNACK-ON: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx908:sramecc-:xnack+"
 
-// CHECK-SRAMECC-ON: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx908:sramecc+:xnack-"
+// CHECK-SRAMECC-ON: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx908:sramecc+:xnack-"
 
-// CHECK-XNACK-ONLY: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx908:xnack+"
+// CHECK-XNACK-ONLY: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx908:xnack+"
 
-// CHECK-XNACK-OFF-ONLY: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx908:xnack-"
+// CHECK-XNACK-OFF-ONLY: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx908:xnack-"
 
-// CHECK-SRAMECC-ONLY: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx908:sramecc+"
+// CHECK-SRAMECC-ONLY: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx908:sramecc+"
 
-// CHECK-SRAMECC-OFF-ONLY: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx908:sramecc-"
+// CHECK-SRAMECC-OFF-ONLY: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx908:sramecc-"
diff --git a/llvm/test/MC/AMDGPU/arch-amdgcn-legacy-arch-name.s b/llvm/test/MC/AMDGPU/arch-amdgcn-legacy-arch-name.s
new file mode 100644
index 0000000000000..445c319871dca
--- /dev/null
+++ b/llvm/test/MC/AMDGPU/arch-amdgcn-legacy-arch-name.s
@@ -0,0 +1,7 @@
+# The architecture name was renamed from "amdgcn" to "amdgpu". Check that the
+# legacy "amdgcn" name still works when passed via -arch.
+
+# RUN: llvm-mc -arch=amdgcn -mcpu=gfx900 -show-encoding %s | FileCheck %s
+
+# CHECK: s_nop 0 ; encoding: [0x00,0x00,0x80,0xbf]
+s_nop 0
diff --git a/llvm/test/Object/AMDGPU/elf-header-flags-mach.yaml b/llvm/test/Object/AMDGPU/elf-header-flags-mach.yaml
index 9975a52a6c68e..2a24c2d438e7f 100644
--- a/llvm/test/Object/AMDGPU/elf-header-flags-mach.yaml
+++ b/llvm/test/Object/AMDGPU/elf-header-flags-mach.yaml
@@ -366,7 +366,7 @@
 
 
 # ELF-AMDGCN-ALL:       Format: elf64-amdgpu
-# ELF-AMDGCN-ALL:       Arch: amdgcn
+# ELF-AMDGCN-ALL:       Arch: amdgpu
 # ELF-AMDGCN-ALL:       AddressSize: 64bit
 # ELF-AMDGCN-ALL:       Flags [
 
diff --git a/llvm/test/Object/AMDGPU/objdump.s b/llvm/test/Object/AMDGPU/objdump.s
index 07823b8323692..6f671a69a8df9 100644
--- a/llvm/test/Object/AMDGPU/objdump.s
+++ b/llvm/test/Object/AMDGPU/objdump.s
@@ -1,4 +1,4 @@
-// RUN: llvm-mc -triple=amdgcn -mcpu=tonga %s -filetype=obj | llvm-objdump -d --arch-name=amdgcn --mcpu=tonga - | FileCheck %s
+// RUN: llvm-mc -triple=amdgpu -mcpu=tonga %s -filetype=obj | llvm-objdump -d --arch-name=amdgpu --mcpu=tonga - | FileCheck %s
 
 	.text
 
diff --git a/llvm/test/tools/llvm-objdump/AMDGPU/arch-amdgcn-legacy-arch-name.s b/llvm/test/tools/llvm-objdump/AMDGPU/arch-amdgcn-legacy-arch-name.s
new file mode 100644
index 0000000000000..041d725698e59
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/AMDGPU/arch-amdgcn-legacy-arch-name.s
@@ -0,0 +1,8 @@
+# The architecture name was renamed from "amdgcn" to "amdgpu". Check that the
+# legacy "amdgcn" name still works when passed via --arch-name.
+
+# RUN: llvm-mc -triple=amdgcn -mcpu=gfx900 -filetype=obj %s -o %t.o
+# RUN: llvm-objdump -d --arch-name=amdgcn --mcpu=gfx900 %t.o | FileCheck %s
+
+# CHECK: s_nop 0
+s_nop 0
diff --git a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-zeroed-gfx10.s b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-zeroed-gfx10.s
index a492291fabef9..bc16708dcd647 100644
--- a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-zeroed-gfx10.s
+++ b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-zeroed-gfx10.s
@@ -17,7 +17,7 @@
 ; OBJDUMP-NEXT: 0010 00000000 00000000 00000000 00000000
 ; OBJDUMP-NEXT: 0020 00000000 00000000 00000000 00000000
 ; OBJDUMP-NEXT: 0030 01000000 00000000 00000000 00000000
-; OBJDUMP-NEXT: .amdgcn_target "amdgcn-amd-amdhsa-unknown-gfx1010:xnack-"
+; OBJDUMP-NEXT: .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx1010:xnack-"
 ; OBJDUMP-EMPTY:
 
 ; OBJDUMP-LABEL: Disassembly of section .text:
diff --git a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/subarch-triple.s b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/subarch-triple.s
new file mode 100644
index 0000000000000..56ae9fe1a2ad7
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/subarch-triple.s
@@ -0,0 +1,37 @@
+## Test that llvm-objdump accepts the subtarget spelled either as a legacy
+## amdgcn triple plus an explicit --mcpu, or as an amdgpu subarch triple with
+## no --mcpu. Both forms must select the same subtarget and disassemble
+## identically.
+
+# RUN: llvm-mc -triple=amdgpu12.50-amd-amdhsa -filetype=obj -o %t.o %s
+
+## Legacy amdgcn triple + explicit cpu.
+# RUN: llvm-objdump -d --triple=amdgcn-amd-amdhsa --mcpu=gfx1250 %t.o \
+# RUN:   | FileCheck --check-prefixes=DIS,DIS-AMDGCN %s
+
+## Subarch triple, no cpu: selects the same subtarget and decodes identically.
+# RUN: llvm-objdump -d --triple=amdgpu12.50-amd-amdhsa %t.o \
+# RUN:   | FileCheck --check-prefixes=DIS,DIS-SUBARCH %s
+
+## No triple, just cpu: the triple is taken from the object.
+# RUN: llvm-objdump -d --mcpu=gfx1250 %t.o \
+# RUN:   | FileCheck --check-prefixes=DIS,DIS-DETECT %s
+
+## No target arguments at all: both the triple and cpu are taken from the
+## object's ELF header.
+# RUN: llvm-objdump -d %t.o \
+# RUN:   | FileCheck --check-prefixes=DIS,DIS-DETECT %s
+
+# DIS-AMDGCN:  .amdgcn_target "amdgcn-amd-amdhsa{{ ?}}-unknown-gfx1250"
+# DIS-SUBARCH: .amdgcn_target "amdgpu12.50-amd-amdhsa-unknown-gfx1250"
+# DIS-DETECT:  .amdgcn_target "amdgpu-amd-amdhsa-unknown-gfx1250"
+
+# DIS-LABEL: <kernel>:
+# DIS: s_set_vgpr_msb 0x41
+# DIS-NEXT: s_endpgm
+
+.text
+.globl kernel
+kernel:
+  s_set_vgpr_msb 0x41
+  s_endpgm
diff --git a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/subtarget.ll b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/subtarget.ll
index df34fd13f7026..218a7e8dec159 100644
--- a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/subtarget.ll
+++ b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/subtarget.ll
@@ -7,7 +7,7 @@ define amdgpu_kernel void @test_kernel() {
 ; ----------------------------------GFX13--------------------------------------
 ;
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1310 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1310 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1310 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 ;
@@ -19,32 +19,32 @@ define amdgpu_kernel void @test_kernel() {
 ; ----------------------------------GFX12--------------------------------------
 ;
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa --amdhsa-code-object-version=6 -mcpu=gfx12-generic -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn -mllvm --amdhsa-code-object-version=6 --mcpu=gfx12-generic %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu -mllvm --amdhsa-code-object-version=6 --mcpu=gfx12-generic %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D -mllvm --amdhsa-code-object-version=6 %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 ;
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1201 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1201 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1201 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 ;
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1200 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1200 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa --amdhsa-code-object-version=6 -mcpu=gfx12-5-generic -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn -mllvm --amdhsa-code-object-version=6 --mcpu=gfx12-5-generic %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu -mllvm --amdhsa-code-object-version=6 --mcpu=gfx12-5-generic %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D -mllvm --amdhsa-code-object-version=6 %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1250 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1250 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1250 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1251 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1251 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1251 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
@@ -56,22 +56,22 @@ define amdgpu_kernel void @test_kernel() {
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa --amdhsa-code-object-version=6 -mcpu=gfx11-generic -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn -mllvm --amdhsa-code-object-version=6 --mcpu=gfx11-generic %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu -mllvm --amdhsa-code-object-version=6 --mcpu=gfx11-generic %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D -mllvm --amdhsa-code-object-version=6 %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1172 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1172 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1172 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1171 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1171 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1171 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1170 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1170 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1170 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
@@ -81,108 +81,108 @@ define amdgpu_kernel void @test_kernel() {
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1153 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1153 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1153 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1152 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1152 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1152 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1151 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1151 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1151 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1150 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1150 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1150 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1103 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1103 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1103 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1102 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1102 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1102 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1101 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1101 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1101 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1100 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1100 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; ----------------------------------GFX10--------------------------------------
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa --amdhsa-code-object-version=6 -mcpu=gfx10-3-generic -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn -mllvm --amdhsa-code-object-version=6 --mcpu=gfx10-3-generic %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu -mllvm --amdhsa-code-object-version=6 --mcpu=gfx10-3-generic %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D  -mllvm --amdhsa-code-object-version=6 %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1036 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1036 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1036 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1035 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1035 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1035 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1034 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1034 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1034 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1033 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1033 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1033 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1032 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1032 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1032 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1031 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1031 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1031 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1030 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1030 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1030 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa --amdhsa-code-object-version=6 -mcpu=gfx10-1-generic -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn -mllvm --amdhsa-code-object-version=6 --mcpu=gfx10-1-generic %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu -mllvm --amdhsa-code-object-version=6 --mcpu=gfx10-1-generic %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D  -mllvm --amdhsa-code-object-version=6 %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1013 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1013 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1013 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1012 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1012 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1012 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1011 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1011 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1011 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1010 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx1010 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
@@ -190,62 +190,62 @@ define amdgpu_kernel void @test_kernel() {
 ; ----------------------------------GFX9---------------------------------------
 ;
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa --amdhsa-code-object-version=6 -mcpu=gfx9-4-generic -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn -mllvm --amdhsa-code-object-version=6 --mcpu=gfx9-4-generic %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu -mllvm --amdhsa-code-object-version=6 --mcpu=gfx9-4-generic %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D  -mllvm --amdhsa-code-object-version=6 %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa --amdhsa-code-object-version=6 -mcpu=gfx9-generic -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn -mllvm --amdhsa-code-object-version=6 --mcpu=gfx9-generic %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu -mllvm --amdhsa-code-object-version=6 --mcpu=gfx9-generic %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D  -mllvm --amdhsa-code-object-version=6 %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx950 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx950 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx950 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx942 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx942 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx942 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90c -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx90c %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx90c %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx90a %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx90a %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx909 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx909 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx909 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx908 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx908 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx908 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx906 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx906 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx904 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx904 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx904 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx902 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx902 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx902 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx900 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx900 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
@@ -253,21 +253,21 @@ define amdgpu_kernel void @test_kernel() {
 ; ----------------------------------GFX8---------------------------------------
 ;
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx810 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx810 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx810 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx803 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx803 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx802 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx802 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx802 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
 
 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx801 -filetype=obj -O0 -o %t.o %s
-; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx801 %t.o > %t-specify.txt
+; RUN: llvm-objdump -D --arch-name=amdgpu --mcpu=gfx801 %t.o > %t-specify.txt
 ; RUN: llvm-objdump -D %t.o > %t-detect.txt
 ; RUN: diff %t-specify.txt %t-detect.txt
diff --git a/llvm/test/tools/llvm-readobj/ELF/AMDGPU/elf-headers.test b/llvm/test/tools/llvm-readobj/ELF/AMDGPU/elf-headers.test
index 848d9784025df..c802aed428631 100644
--- a/llvm/test/tools/llvm-readobj/ELF/AMDGPU/elf-headers.test
+++ b/llvm/test/tools/llvm-readobj/ELF/AMDGPU/elf-headers.test
@@ -538,7 +538,7 @@ FileHeader:
 
 # ALL:                      File: [[FILE]]
 # ALL-NEXT:                 Format: elf64-amdgpu
-# ALL-NEXT:                 Arch: amdgcn
+# ALL-NEXT:                 Arch: amdgpu
 # ALL-NEXT:                 AddressSize: 64bit
 # ALL-NEXT:                 LoadName: <Not found>
 # ALL-NEXT:                 ElfHeader {
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index daebae588cfff..7074c8af696e2 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -1122,7 +1122,7 @@ PrettyPrinter &selectPrettyPrinter(Triple const &Triple) {
     return PrettyPrinterInst;
   case Triple::hexagon:
     return HexagonPrettyPrinterInst;
-  case Triple::amdgcn:
+  case Triple::amdgpu:
     return AMDGCNPrettyPrinterInst;
   case Triple::bpfel:
   case Triple::bpfeb:
@@ -2137,7 +2137,7 @@ disassembleObject(ObjectFile &Obj, const ObjectFile &DbgObj,
         unwrapOrError(Section.getContents(), Obj.getFileName()));
 
     std::vector<std::unique_ptr<std::string>> SynthesizedLabelNames;
-    if (Obj.isELF() && Obj.getArch() == Triple::amdgcn) {
+    if (Obj.isELF() && Obj.getArch() == Triple::amdgpu) {
       // AMDGPU disassembler uses symbolizer for printing labels
       addSymbolizer(*DT->Context, DT->TheTarget, DT->TheTriple,
                     DT->DisAsm.get(), SectionAddr, Bytes, Symbols,
diff --git a/llvm/unittests/Object/ELFObjectFileTest.cpp b/llvm/unittests/Object/ELFObjectFileTest.cpp
index 6113bae63828f..f30aaa1e96afa 100644
--- a/llvm/unittests/Object/ELFObjectFileTest.cpp
+++ b/llvm/unittests/Object/ELFObjectFileTest.cpp
@@ -287,7 +287,7 @@ TEST(ELFObjectFileTest, MachineTestForXtensa) {
 
 TEST(ELFObjectFileTest, CheckOSAndTriple) {
   std::tuple<uint16_t, uint8_t, StringRef> Formats[] = {
-      {ELF::EM_AMDGPU, ELF::ELFOSABI_AMDGPU_HSA, "amdgcn-amd-amdhsa"},
+      {ELF::EM_AMDGPU, ELF::ELFOSABI_AMDGPU_HSA, "amdgpu-amd-amdhsa"},
       {ELF::EM_X86_64, ELF::ELFOSABI_LINUX, "x86_64--linux"},
       {ELF::EM_X86_64, ELF::ELFOSABI_NETBSD, "x86_64--netbsd"},
       {ELF::EM_X86_64, ELF::ELFOSABI_HURD, "x86_64--hurd"},
diff --git a/llvm/unittests/TargetParser/TargetParserTest.cpp b/llvm/unittests/TargetParser/TargetParserTest.cpp
index a975c3039e7f4..b370d11ad1a16 100644
--- a/llvm/unittests/TargetParser/TargetParserTest.cpp
+++ b/llvm/unittests/TargetParser/TargetParserTest.cpp
@@ -8,6 +8,7 @@
 
 #include "llvm/TargetParser/TargetParser.h"
 #include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/ADT/StringRef.h"
@@ -15,6 +16,7 @@
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/FormatVariadic.h"
 #include "llvm/TargetParser/AArch64TargetParser.h"
+#include "llvm/TargetParser/AMDGPUTargetParser.h"
 #include "llvm/TargetParser/ARMTargetParser.h"
 #include "llvm/TargetParser/ARMTargetParserCommon.h"
 #include "llvm/TargetParser/SubtargetFeature.h"
@@ -2400,4 +2402,429 @@ TEST(TargetParserTest, checkFindSinglePrecisionFPU) {
   }
 }
 
+TEST(TargetParserTest, testAMDGPUArch) {
+  EXPECT_EQ(Triple("amdgpu--").getArch(), Triple::amdgpu);
+  EXPECT_EQ(Triple("amdgpu--").getSubArch(), Triple::NoSubArch);
+  EXPECT_EQ(Triple("amdgpu0--").getSubArch(), Triple::NoSubArch);
+  EXPECT_EQ(Triple("amdgpufoo--").getSubArch(), Triple::NoSubArch);
+
+  {
+    EXPECT_EQ(Triple("amdgpu6--").getSubArch(), Triple::AMDGPUSubArch6);
+    EXPECT_EQ(Triple("amdgpu6.0").getSubArch(), Triple::NoSubArch); // Unknown
+    EXPECT_EQ(Triple("amdgpu6.00").getSubArch(), Triple::AMDGPUSubArch600);
+    EXPECT_EQ(Triple("amdgpu6.01").getSubArch(), Triple::AMDGPUSubArch601);
+    EXPECT_EQ(Triple("amdgpu6.02").getSubArch(), Triple::AMDGPUSubArch602);
+    EXPECT_EQ(Triple("amdgpu6.03").getSubArch(), Triple::NoSubArch); // Unknown
+    EXPECT_EQ(Triple("amdgpu60").getSubArch(), Triple::NoSubArch);   // Unknown
+  }
+
+  {
+    EXPECT_EQ(Triple("amdgpu7--").getSubArch(), Triple::AMDGPUSubArch7);
+    EXPECT_EQ(Triple("amdgpu7.0--").getSubArch(), Triple::NoSubArch); // Unknown
+    EXPECT_EQ(Triple("amdgpu7.00").getSubArch(), Triple::AMDGPUSubArch700);
+    EXPECT_EQ(Triple("amdgpu7.01").getSubArch(), Triple::AMDGPUSubArch701);
+    EXPECT_EQ(Triple("amdgpu7.02").getSubArch(), Triple::AMDGPUSubArch702);
+    EXPECT_EQ(Triple("amdgpu7.03").getSubArch(), Triple::AMDGPUSubArch703);
+    EXPECT_EQ(Triple("amdgpu7.04").getSubArch(), Triple::AMDGPUSubArch704);
+    EXPECT_EQ(Triple("amdgpu7.05").getSubArch(), Triple::AMDGPUSubArch705);
+    EXPECT_EQ(Triple("amdgpu7.06").getSubArch(), Triple::NoSubArch); // Unknown
+    EXPECT_EQ(Triple("amdgpu71").getSubArch(), Triple::NoSubArch);   // Unknown
+  }
+
+  {
+    EXPECT_EQ(Triple("amdgpu8--").getSubArch(), Triple::AMDGPUSubArch8);
+    EXPECT_EQ(Triple("amdgpu8.0--").getSubArch(), Triple::NoSubArch); // Unknown
+    EXPECT_EQ(Triple("amdgpu8.01--").getSubArch(), Triple::AMDGPUSubArch801);
+    EXPECT_EQ(Triple("amdgpu8.02--").getSubArch(), Triple::AMDGPUSubArch802);
+    EXPECT_EQ(Triple("amdgpu8.03--").getSubArch(), Triple::AMDGPUSubArch803);
+    EXPECT_EQ(Triple("amdgpu8.05--").getSubArch(), Triple::AMDGPUSubArch805);
+    EXPECT_EQ(Triple("amdgpu8.1--").getSubArch(), Triple::NoSubArch); // Unknown
+    EXPECT_EQ(Triple("amdgpu8.10--").getSubArch(), Triple::AMDGPUSubArch810);
+    EXPECT_EQ(Triple("amdgpu81--").getSubArch(), Triple::NoSubArch); // Unknown
+  }
+
+  {
+    EXPECT_EQ(Triple("amdgpu9--").getArch(), Triple::amdgpu);
+    EXPECT_EQ(Triple("amdgpu9--").getSubArch(), Triple::AMDGPUSubArch9);
+    EXPECT_EQ(Triple("amdgpu9.0--").getSubArch(), Triple::NoSubArch); // Unknown
+    EXPECT_EQ(Triple("amdgpu9.00--").getSubArch(), Triple::AMDGPUSubArch900);
+    EXPECT_EQ(Triple("amdgpu9.02--").getSubArch(), Triple::AMDGPUSubArch902);
+    EXPECT_EQ(Triple("amdgpu9.04--").getSubArch(), Triple::AMDGPUSubArch904);
+    EXPECT_EQ(Triple("amdgpu9.06--").getSubArch(), Triple::AMDGPUSubArch906);
+    EXPECT_EQ(Triple("amdgpu9.08--").getSubArch(), Triple::AMDGPUSubArch908);
+    EXPECT_EQ(Triple("amdgpu9.0a--").getSubArch(), Triple::AMDGPUSubArch90A);
+    EXPECT_EQ(Triple("amdgpu9.0c--").getSubArch(), Triple::AMDGPUSubArch90C);
+
+    EXPECT_EQ(Triple("amdgpu9.4--").getSubArch(), Triple::AMDGPUSubArch9_4);
+    EXPECT_EQ(Triple("amdgpu9.42--").getSubArch(), Triple::AMDGPUSubArch942);
+    EXPECT_EQ(Triple("amdgpu9.50--").getSubArch(), Triple::AMDGPUSubArch950);
+    EXPECT_EQ(Triple("amdgpu99").getSubArch(), Triple::NoSubArch); // Unknown
+  }
+
+  {
+    EXPECT_EQ(Triple("amdgpu10--").getArch(), Triple::amdgpu);
+    EXPECT_EQ(Triple("amdgpu10--").getSubArch(), Triple::AMDGPUSubArch10_1);
+    EXPECT_EQ(Triple("amdgpu10.1--").getSubArch(), Triple::AMDGPUSubArch10_1);
+    EXPECT_EQ(Triple("amdgpu10.10--").getSubArch(), Triple::AMDGPUSubArch1010);
+    EXPECT_EQ(Triple("amdgpu10.11--").getSubArch(), Triple::AMDGPUSubArch1011);
+    EXPECT_EQ(Triple("amdgpu10.12--").getSubArch(), Triple::AMDGPUSubArch1012);
+    EXPECT_EQ(Triple("amdgpu10.13--").getSubArch(), Triple::AMDGPUSubArch1013);
+    EXPECT_EQ(Triple("amdgpu101").getSubArch(), Triple::NoSubArch); // Unknown
+  }
+
+  {
+    EXPECT_EQ(Triple("amdgpu10.3--").getSubArch(), Triple::AMDGPUSubArch10_3);
+    EXPECT_EQ(Triple("amdgpu10.30--").getSubArch(), Triple::AMDGPUSubArch1030);
+    EXPECT_EQ(Triple("amdgpu10.31--").getSubArch(), Triple::AMDGPUSubArch1031);
+    EXPECT_EQ(Triple("amdgpu10.32--").getSubArch(), Triple::AMDGPUSubArch1032);
+    EXPECT_EQ(Triple("amdgpu10.33--").getSubArch(), Triple::AMDGPUSubArch1033);
+    EXPECT_EQ(Triple("amdgpu10.34--").getSubArch(), Triple::AMDGPUSubArch1034);
+    EXPECT_EQ(Triple("amdgpu10.35--").getSubArch(), Triple::AMDGPUSubArch1035);
+    EXPECT_EQ(Triple("amdgpu10.36--").getSubArch(), Triple::AMDGPUSubArch1036);
+    EXPECT_EQ(Triple("amdgpu10.39").getSubArch(), Triple::NoSubArch); // Unknown
+  }
+
+  {
+    EXPECT_EQ(Triple("amdgpu11--").getSubArch(), Triple::AMDGPUSubArch11);
+    EXPECT_EQ(Triple("amdgpu11.0--").getSubArch(),
+              Triple::NoSubArch); // Unknown
+    EXPECT_EQ(Triple("amdgpu11.00--").getSubArch(), Triple::AMDGPUSubArch1100);
+    EXPECT_EQ(Triple("amdgpu11.01--").getSubArch(), Triple::AMDGPUSubArch1101);
+    EXPECT_EQ(Triple("amdgpu11.02--").getSubArch(), Triple::AMDGPUSubArch1102);
+    EXPECT_EQ(Triple("amdgpu11.03--").getSubArch(), Triple::AMDGPUSubArch1103);
+    EXPECT_EQ(Triple("amdgpu11.5--").getSubArch(),
+              Triple::NoSubArch); // Unknown
+    EXPECT_EQ(Triple("amdgpu11.50--").getSubArch(), Triple::AMDGPUSubArch1150);
+    EXPECT_EQ(Triple("amdgpu11.51--").getSubArch(), Triple::AMDGPUSubArch1151);
+    EXPECT_EQ(Triple("amdgpu11.52--").getSubArch(), Triple::AMDGPUSubArch1152);
+    EXPECT_EQ(Triple("amdgpu11.53--").getSubArch(), Triple::AMDGPUSubArch1153);
+    EXPECT_EQ(Triple("amdgpu11.54--").getSubArch(), Triple::AMDGPUSubArch1154);
+    EXPECT_EQ(Triple("amdgpu11.7--").getSubArch(), Triple::AMDGPUSubArch11_7);
+    EXPECT_EQ(Triple("amdgpu11.70--").getSubArch(), Triple::AMDGPUSubArch1170);
+    EXPECT_EQ(Triple("amdgpu11.71--").getSubArch(), Triple::AMDGPUSubArch1171);
+    EXPECT_EQ(Triple("amdgpu11.72--").getSubArch(), Triple::AMDGPUSubArch1172);
+    EXPECT_EQ(Triple("amdgpu111--").getSubArch(), Triple::NoSubArch); // Unknown
+  }
+
+  {
+    EXPECT_EQ(Triple("amdgpu12--").getSubArch(), Triple::AMDGPUSubArch12);
+    EXPECT_EQ(Triple("amdgpu12.0--").getSubArch(),
+              Triple::NoSubArch); // Unknown
+    EXPECT_EQ(Triple("amdgpu12.00--").getSubArch(), Triple::AMDGPUSubArch1200);
+    EXPECT_EQ(Triple("amdgpu12.01--").getSubArch(), Triple::AMDGPUSubArch1201);
+    EXPECT_EQ(Triple("amdgpu12.5--").getSubArch(), Triple::AMDGPUSubArch12_5);
+    EXPECT_EQ(Triple("amdgpu12.50--").getSubArch(), Triple::AMDGPUSubArch1250);
+    EXPECT_EQ(Triple("amdgpu12.51--").getSubArch(), Triple::AMDGPUSubArch1251);
+    EXPECT_EQ(Triple("amdgpu122--").getSubArch(), Triple::NoSubArch); // Unknown
+    EXPECT_EQ(Triple("amdgpu12.59--").getSubArch(),
+              Triple::NoSubArch); // Unknown
+  }
+
+  {
+    EXPECT_EQ(Triple("amdgpu13--").getSubArch(), Triple::AMDGPUSubArch13);
+    EXPECT_EQ(Triple("amdgpu13.10--").getSubArch(), Triple::AMDGPUSubArch1310);
+    EXPECT_EQ(Triple("amdgpu13.1").getSubArch(), Triple::NoSubArch); // Unknown
+    EXPECT_EQ(Triple("amdgpu131").getSubArch(), Triple::NoSubArch);  // Unknown
+  }
+}
+
+TEST(TargetParserTest, testAMDGPUgetMajorSubArch) {
+  // Make sure every subarch is handled by the function
+  for (unsigned SubArch = Triple::FirstAMDGPUSubArch;
+       SubArch <= Triple::LastAMDGPUSubArch; ++SubArch) {
+
+    EXPECT_NE(
+        AMDGPU::getMajorSubArch(static_cast<Triple::SubArchType>(SubArch)),
+        Triple::NoSubArch);
+  }
+}
+
+TEST(TargetParserTest, testAMDGPUisSubArchCompatible) {
+  // A major-family subarch is compatible with itself and with any specific
+  // subarch in its family.
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch9,
+                                          Triple::AMDGPUSubArch9));
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch9,
+                                          Triple::AMDGPUSubArch900));
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch900,
+                                          Triple::AMDGPUSubArch9));
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch9,
+                                          Triple::AMDGPUSubArch90C));
+
+  // NoSubArch is compatible with anything.
+  EXPECT_TRUE(
+      AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch9, Triple::NoSubArch));
+  EXPECT_TRUE(
+      AMDGPU::isSubArchCompatible(Triple::NoSubArch, Triple::AMDGPUSubArch9));
+  EXPECT_TRUE(
+      AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch900, Triple::NoSubArch));
+  EXPECT_TRUE(
+      AMDGPU::isSubArchCompatible(Triple::NoSubArch, Triple::AMDGPUSubArch900));
+
+  // gfx9 and gfx9.4 are distinct major families.
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch9,
+                                           Triple::AMDGPUSubArch9_4));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch9,
+                                           Triple::AMDGPUSubArch942));
+
+  // gfx908 and gfx90a are their own major families, not part of gfx9-generic,
+  // because they have ABI-incompatible feature differences (e.g. gfx90a
+  // requires aligned VGPRs).
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch9,
+                                           Triple::AMDGPUSubArch908));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch9,
+                                           Triple::AMDGPUSubArch90A));
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch90A,
+                                          Triple::AMDGPUSubArch90A));
+
+  // gfx11 and gfx11.7 are distinct major families.
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch11_7,
+                                          Triple::AMDGPUSubArch11_7));
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch11_7,
+                                          Triple::AMDGPUSubArch1170));
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch1172,
+                                          Triple::AMDGPUSubArch11_7));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch11,
+                                           Triple::AMDGPUSubArch11_7));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch11,
+                                           Triple::AMDGPUSubArch1170));
+
+  // Two specific subarches in the same family are not compatible with each
+  // other; only the major-family subarch is.
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch900,
+                                           Triple::AMDGPUSubArch90A));
+
+  // Different major families are incompatible.
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch9,
+                                           Triple::AMDGPUSubArch10_3));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch10_3,
+                                           Triple::AMDGPUSubArch9));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch900,
+                                           Triple::AMDGPUSubArch1030));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch1030,
+                                           Triple::AMDGPUSubArch900));
+
+  // NoSubArch is compatible with anything.
+  EXPECT_TRUE(
+      AMDGPU::isSubArchCompatible(Triple::NoSubArch, Triple::NoSubArch));
+  EXPECT_TRUE(
+      AMDGPU::isSubArchCompatible(Triple::NoSubArch, Triple::AMDGPUSubArch9));
+  EXPECT_TRUE(
+      AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch9, Triple::NoSubArch));
+  EXPECT_TRUE(
+      AMDGPU::isSubArchCompatible(Triple::NoSubArch, Triple::AMDGPUSubArch900));
+
+  // The Triple-based overload checks the same compatibility.
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple("amdgpu9-amd-amdhsa"),
+                                          Triple("amdgpu9.00-amd-amdhsa")));
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple("amdgpu-amd-amdhsa"),
+                                          Triple("amdgpu9.00-amd-amdhsa")));
+
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple("amdgpu9.00-amd-amdhsa"),
+                                           Triple("amdgpu9.0a-amd-amdhsa")));
+
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple("amdgpu9.0a-amd-amdhsa"),
+                                           Triple("amdgpu9.00-amd-amdhsa")));
+
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple("amdgpu9-amd-amdhsa"),
+                                           Triple("amdgpu10.3-amd-amdhsa")));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple("amdgpu10.3-amd-amdhsa"),
+                                           Triple("amdgpu9-amd-amdhsa")));
+
+  // An unrecognized subarch is incompatible with any recognized subarch.
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple("amdgpu9.99-amd-amdhsa"),
+                                           Triple("amdgpu9.00-amd-amdhsa")));
+}
+
+TEST(TargetParserTest, testAMDGPUisCPUValidForSubArch) {
+  EXPECT_TRUE(
+      AMDGPU::isCPUValidForSubArch(Triple::AMDGPUSubArch9, AMDGPU::GK_GFX900));
+  EXPECT_TRUE(AMDGPU::isCPUValidForSubArch(Triple::AMDGPUSubArch9, "gfx900"));
+
+  EXPECT_TRUE(AMDGPU::isCPUValidForSubArch(Triple::AMDGPUSubArch900,
+                                           AMDGPU::GK_GFX900));
+  EXPECT_TRUE(AMDGPU::isCPUValidForSubArch(Triple::AMDGPUSubArch900, "gfx900"));
+
+  EXPECT_FALSE(AMDGPU::isCPUValidForSubArch(Triple::AMDGPUSubArch900,
+                                            AMDGPU::GK_GFX902));
+  EXPECT_FALSE(
+      AMDGPU::isCPUValidForSubArch(Triple::AMDGPUSubArch900, "gfx902"));
+
+  EXPECT_TRUE(
+      AMDGPU::isCPUValidForSubArch(Triple::NoSubArch, AMDGPU::GK_GFX900));
+  EXPECT_TRUE(AMDGPU::isCPUValidForSubArch(Triple::NoSubArch, "gfx900"));
+
+  EXPECT_FALSE(
+      AMDGPU::isCPUValidForSubArch(Triple::NoSubArch, AMDGPU::GK_NONE));
+  EXPECT_FALSE(AMDGPU::isCPUValidForSubArch(Triple::NoSubArch, ""));
+}
+
+TEST(TargetParserTest, testAMDGPUfillValidArchListAMDGCN) {
+  SmallVector<StringRef, 0> All;
+  AMDGPU::fillValidArchListAMDGCN(All, Triple::NoSubArch);
+  EXPECT_FALSE(All.empty());
+
+  SmallVector<StringRef, 16> Filtered;
+
+  // For every subarch, the filtered list must agree exactly with
+  // isCPUValidForSubArch over the full set of names.
+  for (unsigned SA = Triple::FirstAMDGPUSubArch;
+       SA <= Triple::LastAMDGPUSubArch; ++SA) {
+    auto SubArch = static_cast<Triple::SubArchType>(SA);
+    Triple::SubArchType Major = AMDGPU::getMajorSubArch(SubArch);
+
+    AMDGPU::fillValidArchListAMDGCN(Filtered, SubArch);
+
+    for (StringRef Name : All) {
+      AMDGPU::GPUKind Kind = AMDGPU::parseArchAMDGCN(Name);
+      bool Valid = AMDGPU::isCPUValidForSubArch(SubArch, Kind);
+      EXPECT_EQ(Valid, llvm::is_contained(Filtered, Name))
+          << "subarch " << Triple::getArchName(Triple::amdgpu, SubArch)
+          << " name " << Name;
+    }
+
+    for (StringRef Name : Filtered)
+      EXPECT_TRUE(llvm::is_contained(All, Name)) << Name;
+
+    // A specific subarch matches its own concrete GPU, plus the family-generic
+    // GPU. Names may repeat through aliases, so compare distinct GPUKinds.
+    if (Major != SubArch) {
+      SmallSet<AMDGPU::GPUKind, 2> Kinds;
+      for (StringRef Name : Filtered)
+        Kinds.insert(AMDGPU::parseArchAMDGCN(Name));
+
+      bool FamilyHasGeneric =
+          AMDGPU::getGPUKindFromSubArch(Major) != AMDGPU::GK_NONE;
+      EXPECT_EQ(Kinds.size(), FamilyHasGeneric ? 2u : 1u)
+          << "subarch " << Triple::getArchName(Triple::amdgpu, SubArch);
+    }
+
+    Filtered.clear();
+  }
+}
+
+TEST(TargetParserTest, testAMDGPUgetGPUKindFromSubArch) {
+  EXPECT_EQ(AMDGPU::getGPUKindFromSubArch(Triple::NoSubArch), AMDGPU::GK_NONE);
+
+  struct SubArchMapping {
+    Triple::SubArchType SubArch;
+    AMDGPU::GPUKind Kind;
+  };
+
+  static const SubArchMapping Mappings[] = {
+      // GFX6 family
+      {Triple::AMDGPUSubArch6, AMDGPU::GK_NONE},
+      {Triple::AMDGPUSubArch600, AMDGPU::GK_GFX600},
+      {Triple::AMDGPUSubArch601, AMDGPU::GK_GFX601},
+      {Triple::AMDGPUSubArch602, AMDGPU::GK_GFX602},
+
+      // GFX7 family
+      {Triple::AMDGPUSubArch7, AMDGPU::GK_NONE},
+      {Triple::AMDGPUSubArch700, AMDGPU::GK_GFX700},
+      {Triple::AMDGPUSubArch701, AMDGPU::GK_GFX701},
+      {Triple::AMDGPUSubArch702, AMDGPU::GK_GFX702},
+      {Triple::AMDGPUSubArch703, AMDGPU::GK_GFX703},
+      {Triple::AMDGPUSubArch704, AMDGPU::GK_GFX704},
+      {Triple::AMDGPUSubArch705, AMDGPU::GK_GFX705},
+
+      // GFX8 family
+      {Triple::AMDGPUSubArch8, AMDGPU::GK_NONE},
+      {Triple::AMDGPUSubArch801, AMDGPU::GK_GFX801},
+      {Triple::AMDGPUSubArch802, AMDGPU::GK_GFX802},
+      {Triple::AMDGPUSubArch803, AMDGPU::GK_GFX803},
+      {Triple::AMDGPUSubArch805, AMDGPU::GK_GFX805},
+      {Triple::AMDGPUSubArch810, AMDGPU::GK_GFX810},
+
+      // GFX9 family
+      {Triple::AMDGPUSubArch9, AMDGPU::GK_GFX9_GENERIC},
+      {Triple::AMDGPUSubArch900, AMDGPU::GK_GFX900},
+      {Triple::AMDGPUSubArch902, AMDGPU::GK_GFX902},
+      {Triple::AMDGPUSubArch904, AMDGPU::GK_GFX904},
+      {Triple::AMDGPUSubArch906, AMDGPU::GK_GFX906},
+      {Triple::AMDGPUSubArch908, AMDGPU::GK_GFX908},
+      {Triple::AMDGPUSubArch909, AMDGPU::GK_GFX909},
+      {Triple::AMDGPUSubArch90A, AMDGPU::GK_GFX90A},
+      {Triple::AMDGPUSubArch90C, AMDGPU::GK_GFX90C},
+      {Triple::AMDGPUSubArch9_4, AMDGPU::GK_GFX9_4_GENERIC},
+      {Triple::AMDGPUSubArch942, AMDGPU::GK_GFX942},
+      {Triple::AMDGPUSubArch950, AMDGPU::GK_GFX950},
+
+      // GFX10 family
+      {Triple::AMDGPUSubArch10_1, AMDGPU::GK_GFX10_1_GENERIC},
+      {Triple::AMDGPUSubArch1010, AMDGPU::GK_GFX1010},
+      {Triple::AMDGPUSubArch1011, AMDGPU::GK_GFX1011},
+      {Triple::AMDGPUSubArch1012, AMDGPU::GK_GFX1012},
+      {Triple::AMDGPUSubArch1013, AMDGPU::GK_GFX1013},
+      {Triple::AMDGPUSubArch10_3, AMDGPU::GK_GFX10_3_GENERIC},
+      {Triple::AMDGPUSubArch1030, AMDGPU::GK_GFX1030},
+      {Triple::AMDGPUSubArch1031, AMDGPU::GK_GFX1031},
+      {Triple::AMDGPUSubArch1032, AMDGPU::GK_GFX1032},
+      {Triple::AMDGPUSubArch1033, AMDGPU::GK_GFX1033},
+      {Triple::AMDGPUSubArch1034, AMDGPU::GK_GFX1034},
+      {Triple::AMDGPUSubArch1035, AMDGPU::GK_GFX1035},
+      {Triple::AMDGPUSubArch1036, AMDGPU::GK_GFX1036},
+
+      // GFX11 family
+      {Triple::AMDGPUSubArch11, AMDGPU::GK_GFX11_GENERIC},
+      {Triple::AMDGPUSubArch1100, AMDGPU::GK_GFX1100},
+      {Triple::AMDGPUSubArch1101, AMDGPU::GK_GFX1101},
+      {Triple::AMDGPUSubArch1102, AMDGPU::GK_GFX1102},
+      {Triple::AMDGPUSubArch1103, AMDGPU::GK_GFX1103},
+      {Triple::AMDGPUSubArch1150, AMDGPU::GK_GFX1150},
+      {Triple::AMDGPUSubArch1151, AMDGPU::GK_GFX1151},
+      {Triple::AMDGPUSubArch1152, AMDGPU::GK_GFX1152},
+      {Triple::AMDGPUSubArch1153, AMDGPU::GK_GFX1153},
+      {Triple::AMDGPUSubArch1154, AMDGPU::GK_GFX1154},
+      {Triple::AMDGPUSubArch11_7, AMDGPU::GK_GFX11_7_GENERIC},
+      {Triple::AMDGPUSubArch1170, AMDGPU::GK_GFX1170},
+      {Triple::AMDGPUSubArch1171, AMDGPU::GK_GFX1171},
+      {Triple::AMDGPUSubArch1172, AMDGPU::GK_GFX1172},
+
+      // GFX12 family
+      {Triple::AMDGPUSubArch12, AMDGPU::GK_GFX12_GENERIC},
+      {Triple::AMDGPUSubArch1200, AMDGPU::GK_GFX1200},
+      {Triple::AMDGPUSubArch1201, AMDGPU::GK_GFX1201},
+      {Triple::AMDGPUSubArch12_5, AMDGPU::GK_GFX12_5_GENERIC},
+      {Triple::AMDGPUSubArch1250, AMDGPU::GK_GFX1250},
+      {Triple::AMDGPUSubArch1251, AMDGPU::GK_GFX1251},
+
+      // GFX13 family
+      {Triple::AMDGPUSubArch13, AMDGPU::GK_GFX13_GENERIC},
+      {Triple::AMDGPUSubArch1310, AMDGPU::GK_GFX1310},
+  };
+
+  for (const auto &Mapping : Mappings)
+    EXPECT_EQ(AMDGPU::getGPUKindFromSubArch(Mapping.SubArch), Mapping.Kind);
+}
+
+TEST(TargetParserTest, testAMDGPUgetIsaVersionFromSubArch) {
+  // Concrete subarches map to their exact ISA version.
+  EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch600),
+            (AMDGPU::IsaVersion{6, 0, 0}));
+  EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch900),
+            (AMDGPU::IsaVersion{9, 0, 0}));
+  EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch1250),
+            (AMDGPU::IsaVersion{12, 5, 0}));
+  EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch1251),
+            (AMDGPU::IsaVersion{12, 5, 1}));
+  EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch1310),
+            (AMDGPU::IsaVersion{13, 1, 0}));
+
+  // Generic subarches map to the generic target's version.
+  EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch9),
+            (AMDGPU::IsaVersion{9, 0, 0}));
+  EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch12),
+            (AMDGPU::IsaVersion{12, 0, 0}));
+  EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch12_5),
+            (AMDGPU::IsaVersion{12, 5, 0}));
+
+  // Major-family subarches with no associated GPU have no version.
+  EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch6),
+            (AMDGPU::IsaVersion{0, 0, 0}));
+  EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch13),
+            (AMDGPU::IsaVersion{13, 1, 0}));
+  EXPECT_EQ(AMDGPU::getIsaVersion(Triple::NoSubArch),
+            (AMDGPU::IsaVersion{0, 0, 0}));
+}
+
 } // namespace
diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp
index 0486b113e9354..cfe3bc6abf72f 100644
--- a/llvm/unittests/TargetParser/TripleTest.cpp
+++ b/llvm/unittests/TargetParser/TripleTest.cpp
@@ -687,19 +687,25 @@ TEST(TripleTest, ParsedIDs) {
   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
 
   T = Triple("amdgcn-mesa-mesa3d");
-  EXPECT_EQ(Triple::amdgcn, T.getArch());
+  EXPECT_EQ(Triple::amdgpu, T.getArch());
+  EXPECT_EQ(Triple::Mesa, T.getVendor());
+  EXPECT_EQ(Triple::Mesa3D, T.getOS());
+  EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
+
+  T = Triple("amdgpu-mesa-mesa3d");
+  EXPECT_EQ(Triple::amdgpu, T.getArch());
   EXPECT_EQ(Triple::Mesa, T.getVendor());
   EXPECT_EQ(Triple::Mesa3D, T.getOS());
   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
 
   T = Triple("amdgcn-amd-amdhsa");
-  EXPECT_EQ(Triple::amdgcn, T.getArch());
+  EXPECT_EQ(Triple::amdgpu, T.getArch());
   EXPECT_EQ(Triple::AMD, T.getVendor());
   EXPECT_EQ(Triple::AMDHSA, T.getOS());
   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
 
   T = Triple("amdgcn-amd-amdpal");
-  EXPECT_EQ(Triple::amdgcn, T.getArch());
+  EXPECT_EQ(Triple::amdgpu, T.getArch());
   EXPECT_EQ(Triple::AMD, T.getVendor());
   EXPECT_EQ(Triple::AMDPAL, T.getOS());
   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
@@ -1479,35 +1485,35 @@ TEST(TripleTest, ParsedIDs) {
 
 TEST(TripleTest, EnumConstructor) {
   {
-    Triple T(Triple::amdgcn, Triple::NoSubArch, Triple::AMD, Triple::AMDHSA);
-    EXPECT_EQ(T.getArch(), Triple::amdgcn);
+    Triple T(Triple::amdgpu, Triple::NoSubArch, Triple::AMD, Triple::AMDHSA);
+    EXPECT_EQ(T.getArch(), Triple::amdgpu);
     EXPECT_EQ(T.getVendor(), Triple::AMD);
     EXPECT_EQ(T.getOS(), Triple::AMDHSA);
     EXPECT_EQ(T.getEnvironment(), Triple::UnknownEnvironment);
     EXPECT_EQ(T.getObjectFormat(), Triple::ELF);
-    EXPECT_EQ(T.str(), "amdgcn-amd-amdhsa");
+    EXPECT_EQ(T.str(), "amdgpu-amd-amdhsa");
   }
 
   {
-    Triple T(Triple::amdgcn, Triple::NoSubArch, Triple::AMD, Triple::AMDHSA,
+    Triple T(Triple::amdgpu, Triple::NoSubArch, Triple::AMD, Triple::AMDHSA,
              Triple::LLVM, Triple::ELF);
-    EXPECT_EQ(T.getArch(), Triple::amdgcn);
+    EXPECT_EQ(T.getArch(), Triple::amdgpu);
     EXPECT_EQ(T.getVendor(), Triple::AMD);
     EXPECT_EQ(T.getOS(), Triple::AMDHSA);
     EXPECT_EQ(T.getEnvironment(), Triple::LLVM);
     EXPECT_EQ(T.getObjectFormat(), Triple::ELF);
-    EXPECT_EQ(T.str(), "amdgcn-amd-amdhsa-llvm-elf");
+    EXPECT_EQ(T.str(), "amdgpu-amd-amdhsa-llvm-elf");
   }
 
   {
-    Triple T(Triple::amdgcn, Triple::NoSubArch, Triple::AMD, Triple::AMDHSA,
+    Triple T(Triple::amdgpu, Triple::NoSubArch, Triple::AMD, Triple::AMDHSA,
              Triple::LLVM);
-    EXPECT_EQ(T.getArch(), Triple::amdgcn);
+    EXPECT_EQ(T.getArch(), Triple::amdgpu);
     EXPECT_EQ(T.getVendor(), Triple::AMD);
     EXPECT_EQ(T.getOS(), Triple::AMDHSA);
     EXPECT_EQ(T.getEnvironment(), Triple::LLVM);
     EXPECT_EQ(T.getObjectFormat(), Triple::ELF);
-    EXPECT_EQ(T.str(), "amdgcn-amd-amdhsa-llvm");
+    EXPECT_EQ(T.str(), "amdgpu-amd-amdhsa-llvm");
   }
 
   {
@@ -1998,6 +2004,18 @@ TEST(TripleTest, BitWidthChecks) {
   EXPECT_TRUE(T.isArch64Bit());
   EXPECT_EQ(T.getArchPointerBitWidth(), 64U);
 
+  T.setArch(Triple::amdgpu);
+  EXPECT_FALSE(T.isArch16Bit());
+  EXPECT_FALSE(T.isArch32Bit());
+  EXPECT_TRUE(T.isArch64Bit());
+  EXPECT_EQ(T.getArchPointerBitWidth(), 64U);
+
+  T.setArch(Triple::amdgpu);
+  EXPECT_FALSE(T.isArch16Bit());
+  EXPECT_FALSE(T.isArch32Bit());
+  EXPECT_TRUE(T.isArch64Bit());
+  EXPECT_EQ(T.getArchPointerBitWidth(), 64U);
+
   T.setArch(Triple::hsail);
   EXPECT_FALSE(T.isArch16Bit());
   EXPECT_TRUE(T.isArch32Bit());
@@ -2972,6 +2990,10 @@ TEST(TripleTest, FileFormat) {
   EXPECT_EQ(Triple::SPIRV, Triple("spirv32-unknown-unknown").getObjectFormat());
   EXPECT_EQ(Triple::SPIRV, Triple("spirv64-unknown-unknown").getObjectFormat());
 
+  EXPECT_EQ(Triple::ELF, Triple("amdgcn-unknown-unknown").getObjectFormat());
+  EXPECT_EQ(Triple::ELF, Triple("amdgpu-unknown-unknown").getObjectFormat());
+  EXPECT_EQ(Triple::ELF, Triple("amdgpu-amd-amdhsa").getObjectFormat());
+
   EXPECT_EQ(Triple::ELF,
             Triple("loongarch32-unknown-unknown").getObjectFormat());
   EXPECT_EQ(Triple::ELF, Triple("loongarch64-unknown-linux").getObjectFormat());
@@ -3013,6 +3035,7 @@ TEST(TripleTest, FileFormat) {
   EXPECT_EQ("spirv", Triple::getObjectFormatTypeName(T.getObjectFormat()));
 
   EXPECT_EQ(Triple::ELF, Triple("amdgcn-apple-macosx").getObjectFormat());
+  EXPECT_EQ(Triple::ELF, Triple("amdgpu-apple-macosx").getObjectFormat());
   EXPECT_EQ(Triple::ELF, Triple("r600-apple-macosx").getObjectFormat());
   EXPECT_EQ(Triple::SPIRV, Triple("spirv-apple-macosx").getObjectFormat());
   EXPECT_EQ(Triple::SPIRV, Triple("spirv32-apple-macosx").getObjectFormat());
@@ -3054,6 +3077,8 @@ TEST(TripleTest, DefaultExceptionHandling) {
 
   EXPECT_EQ(ExceptionHandling::None,
             Triple("amdgcn--").getDefaultExceptionHandling());
+  EXPECT_EQ(ExceptionHandling::None,
+            Triple("amdgpu--").getDefaultExceptionHandling());
   EXPECT_EQ(ExceptionHandling::None,
             Triple("nvptx64--").getDefaultExceptionHandling());
   EXPECT_EQ(ExceptionHandling::None,
@@ -3505,6 +3530,107 @@ TEST(TripleTest, isCompatibleWith) {
       {"i686-w64-windows-gnu", "i386-w64-windows-gnu", true},
       {"x86_64-w64-windows-gnu", "x86_64-pc-windows-gnu", true},
       {"armv7-w64-windows-gnu", "thumbv7-pc-windows-gnu", true},
+      {"amdgpu9-amd-amdhsa", "amdgpu-amd-amdhsa", true},
+      {"amdgpu9-amd-amdhsa-llvm", "amdgpu-amd-amdhsa", false},
+      {"amdgpu6-amd-amdhsa-llvm", "amdgpu9-amd-amdhsa", false},
+      {"amdgpu9-amd-amdhsa-coff", "amdgpu9-amd-amdhsa", false},
+      {"amdgpu-unknown-amdhsa-coff", "amdgpu-amd-amdhsa", false},
+      {"amdgpu9-amd-amdhsa-llvm", "amdgpu9-amd-amdhsa", false},
+
+      {"amdgpu6-amd-amdhsa", "amdgpu6.00-amd-amdhsa", true},
+      {"amdgpu6-amd-amdhsa", "amdgpu6.01-amd-amdhsa", true},
+      {"amdgpu6-amd-amdhsa", "amdgpu6.02-amd-amdhsa", true},
+      {"amdgpu6-amd-amdhsa", "amdgpu7-amd-amdhsa", false},
+      {"amdgpu6-amd-amdhsa", "amdgpu8-amd-amdhsa", false},
+      {"amdgpu6-amd-amdhsa", "amdgpu9-amd-amdhsa", false},
+      {"amdgpu6-amd-amdhsa", "amdgpu9.4-amd-amdhsa", false},
+      {"amdgpu6-amd-amdhsa", "amdgpu10.1-amd-amdhsa", false},
+      {"amdgpu6-amd-amdhsa", "amdgpu7.00-amd-amdhsa", false},
+      {"amdgpu6-amd-amdhsa", "amdgpu700-amd-amdhsa", false},
+
+      {"amdgpu7-amd-amdhsa", "amdgpu7.00-amd-amdhsa", true},
+      {"amdgpu7-amd-amdhsa", "amdgpu7.01-amd-amdhsa", true},
+      {"amdgpu7-amd-amdhsa", "amdgpu7.02-amd-amdhsa", true},
+      {"amdgpu7-amd-amdhsa", "amdgpu7.03-amd-amdhsa", true},
+      {"amdgpu7-amd-amdhsa", "amdgpu7.04-amd-amdhsa", true},
+      {"amdgpu7-amd-amdhsa", "amdgpu7.05-amd-amdhsa", true},
+      {"amdgpu7-amd-amdhsa", "amdgpu8-amd-amdhsa", false},
+
+      {"amdgpu8-amd-amdhsa", "amdgpu8.01-amd-amdhsa", true},
+      {"amdgpu8-amd-amdhsa", "amdgpu8.02-amd-amdhsa", true},
+      {"amdgpu8-amd-amdhsa", "amdgpu8.03-amd-amdhsa", true},
+      {"amdgpu8-amd-amdhsa", "amdgpu8.10-amd-amdhsa", false},
+
+      {"amdgpu9-amd-amdhsa", "amdgpu9.00-amd-amdhsa", true},
+      {"amdgpu9-amd-amdhsa", "amdgpu9.02-amd-amdhsa", true},
+      {"amdgpu9-amd-amdhsa", "amdgpu9.04-amd-amdhsa", true},
+      {"amdgpu9-amd-amdhsa", "amdgpu9.06-amd-amdhsa", true},
+      {"amdgpu9-amd-amdhsa", "amdgpu9.08-amd-amdhsa", false},
+      {"amdgpu9-amd-amdhsa", "amdgpu9.09-amd-amdhsa", true},
+      {"amdgpu9-amd-amdhsa", "amdgpu9.0a-amd-amdhsa", false},
+      {"amdgpu9-amd-amdhsa", "amdgpu9.0c-amd-amdhsa", true},
+      {"amdgpu9.08-amd-amdhsa", "amdgpu9.08-amd-amdhsa", true},
+      {"amdgpu9.0a-amd-amdhsa", "amdgpu9.0a-amd-amdhsa", true},
+      {"amdgpu9-amd-amdhsa", "amdgpu9.4-amd-amdhsa", false},
+      {"amdgpu9-amd-amdhsa", "amdgpu9.42-amd-amdhsa", false},
+      {"amdgpu9-amd-amdhsa", "amdgpu9.50-amd-amdhsa", false},
+      {"amdgpu9.00-amd-amdhsa", "amdgpu9.50-amd-amdhsa", false},
+      {"amdgpu9.50-amd-amdhsa", "amdgpu9.00-amd-amdhsa", false},
+      {"amdgpu9.00-amd-amdhsa", "amdgpu9.08-amd-amdhsa", false},
+      {"amdgpu9.08-amd-amdhsa", "amdgpu9.00-amd-amdhsa", false},
+      {"amdgpu9.00-amd-amdhsa", "amdgpu9.06-amd-amdhsa", false},
+      {"amdgpu9.06-amd-amdhsa", "amdgpu9.00-amd-amdhsa", false},
+      {"amdgpu10.1-amd-amdhsa", "amdgpu10.10-amd-amdhsa", true},
+      {"amdgpu10.1-amd-amdhsa", "amdgpu10.11-amd-amdhsa", true},
+      {"amdgpu10.1-amd-amdhsa", "amdgpu10.12-amd-amdhsa", true},
+      {"amdgpu10.1-amd-amdhsa", "amdgpu10.13-amd-amdhsa", true},
+
+      {"amdgpu10.3-amd-amdhsa", "amdgpu10.1-amd-amdhsa", false},
+      {"amdgpu10.3-amd-amdhsa", "amdgpu10.10-amd-amdhsa", false},
+      {"amdgpu10.3-amd-amdhsa", "amdgpu10.30-amd-amdhsa", true},
+      {"amdgpu10.3-amd-amdhsa", "amdgpu10.31-amd-amdhsa", true},
+      {"amdgpu10.3-amd-amdhsa", "amdgpu10.32-amd-amdhsa", true},
+      {"amdgpu10.3-amd-amdhsa", "amdgpu10.33-amd-amdhsa", true},
+      {"amdgpu10.3-amd-amdhsa", "amdgpu10.34-amd-amdhsa", true},
+      {"amdgpu10.3-amd-amdhsa", "amdgpu10.35-amd-amdhsa", true},
+      {"amdgpu10.3-amd-amdhsa", "amdgpu10.36-amd-amdhsa", true},
+
+      {"amdgpu11-amd-amdhsa", "amdgpu10.1-amd-amdhsa", false},
+      {"amdgpu11-amd-amdhsa", "amdgpu11.00-amd-amdhsa", true},
+      {"amdgpu11-amd-amdhsa", "amdgpu11.01-amd-amdhsa", true},
+      {"amdgpu11-amd-amdhsa", "amdgpu11.02-amd-amdhsa", true},
+      {"amdgpu11-amd-amdhsa", "amdgpu11.03-amd-amdhsa", true},
+      {"amdgpu11-amd-amdhsa", "amdgpu11.50-amd-amdhsa", true},
+      {"amdgpu11-amd-amdhsa", "amdgpu11.51-amd-amdhsa", true},
+      {"amdgpu11-amd-amdhsa", "amdgpu11.52-amd-amdhsa", true},
+      {"amdgpu11-amd-amdhsa", "amdgpu11.53-amd-amdhsa", true},
+      {"amdgpu11-amd-amdhsa", "amdgpu11.54-amd-amdhsa", true},
+      {"amdgpu11-amd-amdhsa", "amdgpu11.7-amd-amdhsa", false},
+      {"amdgpu11-amd-amdhsa", "amdgpu11.70-amd-amdhsa", false},
+      {"amdgpu11-amd-amdhsa", "amdgpu11.71-amd-amdhsa", false},
+      {"amdgpu11-amd-amdhsa", "amdgpu11.72-amd-amdhsa", false},
+
+      {"amdgpu11.7-amd-amdhsa", "amdgpu11-amd-amdhsa", false},
+      {"amdgpu11.7-amd-amdhsa", "amdgpu11.70-amd-amdhsa", true},
+      {"amdgpu11.7-amd-amdhsa", "amdgpu11.71-amd-amdhsa", true},
+      {"amdgpu11.7-amd-amdhsa", "amdgpu11.72-amd-amdhsa", true},
+
+      {"amdgpu12-amd-amdhsa", "amdgpu12.00-amd-amdhsa", true},
+      {"amdgpu12-amd-amdhsa", "amdgpu12.01-amd-amdhsa", true},
+      {"amdgpu12-amd-amdhsa", "amdgpu12.5-amd-amdhsa", false},
+      {"amdgpu12-amd-amdhsa", "amdgpu12.50-amd-amdhsa", false},
+      {"amdgpu12-amd-amdhsa", "amdgpu12.51-amd-amdhsa", false},
+
+      {"amdgpu12.5-amd-amdhsa", "amdgpu12.50-amd-amdhsa", true},
+      {"amdgpu12.5-amd-amdhsa", "amdgpu12.51-amd-amdhsa", true},
+
+      {"amdgpu13-amd-amdhsa", "amdgpu13.10-amd-amdhsa", true},
+
+      // A vendor mismatch is incompatible even when the subarch is otherwise
+      // compatible.
+      {"amdgpu9-amd-amdhsa", "amdgpu9.00-unknown-amdhsa", false},
+      {"amdgpu9.00-amd-amdhsa", "amdgpu9.00-unknown-amdhsa", false},
+      {"amdgpu12.5-amd-amdhsa", "amdgpu12.50-unknown-amdhsa", false},
   };
 
   auto DoTest = [](const char *A, const char *B,
@@ -3523,6 +3649,68 @@ TEST(TripleTest, isCompatibleWith) {
   }
 }
 
+TEST(TripleTest, Merge) {
+  // Baseline: merging identical triples returns that triple.
+  EXPECT_EQ("x86_64-unknown-linux-gnu",
+            Triple(Triple::normalize("x86_64-unknown-linux-gnu"))
+                .merge(Triple(Triple::normalize("x86_64-unknown-linux-gnu"))));
+
+  // General rule (no Apple/AMDGPU special case): the merge takes the other
+  // triple.
+  EXPECT_EQ("i386-unknown-linux-gnu",
+            Triple(Triple::normalize("x86_64-unknown-linux-gnu"))
+                .merge(Triple(Triple::normalize("i386-unknown-linux-gnu"))));
+  EXPECT_EQ("x86_64-unknown-linux-gnu",
+            Triple(Triple::normalize("i386-unknown-linux-gnu"))
+                .merge(Triple(Triple::normalize("x86_64-unknown-linux-gnu"))));
+
+  // AMDGPU with a matching OS/vendor merges the subarchitectures: merging a
+  // major-family subarch with a specific one in that family yields the
+  // specific subarch, regardless of order.
+  EXPECT_EQ("amdgpu9.00-amd-amdhsa",
+            Triple(Triple::normalize("amdgpu9-amd-amdhsa"))
+                .merge(Triple(Triple::normalize("amdgpu9.00-amd-amdhsa"))));
+  EXPECT_EQ("amdgpu9.00-amd-amdhsa",
+            Triple(Triple::normalize("amdgpu9.00-amd-amdhsa"))
+                .merge(Triple(Triple::normalize("amdgpu9-amd-amdhsa"))));
+
+  // An AMDGPU triple without a subarch merges to the other AMDGPU triple's
+  // subarch.
+  EXPECT_EQ("amdgpu9-amd-amdhsa",
+            Triple(Triple::normalize("amdgpu-amd-amdhsa"))
+                .merge(Triple(Triple::normalize("amdgpu9-amd-amdhsa"))));
+  EXPECT_EQ("amdgpu9-amd-amdhsa",
+            Triple(Triple::normalize("amdgpu9-amd-amdhsa"))
+                .merge(Triple(Triple::normalize("amdgpu-amd-amdhsa"))));
+
+  // Identical AMDGPU triples merge to themselves.
+  EXPECT_EQ("amdgpu9.00-amd-amdhsa",
+            Triple(Triple::normalize("amdgpu9.00-amd-amdhsa"))
+                .merge(Triple(Triple::normalize("amdgpu9.00-amd-amdhsa"))));
+
+  // The AMDGPU subarch merge only kicks in when the receiver is AMDGPU and the
+  // OS and vendor match; otherwise the general rule applies and the other
+  // triple wins.
+  EXPECT_EQ("x86_64-unknown-linux-gnu",
+            Triple(Triple::normalize("amdgpu9-amd-amdhsa"))
+                .merge(Triple(Triple::normalize("x86_64-unknown-linux-gnu"))));
+  EXPECT_EQ("amdgpu9-amd-amdhsa",
+            Triple(Triple::normalize("x86_64-unknown-linux-gnu"))
+                .merge(Triple(Triple::normalize("amdgpu9-amd-amdhsa"))));
+
+  // The subarch merge does not fire when only the receiver is amdgcn but the
+  // other triple is a different.
+  EXPECT_EQ("r600-amd-amdhsa",
+            Triple(Triple::normalize("amdgpu9-amd-amdhsa"))
+                .merge(Triple(Triple::normalize("r600-amd-amdhsa"))));
+  EXPECT_EQ("x86_64-amd-amdhsa",
+            Triple(Triple::normalize("amdgpu9-amd-amdhsa"))
+                .merge(Triple(Triple::normalize("x86_64-amd-amdhsa"))));
+  EXPECT_EQ("amdgpu9-amd-amdhsa",
+            Triple(Triple::normalize("x86_64-amd-amdhsa"))
+                .merge(Triple(Triple::normalize("amdgpu9-amd-amdhsa"))));
+}
+
 TEST(DataLayoutTest, UEFI) {
   Triple TT = Triple("x86_64-unknown-uefi");
 
diff --git a/llvm/utils/UpdateTestChecks/asm.py b/llvm/utils/UpdateTestChecks/asm.py
index 5f441227092f4..f4214559b011b 100644
--- a/llvm/utils/UpdateTestChecks/asm.py
+++ b/llvm/utils/UpdateTestChecks/asm.py
@@ -575,6 +575,7 @@ def get_run_handler(triple):
         "hexagon": (scrub_asm_hexagon, ASM_FUNCTION_HEXAGON_RE),
         "r600": (scrub_asm_amdgpu, ASM_FUNCTION_AMDGPU_RE),
         "amdgcn": (scrub_asm_amdgpu, ASM_FUNCTION_AMDGPU_RE),
+        "amdgpu": (scrub_asm_amdgpu, ASM_FUNCTION_AMDGPU_RE),
         "arm": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
         "arm64": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_RE),
         "arm64e": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_DARWIN_RE),
diff --git a/offload/plugins-nextgen/amdgpu/src/rtl.cpp b/offload/plugins-nextgen/amdgpu/src/rtl.cpp
index dda905607c2ed..e6ceeea5331d1 100644
--- a/offload/plugins-nextgen/amdgpu/src/rtl.cpp
+++ b/offload/plugins-nextgen/amdgpu/src/rtl.cpp
@@ -4031,7 +4031,7 @@ struct AMDGPUPluginTy final : public GenericPluginTy {
     return new AMDGPUGlobalHandlerTy();
   }
 
-  Triple::ArchType getTripleArch() const override { return Triple::amdgcn; }
+  Triple::ArchType getTripleArch() const override { return Triple::amdgpu; }
 
   const char *getName() const override { return GETNAME(TARGET_NAME); }
 

>From 0af9c8b7cd5f04f7c1efa16ff79a6a753f02acc2 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Tue, 7 Jul 2026 12:43:24 +0200
Subject: [PATCH 2/2] move table

---
 llvm/docs/AMDGPUUsage.rst | 253 +++++++++++++++++++-------------------
 1 file changed, 127 insertions(+), 126 deletions(-)

diff --git a/llvm/docs/AMDGPUUsage.rst b/llvm/docs/AMDGPUUsage.rst
index d5dc9f8acd684..f470d7330da9c 100644
--- a/llvm/docs/AMDGPUUsage.rst
+++ b/llvm/docs/AMDGPUUsage.rst
@@ -60,58 +60,134 @@ to specify the target triple.
    compatibility.
 
 .. table:: AMDGPU Architectures
-     :name: amdgpu-architecture-table
-
-     ============ ==============================================================
-     Architecture Description
-     ============ ==============================================================
-     ``r600``     AMD GPUs HD2XXX-HD6XXX for graphics and compute shaders.
-     ``amdgpu``   AMD GPUs GCN GFX6 onwards for graphics and compute shaders.
-     ``amdgcn``   Legacy alias for ``amdgpu``.
-     ============ ==============================================================
-
-  .. table:: AMDGPU Vendors
-     :name: amdgpu-vendor-table
-
-     ============ ==============================================================
-     Vendor       Description
-     ============ ==============================================================
-     ``amd``      Can be used for all AMD GPU usage.
-     ``mesa``     Can be used if the OS is ``mesa3d``.
-     ============ ==============================================================
+   :name: amdgpu-architecture-table
+
+   ============ ==============================================================
+   Architecture Description
+   ============ ==============================================================
+   ``r600``     AMD GPUs HD2XXX-HD6XXX for graphics and compute shaders.
+   ``amdgpu``   AMD GPUs GCN GFX6 onwards for graphics and compute shaders.
+   ``amdgcn``   Legacy alias for ``amdgpu``.
+   ============ ==============================================================
+
+The following table lists each major subarch and the minor subarches it
+covers. The *Default Processor* column gives the generic processor that a
+major subarch selects by default for code generation; this is the
+corresponding generic processor for families that have one (see
+:ref:`amdgpu-generic-processor-table`). Major subarches listed as *(none)*
+are placeholders for families that do not yet have a generic target. See
+:ref:`amdgpu-subarch-compatibility` for how subarches are matched.
+
+.. list-table:: AMDGPU Subarchitectures
+   :name: amdgpu-major-subarch-table
+   :header-rows: 1
 
-  .. table:: AMDGPU Operating Systems
-     :name: amdgpu-os
-
-     ============== ============================================================
-     OS             Description
-     ============== ============================================================
-     *<empty>*      Defaults to the *unknown* OS.
-     ``amdhsa``     Compute kernels executed on HSA [HSA]_ compatible runtimes
-                    such as:
-
-                    - AMD's ROCmâ„¢ runtime [AMD-ROCm]_ using the *rocm-amdhsa*
-                      loader on Linux. See *AMD ROCm Platform Release Notes*
-                      [AMD-ROCm-Release-Notes]_ for supported hardware and
-                      software.
-                    - AMD's PAL runtime using the *pal-amdhsa* loader on
-                      Windows.
-
-     ``amdpal``     Graphic shaders and compute kernels executed on AMD's PAL
-                    runtime using the *pal-amdpal* loader on Windows and Linux
-                    Pro.
-     ``mesa3d``     Graphic shaders and compute kernels executed on AMD's Mesa
-                    3D runtime using the *mesa-mesa3d* loader on Linux.
-     ============== ============================================================
-
-  .. table:: AMDGPU Environments
-     :name: amdgpu-environment-table
-
-     ============ ==============================================================
-     Environment  Description
-     ============ ==============================================================
-     *<empty>*    Default.
-     ============ ==============================================================
+   * - Major Subarch
+     - Default Processor
+     - Covered Subarches (Processor)
+   * - ``amdgpu6``
+     - *(none)*
+     - ``amdgpu6.00`` (``gfx600``), ``amdgpu6.01`` (``gfx601``),
+       ``amdgpu6.02`` (``gfx602``)
+   * - ``amdgpu7``
+     - *(none)*
+     - ``amdgpu7.00`` (``gfx700``), ``amdgpu7.01`` (``gfx701``),
+       ``amdgpu7.02`` (``gfx702``), ``amdgpu7.03`` (``gfx703``),
+       ``amdgpu7.04`` (``gfx704``), ``amdgpu7.05`` (``gfx705``)
+   * - ``amdgpu8``
+     - *(none)*
+     - ``amdgpu8.01`` (``gfx801``), ``amdgpu8.02`` (``gfx802``),
+       ``amdgpu8.03`` (``gfx803``), ``amdgpu8.05`` (``gfx805``)
+   * - ``amdgpu8.10``
+     - *(none)*
+     - ``amdgpu8.10`` (``gfx810``)
+   * - ``amdgpu9``
+     - ``gfx9-generic``
+     - ``amdgpu9.00`` (``gfx900``), ``amdgpu9.02`` (``gfx902``),
+       ``amdgpu9.04`` (``gfx904``), ``amdgpu9.06`` (``gfx906``),
+       ``amdgpu9.09`` (``gfx909``), ``amdgpu9.0c`` (``gfx90c``)
+   * - ``amdgpu9.08``
+     - *(none)*
+     - ``amdgpu9.08`` (``gfx908``)
+   * - ``amdgpu9.0a``
+     - *(none)*
+     - ``amdgpu9.0a`` (``gfx90a``)
+   * - ``amdgpu9.4``
+     - ``gfx9-4-generic``
+     - ``amdgpu9.42`` (``gfx942``), ``amdgpu9.50`` (``gfx950``)
+   * - ``amdgpu10.1``
+     - ``gfx10-1-generic``
+     - ``amdgpu10.10`` (``gfx1010``), ``amdgpu10.11`` (``gfx1011``),
+       ``amdgpu10.12`` (``gfx1012``), ``amdgpu10.13`` (``gfx1013``)
+   * - ``amdgpu10.3``
+     - ``gfx10-3-generic``
+     - ``amdgpu10.30`` (``gfx1030``), ``amdgpu10.31`` (``gfx1031``),
+       ``amdgpu10.32`` (``gfx1032``), ``amdgpu10.33`` (``gfx1033``),
+       ``amdgpu10.34`` (``gfx1034``), ``amdgpu10.35`` (``gfx1035``),
+       ``amdgpu10.36`` (``gfx1036``)
+   * - ``amdgpu11``
+     - ``gfx11-generic``
+     - ``amdgpu11.00`` (``gfx1100``), ``amdgpu11.01`` (``gfx1101``),
+       ``amdgpu11.02`` (``gfx1102``), ``amdgpu11.03`` (``gfx1103``),
+       ``amdgpu11.50`` (``gfx1150``), ``amdgpu11.51`` (``gfx1151``),
+       ``amdgpu11.52`` (``gfx1152``), ``amdgpu11.53`` (``gfx1153``)
+       ``amdgpu11.54`` (``gfx1154``)
+   * - ``amdgpu11.7``
+     - ``gfx11-7-generic``
+     - ``amdgpu11.70`` (``gfx1170``), ``amdgpu11.71`` (``gfx1171``),
+       ``amdgpu11.72`` (``gfx1172``)
+   * - ``amdgpu12``
+     - ``gfx12-generic``
+     - ``amdgpu12.00`` (``gfx1200``), ``amdgpu12.01`` (``gfx1201``)
+   * - ``amdgpu12.5``
+     - ``gfx12-5-generic``
+     - ``amdgpu12.50`` (``gfx1250``), ``amdgpu12.51`` (``gfx1251``)
+   * - ``amdgpu13``
+     - ``gfx13-generic``
+     - ``amdgpu13.10`` (``gfx1310``)
+
+.. table:: AMDGPU Vendors
+   :name: amdgpu-vendor-table
+
+   ============ ==============================================================
+   Vendor       Description
+   ============ ==============================================================
+   ``amd``      Can be used for all AMD GPU usage.
+   ``mesa``     Can be used if the OS is ``mesa3d``.
+   ============ ==============================================================
+
+.. table:: AMDGPU Operating Systems
+   :name: amdgpu-os
+
+   ============== ============================================================
+   OS             Description
+   ============== ============================================================
+   *<empty>*      Defaults to the *unknown* OS.
+   ``amdhsa``     Compute kernels executed on HSA [HSA]_ compatible runtimes
+                  such as:
+
+                  - AMD's ROCmâ„¢ runtime [AMD-ROCm]_ using the *rocm-amdhsa*
+                    loader on Linux. See *AMD ROCm Platform Release Notes*
+                    [AMD-ROCm-Release-Notes]_ for supported hardware and
+                    software.
+                  - AMD's PAL runtime using the *pal-amdhsa* loader on
+                    Windows.
+
+   ``amdpal``     Graphic shaders and compute kernels executed on AMD's PAL
+                  runtime using the *pal-amdpal* loader on Windows and Linux
+                  Pro.
+   ``mesa3d``     Graphic shaders and compute kernels executed on AMD's Mesa
+                  3D runtime using the *mesa-mesa3d* loader on Linux.
+   ============== ============================================================
+
+.. table:: AMDGPU Environments
+   :name: amdgpu-environment-table
+
+   ============ ==============================================================
+   Environment  Description
+   ============ ==============================================================
+   *<empty>*    Default.
+   ============ ==============================================================
 
 .. _amdgpu-subarch-compatibility:
 
@@ -146,81 +222,6 @@ anything, as a backwards-compatibility allowance. When linking modules
 with compatible-but-unequal subarches, the more specific (minor)
 subarch is selected for the merged module.
 
-The following table lists each major subarch and the minor subarches it covers.
-The *Default Processor* column gives the generic processor that a major
-subarch selects by default for code generation; this is the corresponding
-generic processor for families that have one (see
-:ref:`amdgpu-generic-processor-table`). Major subarches listed as *(none)* are
-placeholders for families that do not yet have a generic target.
-
-  .. list-table:: AMDGPU Major SubArchitecture Coverage
-     :name: amdgpu-major-subarch-table
-     :header-rows: 1
-
-     * - Major SubArch
-       - Default Processor
-       - Covered SubArches (Processor)
-     * - ``amdgpu6``
-       - *(none)*
-       - ``amdgpu6.00`` (``gfx600``), ``amdgpu6.01`` (``gfx601``),
-         ``amdgpu6.02`` (``gfx602``)
-     * - ``amdgpu7``
-       - *(none)*
-       - ``amdgpu7.00`` (``gfx700``), ``amdgpu7.01`` (``gfx701``),
-         ``amdgpu7.02`` (``gfx702``), ``amdgpu7.03`` (``gfx703``),
-         ``amdgpu7.04`` (``gfx704``), ``amdgpu7.05`` (``gfx705``)
-     * - ``amdgpu8``
-       - *(none)*
-       - ``amdgpu8.01`` (``gfx801``), ``amdgpu8.02`` (``gfx802``),
-         ``amdgpu8.03`` (``gfx803``), ``amdgpu8.05`` (``gfx805``)
-     * - ``amdgpu8.10``
-       - *(none)*
-       - ``amdgpu8.10`` (``gfx810``)
-     * - ``amdgpu9``
-       - ``gfx9-generic``
-       - ``amdgpu9.00`` (``gfx900``), ``amdgpu9.02`` (``gfx902``),
-         ``amdgpu9.04`` (``gfx904``), ``amdgpu9.06`` (``gfx906``),
-         ``amdgpu9.09`` (``gfx909``), ``amdgpu9.0c`` (``gfx90c``)
-     * - ``amdgpu9.08``
-       - *(none)*
-       - ``amdgpu9.08`` (``gfx908``)
-     * - ``amdgpu9.0a``
-       - *(none)*
-       - ``amdgpu9.0a`` (``gfx90a``)
-     * - ``amdgpu9.4``
-       - ``gfx9-4-generic``
-       - ``amdgpu9.42`` (``gfx942``), ``amdgpu9.50`` (``gfx950``)
-     * - ``amdgpu10.1``
-       - ``gfx10-1-generic``
-       - ``amdgpu10.10`` (``gfx1010``), ``amdgpu10.11`` (``gfx1011``),
-         ``amdgpu10.12`` (``gfx1012``), ``amdgpu10.13`` (``gfx1013``)
-     * - ``amdgpu10.3``
-       - ``gfx10-3-generic``
-       - ``amdgpu10.30`` (``gfx1030``), ``amdgpu10.31`` (``gfx1031``),
-         ``amdgpu10.32`` (``gfx1032``), ``amdgpu10.33`` (``gfx1033``),
-         ``amdgpu10.34`` (``gfx1034``), ``amdgpu10.35`` (``gfx1035``),
-         ``amdgpu10.36`` (``gfx1036``)
-     * - ``amdgpu11``
-       - ``gfx11-generic``
-       - ``amdgpu11.00`` (``gfx1100``), ``amdgpu11.01`` (``gfx1101``),
-         ``amdgpu11.02`` (``gfx1102``), ``amdgpu11.03`` (``gfx1103``),
-         ``amdgpu11.50`` (``gfx1150``), ``amdgpu11.51`` (``gfx1151``),
-         ``amdgpu11.52`` (``gfx1152``), ``amdgpu11.53`` (``gfx1153``)
-         ``amdgpu11.54`` (``gfx1154``)
-     * - ``amdgpu11.7``
-       - ``gfx11-7-generic``
-       - ``amdgpu11.70`` (``gfx1170``), ``amdgpu11.71`` (``gfx1171``),
-         ``amdgpu11.72`` (``gfx1172``)
-     * - ``amdgpu12``
-       - ``gfx12-generic``
-       - ``amdgpu12.00`` (``gfx1200``), ``amdgpu12.01`` (``gfx1201``)
-     * - ``amdgpu12.5``
-       - ``gfx12-5-generic``
-       - ``amdgpu12.50`` (``gfx1250``), ``amdgpu12.51`` (``gfx1251``)
-     * - ``amdgpu13``
-       - ``gfx13-generic``
-       - ``amdgpu13.10`` (``gfx1310``)
-
 .. _amdgpu-processors:
 
 Processors



More information about the flang-commits mailing list