https://github.com/arsenm created 
https://github.com/llvm/llvm-project/pull/218866

Rename the subarch triple enum for consistency, and place
it next to 1250. Add expanded test coverage.

Co-authored-by: Claude (Opus 4.8) <[email protected]>

>From acb30c9efe1f83be5b93bbbaf339343cc8698137 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Tue, 25 Aug 2026 22:57:45 +0200
Subject: [PATCH] AMDGPU: Touch up gfx1250-strict definition details

Rename the subarch triple enum for consistency, and place
it next to 1250. Add expanded test coverage.

Co-authored-by: Claude (Opus 4.8) <[email protected]>
---
 .../Misc/target-invalid-cpu-note/amdgcn.c     |  2 +-
 .../test/Misc/target-invalid-cpu-note/nvptx.c |  2 +-
 llvm/include/llvm/TargetParser/Triple.h       |  2 +-
 llvm/lib/Target/AMDGPU/GCNProcessors.td       |  2 +-
 llvm/lib/Target/AMDGPU/GCNSubtarget.cpp       |  2 +-
 llvm/lib/TargetParser/Triple.cpp              |  2 +-
 .../AMDGPU/validate-subtarget-subarch.ll      | 12 ++++++
 .../AMDGPUTargetDefSubArchSpelling.td         |  6 +--
 .../TargetParser/TargetParserTest.cpp         | 42 +++++++++++++++++--
 llvm/unittests/TargetParser/TripleTest.cpp    |  7 ++++
 .../TableGen/Basic/AMDGPUTargetDefEmitter.cpp |  7 ++--
 11 files changed, 70 insertions(+), 16 deletions(-)

diff --git a/clang/test/Misc/target-invalid-cpu-note/amdgcn.c 
b/clang/test/Misc/target-invalid-cpu-note/amdgcn.c
index 3848eb308758a..f2a0021d77488 100644
--- a/clang/test/Misc/target-invalid-cpu-note/amdgcn.c
+++ b/clang/test/Misc/target-invalid-cpu-note/amdgcn.c
@@ -54,9 +54,9 @@
 // CHECK-SAME: {{^}}, gfx1172
 // CHECK-SAME: {{^}}, gfx1200
 // CHECK-SAME: {{^}}, gfx1201
-// CHECK-SAME: {{^}}, gfx1250-strict
 // CHECK-SAME: {{^}}, gfx1250
 // CHECK-SAME: {{^}}, gfx1251
+// CHECK-SAME: {{^}}, gfx1250-strict
 // CHECK-SAME: {{^}}, gfx1310
 // CHECK-SAME: {{^}}, gfx9-generic
 // CHECK-SAME: {{^}}, gfx9-4-generic
diff --git a/clang/test/Misc/target-invalid-cpu-note/nvptx.c 
b/clang/test/Misc/target-invalid-cpu-note/nvptx.c
index 20dbd8dc6aa3b..d785efab47a28 100644
--- a/clang/test/Misc/target-invalid-cpu-note/nvptx.c
+++ b/clang/test/Misc/target-invalid-cpu-note/nvptx.c
@@ -97,9 +97,9 @@
 // CHECK-SAME: {{^}}, gfx1172
 // CHECK-SAME: {{^}}, gfx1200
 // CHECK-SAME: {{^}}, gfx1201
-// CHECK-SAME: {{^}}, gfx1250-strict
 // CHECK-SAME: {{^}}, gfx1250
 // CHECK-SAME: {{^}}, gfx1251
+// CHECK-SAME: {{^}}, gfx1250-strict
 // CHECK-SAME: {{^}}, gfx1310
 // CHECK-SAME: {{^}}, gfx9-generic
 // CHECK-SAME: {{^}}, gfx9-4-generic
