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
