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

Complete the conversion of clang from the manual ArchAttr field
to the generated feature bitset.

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

>From 1f1ed16a112a1134170632b5c5d73a17cdac26cd Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Tue, 4 Aug 2026 22:23:46 +0200
Subject: [PATCH] clang/AMDGPU: Use feature bitset for xnack/sramecc queries

Complete the conversion of clang from the manual ArchAttr field
to the generated feature bitset.

Co-authored-by: Claude (Claude-Opus-4.8)
---
 clang/lib/Basic/TargetID.cpp                 | 7 ++++---
 clang/lib/Basic/Targets/AMDGPU.cpp           | 2 +-
 clang/lib/Basic/Targets/AMDGPU.h             | 2 +-
 clang/lib/Driver/ToolChains/AMDGPU.cpp       | 7 ++++---
 llvm/lib/Target/AMDGPU/AMDGPU.td             | 3 ++-
 llvm/lib/TargetParser/AMDGPUTargetParser.cpp | 5 +++--
 6 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/clang/lib/Basic/TargetID.cpp b/clang/lib/Basic/TargetID.cpp
index 29d5d4a5d2996..1cefd0effe687 100644
--- a/clang/lib/Basic/TargetID.cpp
+++ b/clang/lib/Basic/TargetID.cpp
@@ -29,11 +29,12 @@ getAllPossibleAMDGPUTargetIDFeatures(const llvm::Triple &T,
   llvm::AMDGPU::GPUKind ProcKind = llvm::AMDGPU::parseArchAMDGCN(Proc);
   if (ProcKind == llvm::AMDGPU::GK_NONE)
     return Ret;
-  unsigned Features = llvm::AMDGPU::getArchAttrAMDGCN(ProcKind);
-  if (Features & llvm::AMDGPU::FEATURE_SRAMECC)
+  const llvm::AMDGPU::AMDGPUFeatureBitset &Features =
+      llvm::AMDGPU::getFeatureBitset(ProcKind);
+  if (Features.test(llvm::AMDGPU::FEAT_SRAMECC_SUPPORT))
     Ret.push_back("sramecc");
   // Only allow xnack in target ID if the processor supports on/off modes.
-  if (Features & llvm::AMDGPU::FEATURE_XNACK_ON_OFF_MODES)
+  if (Features.test(llvm::AMDGPU::FEAT_XNACK_ON_OFF_MODES))
     Ret.push_back("xnack");
   return Ret;
 }
diff --git a/clang/lib/Basic/Targets/AMDGPU.cpp 
b/clang/lib/Basic/Targets/AMDGPU.cpp
index 04e4f4b670994..c9e3f6248f82d 100644
--- a/clang/lib/Basic/Targets/AMDGPU.cpp
+++ b/clang/lib/Basic/Targets/AMDGPU.cpp
@@ -197,7 +197,7 @@ AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple 
&Triple,
                                             Triple.getSubArch())
                                       : 
llvm::AMDGPU::parseArchAMDGCN(Opts.CPU))
                   : llvm::AMDGPU::parseArchR600(Opts.CPU)),