diff --git a/llvm/include/llvm/TargetParser/Triple.h 
b/llvm/include/llvm/TargetParser/Triple.h
index 4344ffbd4519a..16e0ec9f1632b 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -268,7 +268,7 @@ class Triple {
     AMDGPUSubArch1201,
 
     AMDGPUSubArch12_5,
-    AMDGPUSubArch1250_STRICT,
+    AMDGPUSubArch1250S,
     AMDGPUSubArch1250,
     AMDGPUSubArch1251,
 
diff --git a/llvm/lib/Target/AMDGPU/GCNProcessors.td 
b/llvm/lib/Target/AMDGPU/GCNProcessors.td
index fa32a86cddad1..f2e9e8cfb69f3 100644
--- a/llvm/lib/Target/AMDGPU/GCNProcessors.td
+++ b/llvm/lib/Target/AMDGPU/GCNProcessors.td
@@ -371,6 +371,7 @@ def GFX12_GENERIC : AMDGPUProcessorModel<"gfx12-generic", 
GFX12SpeedModel,
 def GFX1250_STRICT : AMDGPUProcessorModel<"gfx1250-strict", GFX1250SpeedModel,
   FeatureISAVersion12_50_STRICT.Features, [12, 5, 0]> {
   let ArchFeatures = [FEATURE_FAST_FMA_F32, FEATURE_FAST_DENORMAL_F32, 
FEATURE_WAVE32, FEATURE_XNACK, FEATURE_SRAMECC];
+  let SubArchSpelling = "12.50s";
 }
 
 def GFX1250 : AMDGPUProcessorModel<"gfx1250", GFX1250SpeedModel,
@@ -409,4 +410,3 @@ def GFX13_GENERIC : AMDGPUProcessorModel<"gfx13-generic", 
GFX12SpeedModel,
 def : AMDGPUFamily<"6", [GFX600, GFX601, GFX602]>;
 def : AMDGPUFamily<"7", [GFX700, GFX701, GFX702, GFX703, GFX704, GFX705]>;
 def : AMDGPUFamily<"8", [GFX801, GFX802, GFX803, GFX805]>;
-def : AMDGPUFamily<"1250_STRICT", [GFX1250_STRICT]>;
diff --git a/llvm/lib/Target/AMDGPU/GCNSubtarget.cpp 
b/llvm/lib/Target/AMDGPU/GCNSubtarget.cpp
index 1778af5e84745..387e56791b998 100644
--- a/llvm/lib/Target/AMDGPU/GCNSubtarget.cpp
+++ b/llvm/lib/Target/AMDGPU/GCNSubtarget.cpp
@@ -83,7 +83,7 @@ static AMDGPUSubtarget::Generation 
computeDefaultGeneration(const Triple &TT) {
     return AMDGPUSubtarget::GFX11;
   case Triple::AMDGPUSubArch12:
   case Triple::AMDGPUSubArch12_5:
-  case Triple::AMDGPUSubArch1250_STRICT:
+  case Triple::AMDGPUSubArch1250S:
     return AMDGPUSubtarget::GFX12;
   case Triple::AMDGPUSubArch13:
     return AMDGPUSubtarget::GFX13;
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index 231c8641c590e..8c14ed94a0318 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -840,7 +840,7 @@ Triple::SubArchType Triple::parseSubArch(StringRef 
SubArchName) {
         .Case("12.01", Triple::AMDGPUSubArch1201)
         .Case("12.5", Triple::AMDGPUSubArch12_5)
         .Case("12.50", Triple::AMDGPUSubArch1250)
-        .Case("12.50s", Triple::AMDGPUSubArch1250_STRICT)
+        .Case("12.50s", Triple::AMDGPUSubArch1250S)
         .Case("12.51", Triple::AMDGPUSubArch1251)
         .Case("13", Triple::AMDGPUSubArch13)
         .Case("13.10", Triple::AMDGPUSubArch1310)
diff --git a/llvm/test/CodeGen/AMDGPU/validate-subtarget-subarch.ll 
b/llvm/test/CodeGen/AMDGPU/validate-subtarget-subarch.ll
index 445e1858f70d5..21e9ed27afe25 100644
--- a/llvm/test/CodeGen/AMDGPU/validate-subtarget-subarch.ll
+++ b/llvm/test/CodeGen/AMDGPU/validate-subtarget-subarch.ll
@@ -7,6 +7,11 @@
 ; RUN: llc -mtriple=amdgpu11 -mcpu=gfx1100 -filetype=null %s
 ; RUN: llc -mtriple=amdgpu11.7 -mcpu=gfx1170 -filetype=null %s
 
+; RUN: llc -mtriple=amdgpu12.5 -mcpu=gfx1250 -filetype=null %s
+; RUN: llc -mtriple=amdgpu12.5 -mcpu=gfx1251 -filetype=null %s
+; RUN: llc -mtriple=amdgpu12.50 -mcpu=gfx1250 -filetype=null %s
+; RUN: llc -mtriple=amdgpu12.50s -mcpu=gfx1250-strict -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
@@ -32,6 +37,13 @@
 ; 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
 
+; RUN: sed 's/TARGET_CPU/gfx1250-strict/g' < %s | not llc -mtriple=amdgpu12.5 
-filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx1250-strict/g' < %s | not llc -mtriple=amdgpu12.50 
-filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx1250-strict/g' < %s | not llc -mtriple=amdgpu12.51 
-filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx1250-strict/g' < %s | not llc -mtriple=amdgpu12 
-filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx1250/g' < %s | not llc -mtriple=amdgpu12.50s 
-filetype=null 2>&1 | FileCheck -check-prefix=ERR %s
+; RUN: sed 's/TARGET_CPU/gfx1251/g' < %s | not llc -mtriple=amdgpu12.50s 
-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.
diff --git a/llvm/test/TableGen/AMDGPUTargetDefSubArchSpelling.td 
b/llvm/test/TableGen/AMDGPUTargetDefSubArchSpelling.td
index e0c4b82ba0469..8d06a3264112c 100644
--- a/llvm/test/TableGen/AMDGPUTargetDefSubArchSpelling.td
+++ b/llvm/test/TableGen/AMDGPUTargetDefSubArchSpelling.td
@@ -36,9 +36,9 @@ def GFX888_AMAZING : ProcessorModel<"gfx888-amazing", 
NoSchedModel, []>,
 // CHECK: "amdgpu8.88a\0"
 
 // The GPU table: the base GPU has no base name (offset 0); the variant uses
-// AMDGPUSubArch8_88A and records "gfx888" as its base name.
+// AMDGPUSubArch888A and records "gfx888" as its base name.
 // CHECK: {[[#]], Triple::AMDGPUSubArch888, {{.*}}, {8, 8, 8}, [[FAM:[0-9]+]], 
0},
-// CHECK: {[[#]], Triple::AMDGPUSubArch8_88A, {{.*}}, {8, 8, 8}, [[FAM]], 
[[#]]},
+// CHECK: {[[#]], Triple::AMDGPUSubArch888A, {{.*}}, {8, 8, 8}, [[FAM]], 
[[#]]},
 
 // The subarch-name table maps the variant's own subarch to its triple name.
-// CHECK: {Triple::AMDGPUSubArch8_88A, [[#]], [[#]]},
+// CHECK: {Triple::AMDGPUSubArch888A, [[#]], [[#]]},
diff --git a/llvm/unittests/TargetParser/TargetParserTest.cpp 
b/llvm/unittests/TargetParser/TargetParserTest.cpp
index 6159dd61f4c31..f0acf84e06e10 100644
--- a/llvm/unittests/TargetParser/TargetParserTest.cpp
+++ b/llvm/unittests/TargetParser/TargetParserTest.cpp
@@ -2515,9 +2515,9 @@ TEST(TargetParserTest, testAMDGPUArch) {
     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.50s--").getSubArch(),
-              Triple::AMDGPUSubArch1250_STRICT);
+              Triple::AMDGPUSubArch1250S);
+    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(),
@@ -2638,6 +2638,40 @@ TEST(TargetParserTest, testAMDGPUisSubArchCompatible) {
   // An unrecognized subarch is incompatible with any recognized subarch.
   EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple("amdgpu9.99-amd-amdhsa"),
                                            Triple("amdgpu9.00-amd-amdhsa")));
+
+  // subarch 12.50s is its own major, so it is compatible only with itself; the
+  // 12.5 family, gfx1250, and sibling gfx1251 all reject it, both directions.
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch1250S,
+                                          Triple::AMDGPUSubArch1250S));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch12_5,
+                                           Triple::AMDGPUSubArch1250S));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch1250S,
+                                           Triple::AMDGPUSubArch12_5));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch1250S,
+                                           Triple::AMDGPUSubArch1250));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch1250,
+                                           Triple::AMDGPUSubArch1250S));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch1250S,
+                                           Triple::AMDGPUSubArch1251));
+
+  // gfx1250 remains a normal member of the gfx12.5 family.
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch12_5,
+                                          Triple::AMDGPUSubArch1250));
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple::AMDGPUSubArch1250,
+                                          Triple::AMDGPUSubArch12_5));
+
+  // Same, via triple spellings: only amdgpu12.50s accepts it; amdgpu12.5 and
+  // amdgpu12.50 both reject it.
+  EXPECT_TRUE(AMDGPU::isSubArchCompatible(Triple("amdgpu12.50s-amd-amdhsa"),
+                                          Triple("amdgpu12.50s-amd-amdhsa")));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple("amdgpu12.5-amd-amdhsa"),
+                                           Triple("amdgpu12.50s-amd-amdhsa")));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple("amdgpu12.50s-amd-amdhsa"),
+                                           Triple("amdgpu12.5-amd-amdhsa")));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple("amdgpu12.50-amd-amdhsa"),
+                                           Triple("amdgpu12.50s-amd-amdhsa")));
+  EXPECT_FALSE(AMDGPU::isSubArchCompatible(Triple("amdgpu12.50s-amd-amdhsa"),
+                                           Triple("amdgpu12.50-amd-amdhsa")));
 }
 
 TEST(TargetParserTest, testAMDGPUisCPUValidForSubArch) {
@@ -2948,7 +2982,7 @@ TEST(TargetParserTest, testAMDGPUgetGPUKindFromSubArch) {
       {Triple::AMDGPUSubArch1200, AMDGPU::GK_GFX1200},
       {Triple::AMDGPUSubArch1201, AMDGPU::GK_GFX1201},
       {Triple::AMDGPUSubArch12_5, AMDGPU::GK_GFX12_5_GENERIC},
-      {Triple::AMDGPUSubArch1250_STRICT, AMDGPU::GK_GFX1250_STRICT},
+      {Triple::AMDGPUSubArch1250S, AMDGPU::GK_GFX1250_STRICT},
       {Triple::AMDGPUSubArch1250, AMDGPU::GK_GFX1250},
       {Triple::AMDGPUSubArch1251, AMDGPU::GK_GFX1251},
 
@@ -2969,7 +3003,7 @@ TEST(TargetParserTest, 
testAMDGPUgetIsaVersionFromSubArch) {
             (AMDGPU::IsaVersion{9, 0, 0}));
   EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch1250),
             (AMDGPU::IsaVersion{12, 5, 0}));
