[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