-      GPUFeatures(Triple.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
+      GPUFeatures(Triple.isAMDGCN() ? llvm::AMDGPU::FEATURE_NONE
                                     : llvm::AMDGPU::getArchAttrR600(GPUKind)) {
   resetDataLayout();
 
diff --git a/clang/lib/Basic/Targets/AMDGPU.h b/clang/lib/Basic/Targets/AMDGPU.h
index b2d287abfe52c..055a71f3c0855 100644
--- a/clang/lib/Basic/Targets/AMDGPU.h
+++ b/clang/lib/Basic/Targets/AMDGPU.h
@@ -282,7 +282,7 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : 
public TargetInfo {
   bool setCPU(StringRef Name) override {
     if (getTriple().isAMDGCN()) {
       GPUKind = llvm::AMDGPU::parseArchAMDGCN(Name);
-      GPUFeatures = llvm::AMDGPU::getArchAttrAMDGCN(GPUKind);
+      GPUFeatures = llvm::AMDGPU::FEATURE_NONE;
       return llvm::AMDGPU::isCPUValidForSubArch(getTriple().getSubArch(),
                                                 GPUKind) &&
              !llvm::AMDGPU::isPseudoTarget(GPUKind);
diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp 
b/clang/lib/Driver/ToolChains/AMDGPU.cpp
index 4f81c8d00d731..6bc6a53732881 100644
--- a/clang/lib/Driver/ToolChains/AMDGPU.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp
@@ -1364,11 +1364,12 @@ static bool isXnackAvailable(const llvm::Triple &TT, 
llvm::StringRef TargetID) {
     return false;
   llvm::StringRef Processor = getProcessorFromTargetID(TT, TargetID);
   llvm::AMDGPU::GPUKind ProcKind = llvm::AMDGPU::parseArchAMDGCN(Processor);
-  unsigned Features = llvm::AMDGPU::getArchAttrAMDGCN(ProcKind);
+  const llvm::AMDGPU::AMDGPUFeatureBitset &Features =
+      llvm::AMDGPU::getFeatureBitset(ProcKind);
 
   // If processor has xnack but doesn't support on/off modes, xnack is always 
on
-  bool XnackAlwaysOn = (Features & llvm::AMDGPU::FEATURE_XNACK) &&
-                       !(Features & llvm::AMDGPU::FEATURE_XNACK_ON_OFF_MODES);
+  bool XnackAlwaysOn = Features.test(llvm::AMDGPU::FEAT_XNACK_SUPPORT) &&
+                       !Features.test(llvm::AMDGPU::FEAT_XNACK_ON_OFF_MODES);
   if (XnackAlwaysOn)
     return true;
 
diff --git a/llvm/lib/Target/AMDGPU/AMDGPU.td b/llvm/lib/Target/AMDGPU/AMDGPU.td
index a0cf0a654e29f..8ee2f36c4578d 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPU.td
+++ b/llvm/lib/Target/AMDGPU/AMDGPU.td
@@ -3131,7 +3131,8 @@ def AMDGPUFrontendVisibleFeatures {
   FeatureVMemToLDSLoad, FeatureVmemPrefInsts, FeatureWMMA128bInsts,
   FeatureWMMA256bInsts, FeatureWMMAN16Insts, FeatureXF32Insts,
   FeatureWavefrontSize32, FeatureWavefrontSize64, FeatureSupportsWGP,
-  FeatureSupportsWave32, FeatureFastFMAF32, FeatureFastDenormalF32
+  FeatureSupportsWave32, FeatureFastFMAF32, FeatureFastDenormalF32,
+  FeatureSupportsXNACK, FeatureSupportsSRAMECC, FeatureXNACKOnOffModes
   ];
 }
 
diff --git a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp 
b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp
index 3a2ace412a4da..17e86673775aa 100644
--- a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp
+++ b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp
@@ -437,8 +437,9 @@ StringRef AMDGPU::getCanonicalArchName(const Triple &T, 
StringRef Arch) {
 // FIXME: This is hacky, we shouldn't have mismatches between the bitset and
 // feature string map.
 static const AMDGPUFeatureBitset FrontendOnlyFeatures = {
-    FEAT_FAST_FMAF, FEAT_FAST_DENORMAL_F32, FEAT_SUPPORTS_WAVE32,
-    FEAT_SUPPORTS_WGP};
+    FEAT_FAST_FMAF,         FEAT_FAST_DENORMAL_F32, FEAT_SUPPORTS_WAVE32,
+    FEAT_SUPPORTS_WGP,      FEAT_XNACK_SUPPORT,     FEAT_SRAMECC_SUPPORT,
+    FEAT_XNACK_ON_OFF_MODES};
 
 // Add a GPU's features (minus the frontend-only ones) to \p Features. With \p
 // Overwrite false, existing entries are kept so user -mattr overrides win.

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

Reply via email to