[clang] [AArch64][clang] Use DenseSet for target feature lookup (NFC) (PR #180734)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 10 05:04:39 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-aarch64
Author: Benjamin Maxwell (MacDue)
<details>
<summary>Changes</summary>
This resolves a recent AArch64 compile-time regression triggered by #<!-- -->176755, which inadvertently grew the feature lookup `StringSwitch` too large. This patch replaces the `StringSwitch` with a `DenseSet` of target features. This is built with a new `FeatureLookupBuilder` helper, which allows reusing all the existing cases (to avoid unintentionally changing any of them).
Compiler-time impact: https://llvm-compile-time-tracker.com/compare.php?from=c9753859d19b07315c5a9a493efaa4df18db84ab&to=cb0684b602d5c741ca99b22bb3bc5f902b7a5a7e&stat=instructions:u
---
Full diff: https://github.com/llvm/llvm-project/pull/180734.diff
2 Files Affected:
- (modified) clang/lib/Basic/Targets/AArch64.cpp (+30-4)
- (modified) clang/lib/Basic/Targets/AArch64.h (+7)
``````````diff
diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp
index d148705a36289..6bbda2b56562e 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -839,8 +839,30 @@ bool AArch64TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
return true;
}
-bool AArch64TargetInfo::hasFeature(StringRef Feature) const {
- return llvm::StringSwitch<bool>(Feature)
+/// A helper class for "hasFeature" lookups (mimicking a StringSwitch).
+struct FeatureLookupBuilder {
+ FeatureLookupBuilder(AArch64FeatureSet &Features) : Features(Features) {
+ Features.clear();
+ }
+
+ FeatureLookupBuilder &Case(StringRef Feat, bool HasFeature) {
+ if (HasFeature)
+ Features.insert(Feat);
+ return *this;
+ }
+
+ FeatureLookupBuilder &Cases(ArrayRef<StringRef> Feats, bool HasFeature) {
+ if (HasFeature)
+ Features.insert_range(Feats);
+ return *this;
+ }
+
+private:
+ AArch64FeatureSet &Features;
+};
+
+void AArch64TargetInfo::computeFeatureLookup() {
+ FeatureLookupBuilder(HasFeatureLookup)
.Cases({"aarch64", "arm64", "arm"}, true)
.Case("fmv", HasFMV)
.Case("fp", FPU & FPUMode)
@@ -911,8 +933,11 @@ bool AArch64TargetInfo::hasFeature(StringRef Feature) const {
.Case("sve-aes2", HasSVE_AES2)
.Case("ssve-aes", HasSSVE_AES)
.Case("sve2p2", FPU & SveMode && HasSVE2p2)
- .Case("sme2p2", HasSME2p2)
- .Default(false);
+ .Case("sme2p2", HasSME2p2);
+}
+
+bool AArch64TargetInfo::hasFeature(StringRef Feature) const {
+ return HasFeatureLookup.contains(Feature);
}
void AArch64TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
@@ -1286,6 +1311,7 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
if (HasNoSVE)
FPU &= ~SveMode;
+ computeFeatureLookup();
return true;
}
diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h
index 581b161de046a..f9dffed8769ef 100644
--- a/clang/lib/Basic/Targets/AArch64.h
+++ b/clang/lib/Basic/Targets/AArch64.h
@@ -15,6 +15,7 @@
#include "OSTargets.h"
#include "clang/Basic/TargetBuiltins.h"
+#include "llvm/ADT/DenseSet.h"
#include "llvm/TargetParser/AArch64TargetParser.h"
#include <optional>
@@ -54,6 +55,8 @@ static const unsigned ARM64AddrSpaceMap[] = {
20, // wasm_funcref
};
+using AArch64FeatureSet = llvm::SmallDenseSet<StringRef, 32>;
+
class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
static const TargetInfo::GCCRegAlias GCCRegAliases[];
static const char *const GCCRegNames[];
@@ -143,6 +146,10 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
const llvm::AArch64::ArchInfo *ArchInfo = &llvm::AArch64::ARMV8A;
+ AArch64FeatureSet HasFeatureLookup;
+
+ void computeFeatureLookup();
+
protected:
std::string ABI;
``````````
</details>
https://github.com/llvm/llvm-project/pull/180734
More information about the cfe-commits
mailing list