[clang] [X86] Ignore invalid features in FMV priority (PR #172844)
QIU Chaofan via cfe-commits
cfe-commits at lists.llvm.org
Sun Aug 2 10:01:27 PDT 2026
https://github.com/ecnelises updated https://github.com/llvm/llvm-project/pull/172844
>From 8d5bbd2662e978d2c708d7ab1e57aac80bd3dcc0 Mon Sep 17 00:00:00 2001
From: Qiu Chaofan <qcf at ecnelises.com>
Date: Thu, 18 Dec 2025 16:01:58 +0800
Subject: [PATCH 1/2] [X86] Ignore invalid features in FMV priority
---
clang/lib/Basic/Targets/X86.cpp | 4 +++-
clang/test/Sema/attr-target-clones.c | 3 +++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp
index 8ab39b750dc99..e660d6758e99f 100644
--- a/clang/lib/Basic/Targets/X86.cpp
+++ b/clang/lib/Basic/Targets/X86.cpp
@@ -1355,7 +1355,7 @@ static llvm::X86::ProcessorFeatures getFeature(StringRef Name) {
}
llvm::APInt X86TargetInfo::getFMVPriority(ArrayRef<StringRef> Features) const {
- auto getPriority = [](StringRef Feature) -> unsigned {
+ auto getPriority = [this](StringRef Feature) -> unsigned {
// Valid CPUs have a 'key feature' that compares just better than its key
// feature.
using namespace llvm::X86;
@@ -1366,6 +1366,8 @@ llvm::APInt X86TargetInfo::getFMVPriority(ArrayRef<StringRef> Features) const {
}
// Now we know we have a feature, so get its priority and shift it a few so
// that we have sufficient room for the CPUs (above).
+ if (!validateCpuSupports(Feature))
+ return 0;
return getFeaturePriority(getFeature(Feature)) << 1;
};
diff --git a/clang/test/Sema/attr-target-clones.c b/clang/test/Sema/attr-target-clones.c
index 7ff8a02bf5332..6902dc65e7276 100644
--- a/clang/test/Sema/attr-target-clones.c
+++ b/clang/test/Sema/attr-target-clones.c
@@ -4,6 +4,9 @@
void __attribute__((target_clones("sse4.2", "arch=sandybridge")))
no_default(void);
+// expected-warning at +1 {{unsupported 'sse4' in the 'target_clones' attribute string; 'target_clones' attribute ignored}}
+void __attribute__((target_clones("sse4"))) invalid_target(void);
+
// expected-error at +2 {{'target_clones' and 'target' attributes are not compatible}}
// expected-note at +1 {{conflicting attribute is here}}
void __attribute__((target("sse4.2"), target_clones("arch=sandybridge")))
>From fa0159847812bac613dd3ed6402d17e946bbbbd2 Mon Sep 17 00:00:00 2001
From: Qiu Chaofan <qcf at ecnelises.com>
Date: Mon, 3 Aug 2026 01:01:03 +0800
Subject: [PATCH 2/2] fixup! [X86] Ignore invalid features in FMV priority
---
clang/lib/Basic/Targets/X86.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp
index e660d6758e99f..d218e299bcc32 100644
--- a/clang/lib/Basic/Targets/X86.cpp
+++ b/clang/lib/Basic/Targets/X86.cpp
@@ -1355,7 +1355,7 @@ static llvm::X86::ProcessorFeatures getFeature(StringRef Name) {
}
llvm::APInt X86TargetInfo::getFMVPriority(ArrayRef<StringRef> Features) const {
- auto getPriority = [this](StringRef Feature) -> unsigned {
+ auto getPriority = [](StringRef Feature) -> unsigned {
// Valid CPUs have a 'key feature' that compares just better than its key
// feature.
using namespace llvm::X86;
@@ -1366,14 +1366,14 @@ llvm::APInt X86TargetInfo::getFMVPriority(ArrayRef<StringRef> Features) const {
}
// Now we know we have a feature, so get its priority and shift it a few so
// that we have sufficient room for the CPUs (above).
- if (!validateCpuSupports(Feature))
- return 0;
return getFeaturePriority(getFeature(Feature)) << 1;
};
unsigned Priority = 0;
for (StringRef Feature : Features)
- if (!Feature.empty())
+ if (!Feature.empty() &&
+ (llvm::X86::parseArchX86(Feature) != llvm::X86::CK_None ||
+ validateCpuSupports(Feature)))
Priority = std::max(Priority, getPriority(Feature));
return llvm::APInt(32, Priority);
}
More information about the cfe-commits
mailing list