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
