Author: Matt Arsenault Date: 2026-08-17T18:57:25+02:00 New Revision: 9a5bd30f350ce21213bd895f33612ea5a9c3f9d7
URL: https://github.com/llvm/llvm-project/commit/9a5bd30f350ce21213bd895f33612ea5a9c3f9d7 DIFF: https://github.com/llvm/llvm-project/commit/9a5bd30f350ce21213bd895f33612ea5a9c3f9d7.diff LOG: clang/AMDGPU: Use feature bitset instead of ArchAttr (#216674) Convert from the legacy getArchAttrAMDGCN manual bitmask checks to using the new generated bitset. These are the easy cases. sramecc and xnack require more supporting work so will be done later. Co-authored-by: Claude (Claude-Opus-4.8) Added: Modified: clang/lib/Basic/Targets/AMDGPU.cpp clang/lib/Basic/Targets/AMDGPU.h clang/lib/Driver/ToolChains/AMDGPU.cpp clang/lib/Driver/ToolChains/CommonArgs.cpp llvm/lib/Target/AMDGPU/AMDGPU.td llvm/lib/TargetParser/AMDGPUTargetParser.cpp Removed: ################################################################################ diff --git a/clang/lib/Basic/Targets/AMDGPU.cpp b/clang/lib/Basic/Targets/AMDGPU.cpp index fce626031147e..04e4f4b670994 100644 --- a/clang/lib/Basic/Targets/AMDGPU.cpp +++ b/clang/lib/Basic/Targets/AMDGPU.cpp @@ -215,7 +215,10 @@ AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple, // should just be assumed true for the dummy target. HasFastHalfType = true; HasFloat16 = true; - WavefrontSize = (GPUFeatures & llvm::AMDGPU::FEATURE_WAVE32) ? 32 : 64; + WavefrontSize = llvm::AMDGPU::getFeatureBitset(GPUKind).test( + llvm::AMDGPU::FEAT_SUPPORTS_WAVE32) + ? 32 + : 64; // Set pointer width and alignment for the generic address space. PointerWidth = PointerAlign = getPointerWidthV(LangAS::Default); @@ -229,7 +232,8 @@ AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple, } MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; - CUMode = !(GPUFeatures & llvm::AMDGPU::FEATURE_WGP); + CUMode = !llvm::AMDGPU::getFeatureBitset(GPUKind).test( + llvm::AMDGPU::FEAT_SUPPORTS_WGP); for (auto F : {"image-insts", "gws", "vmem-to-lds-load-insts", "supports-wgp", "supports-wave32", "xnack-support", "sramecc-support", diff --git a/clang/lib/Basic/Targets/AMDGPU.h b/clang/lib/Basic/Targets/AMDGPU.h index f8933ebee8ffd..b2d287abfe52c 100644 --- a/clang/lib/Basic/Targets/AMDGPU.h +++ b/clang/lib/Basic/Targets/AMDGPU.h @@ -55,7 +55,8 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo { /// Has fast fma f32 bool hasFastFMAF() const { return getTriple().isAMDGCN() && - !!(GPUFeatures & llvm::AMDGPU::FEATURE_FAST_FMA_F32); + llvm::AMDGPU::getFeatureBitset(GPUKind).test( + llvm::AMDGPU::FEAT_FAST_FMAF); } /// Has fast fma f64 @@ -68,7 +69,8 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo { bool hasFullRateDenormalsF32() const { return getTriple().isAMDGCN() && - !!(GPUFeatures & llvm::AMDGPU::FEATURE_FAST_DENORMAL_F32); + llvm::AMDGPU::getFeatureBitset(GPUKind).test( + llvm::AMDGPU::FEAT_FAST_DENORMAL_F32); } bool hasLDEXPF() const { return getTriple().isAMDGCN(); } diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp index 82f9158a69f04..50eacfc2f1baf 100644 --- a/clang/lib/Driver/ToolChains/AMDGPU.cpp +++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp @@ -44,11 +44,12 @@ RocmInstallationDetector::CommonBitcodeLibsPreferences:: : ABIVer(DeviceLibABIVersion::fromCodeObjectVersion( tools::getAMDGPUCodeObjectVersion(D, DriverArgs))) { const auto Kind = llvm::AMDGPU::parseArchAMDGCN(GPUArch); - const unsigned ArchAttr = llvm::AMDGPU::getArchAttrAMDGCN(Kind); + const llvm::AMDGPU::AMDGPUFeatureBitset &Features = + llvm::AMDGPU::getFeatureBitset(Kind); IsOpenMP = DeviceOffloadingKind == Action::OFK_OpenMP; - const bool HasWave32 = (ArchAttr & llvm::AMDGPU::FEATURE_WAVE32); + const bool HasWave32 = Features.test(llvm::AMDGPU::FEAT_SUPPORTS_WAVE32); Wave64 = !HasWave32 || DriverArgs.hasFlag(options::OPT_mwavefrontsize64, options::OPT_mno_wavefrontsize64, false); @@ -61,8 +62,8 @@ RocmInstallationDetector::CommonBitcodeLibsPreferences:: const bool DefaultDAZ = (Kind == llvm::AMDGPU::GK_NONE) ? false - : !((ArchAttr & llvm::AMDGPU::FEATURE_FAST_FMA_F32) && - (ArchAttr & llvm::AMDGPU::FEATURE_FAST_DENORMAL_F32)); + : !(Features.test(llvm::AMDGPU::FEAT_FAST_FMAF) && + Features.test(llvm::AMDGPU::FEAT_FAST_DENORMAL_F32)); // TODO: There are way too many flags that change this. Do we need to // check them all? DAZ = IsKnownOffloading @@ -861,13 +862,14 @@ bool AMDGPUToolChain::getDefaultDenormsAreZeroForTarget( if (Kind == llvm::AMDGPU::GK_NONE) return false; - const unsigned ArchAttr = llvm::AMDGPU::getArchAttrAMDGCN(Kind); + const llvm::AMDGPU::AMDGPUFeatureBitset &Features = + llvm::AMDGPU::getFeatureBitset(Kind); // Default to enabling f32 denormals by default on subtargets where fma is // fast with denormals const bool BothDenormAndFMAFast = - (ArchAttr & llvm::AMDGPU::FEATURE_FAST_FMA_F32) && - (ArchAttr & llvm::AMDGPU::FEATURE_FAST_DENORMAL_F32); + Features.test(llvm::AMDGPU::FEAT_FAST_FMAF) && + Features.test(llvm::AMDGPU::FEAT_FAST_DENORMAL_F32); return !BothDenormAndFMAFast; } @@ -909,8 +911,8 @@ llvm::DenormalMode AMDGPUToolChain::getDefaultDenormalModeForType( bool AMDGPUToolChain::isWave64(const llvm::opt::ArgList &DriverArgs, llvm::AMDGPU::GPUKind Kind) { - const unsigned ArchAttr = llvm::AMDGPU::getArchAttrAMDGCN(Kind); - bool HasWave32 = (ArchAttr & llvm::AMDGPU::FEATURE_WAVE32); + bool HasWave32 = llvm::AMDGPU::getFeatureBitset(Kind).test( + llvm::AMDGPU::FEAT_SUPPORTS_WAVE32); return !HasWave32 || DriverArgs.hasFlag( options::OPT_mwavefrontsize64, options::OPT_mno_wavefrontsize64, false); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index a76f4aa6ae853..e1c07fb94ea76 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -382,8 +382,8 @@ static bool shouldIgnoreUnsupportedTargetFeature(const Arg &TargetFeatureArg, if (!T.isAMDGCN()) return false; llvm::AMDGPU::GPUKind GPUKind = llvm::AMDGPU::parseArchAMDGCN(Processor); - unsigned GPUFeatures = llvm::AMDGPU::getArchAttrAMDGCN(GPUKind); - if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP) + if (llvm::AMDGPU::getFeatureBitset(GPUKind).test( + llvm::AMDGPU::FEAT_SUPPORTS_WGP)) return false; return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode); } diff --git a/llvm/lib/Target/AMDGPU/AMDGPU.td b/llvm/lib/Target/AMDGPU/AMDGPU.td index 213d9fc1393de..4806e1e9901ef 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPU.td +++ b/llvm/lib/Target/AMDGPU/AMDGPU.td @@ -3122,7 +3122,8 @@ def AMDGPUFrontendVisibleFeatures { FeatureTanhInsts, FeatureTensorCvtLutInsts, FeatureTransposeLoadF4F6Insts, FeatureVMemToLDSLoad, FeatureVmemPrefInsts, FeatureWMMA128bInsts, FeatureWMMA256bInsts, FeatureXF32Insts, - FeatureWavefrontSize32, FeatureWavefrontSize64 + FeatureWavefrontSize32, FeatureWavefrontSize64, FeatureSupportsWGP, + FeatureSupportsWave32, FeatureFastFMAF32, FeatureFastDenormalF32 ]; } diff --git a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp index d8abaf7474cd6..3a2ace412a4da 100644 --- a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp +++ b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp @@ -431,12 +431,21 @@ StringRef AMDGPU::getCanonicalArchName(const Triple &T, StringRef Arch) { return T.isAMDGCN() ? getArchNameAMDGCN(ProcKind) : getArchNameR600(ProcKind); } -// Add each frontend feature in \p Info's bitset to \p Features. With \p +// Capability features clang queries via the feature bitset but must not +// serialize into the target-feature string. +// +// 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}; + +// 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. static void addGPUFeatures(const GPUInfo &Info, bool Overwrite, StringMap<bool> &Features) { SmallVector<StringRef, NUM_FEATURES> Names; - getFeatureNames(Info.Features, Names); + getFeatureNames(Info.Features & ~FrontendOnlyFeatures, Names); for (StringRef Name : Names) { if (Overwrite) Features[Name] = true; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