-  EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch1250_STRICT),
+  EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch1250S),
             (AMDGPU::IsaVersion{12, 5, 0}));
   EXPECT_EQ(AMDGPU::getIsaVersion(Triple::AMDGPUSubArch1251),
             (AMDGPU::IsaVersion{12, 5, 1}));
diff --git a/llvm/unittests/TargetParser/TripleTest.cpp 
b/llvm/unittests/TargetParser/TripleTest.cpp
index 3d646f4a9327b..e7a6b056702c3 100644
--- a/llvm/unittests/TargetParser/TripleTest.cpp
+++ b/llvm/unittests/TargetParser/TripleTest.cpp
@@ -3861,6 +3861,13 @@ TEST(TripleTest, isCompatibleWith) {
       {"amdgpu12.5-amd-amdhsa", "amdgpu12.50-amd-amdhsa", true},
       {"amdgpu12.5-amd-amdhsa", "amdgpu12.51-amd-amdhsa", true},
 
+      // amdgpu12.50s is its own major subarch: compatible only with itself.
+      {"amdgpu12.50s-amd-amdhsa", "amdgpu12.50s-amd-amdhsa", true},
+      {"amdgpu12.5-amd-amdhsa", "amdgpu12.50s-amd-amdhsa", false},
+      {"amdgpu12.50-amd-amdhsa", "amdgpu12.50s-amd-amdhsa", false},
+      {"amdgpu12.51-amd-amdhsa", "amdgpu12.50s-amd-amdhsa", false},
+      {"amdgpu12-amd-amdhsa", "amdgpu12.50s-amd-amdhsa", false},
+
       {"amdgpu13-amd-amdhsa", "amdgpu13.10-amd-amdhsa", true},
 
       // A vendor mismatch is incompatible even when the subarch is otherwise
diff --git a/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp 
b/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp
index 65d6add20a01a..b1d1afd846715 100644
--- a/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp
+++ b/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp
@@ -70,11 +70,12 @@ static std::optional<StringRef> getSubArchSpelling(const 
Record *Rec) {
   return Rec->getValueAsOptionalString("SubArchSpelling");
 }
 
-// Emit a subarch enumerator suffix for a spelling, converting '.' to '_' and
-// upcasing, e.g. "4.67q" -> "4_67Q".
+// Emit a subarch enumerator suffix for a spelling, dropping '.' and upcasing,
+// e.g. "12.50s" -> "1250S", matching the sibling name-derived enumerators.
 static void emitSpellingSuffix(raw_ostream &OS, StringRef Spelling) {
   for (char C : Spelling)
-    OS << static_cast<char>((C == '.') ? '_' : toUpper(C));
+    if (C != '.')
+      OS << static_cast<char>(toUpper(C));
 }
 
 // Derive the Triple::SubArchType for a canonical GPU record. A pseudo target

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to