[clang] 893efd0 - [X86] Honor command line features along with cpu_specific attribute

Craig Topper via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 11 09:06:28 PST 2021


Author: Craig Topper
Date: 2021-11-11T09:06:22-08:00
New Revision: 893efd0d665becb3478c750b2b4d3751c20ff39d

URL: https://github.com/llvm/llvm-project/commit/893efd0d665becb3478c750b2b4d3751c20ff39d
DIFF: https://github.com/llvm/llvm-project/commit/893efd0d665becb3478c750b2b4d3751c20ff39d.diff

LOG: [X86] Honor command line features along with cpu_specific attribute

If the feature is on the command line we should honor it for all
functions. I don't think we could reliably target a single function
for a less capable processor than what the rest of the program is
compiled for.

Fixes PR52407.

Reviewed By: erichkeane

Differential Revision: https://reviews.llvm.org/D113647

Added: 
    clang/test/CodeGen/attr-cpuspecific-avx-abi.c

Modified: 
    clang/lib/AST/ASTContext.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 2611295d21a8d..391a0c0b338e6 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -11759,6 +11759,9 @@ void ASTContext::getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
     Target->getCPUSpecificCPUDispatchFeatures(
         SD->getCPUName(GD.getMultiVersionIndex())->getName(), FeaturesTmp);
     std::vector<std::string> Features(FeaturesTmp.begin(), FeaturesTmp.end());
+    Features.insert(Features.begin(),
+                    Target->getTargetOpts().FeaturesAsWritten.begin(),
+                    Target->getTargetOpts().FeaturesAsWritten.end());
     Target->initFeatureMap(FeatureMap, getDiagnostics(), TargetCPU, Features);
   } else {
     FeatureMap = Target->getTargetOpts().FeatureMap;

diff  --git a/clang/test/CodeGen/attr-cpuspecific-avx-abi.c b/clang/test/CodeGen/attr-cpuspecific-avx-abi.c
new file mode 100644
index 0000000000000..ad9c82b5dbc3b
--- /dev/null
+++ b/clang/test/CodeGen/attr-cpuspecific-avx-abi.c
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -triple x86_64-linux-gnu -target-feature +avx -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK
+
+// Make sure the features from the command line are honored regardless of what
+// CPU is specified in the cpu_specific attribute.
+// In this test, if the 'avx' feature isn't honored, we'll generate an error for
+// the return type having a 
diff erent ABI without 'avx' being enabled.
+
+typedef double __m256d __attribute__((vector_size(32)));
+
+extern __m256d bar_avx1(void);
+extern __m256d bar_avx2(void);
+
+// AVX1/AVX2 dispatcher
+__attribute__((cpu_dispatch(generic, core_4th_gen_avx)))
+__m256d foo_pd64x4(void);
+
+__attribute__((cpu_specific(generic)))
+__m256d foo(void) { return bar_avx1(); }
+// CHECK: define{{.*}} @foo.A() #[[A:[0-9]+]]
+
+__attribute__((cpu_specific(core_4th_gen_avx)))
+__m256d foo(void) { return bar_avx2(); }
+// CHECK: define{{.*}} @foo.V() #[[V:[0-9]+]]
+
+// CHECK: attributes #[[A]] = {{.*}}"target-features"="+avx,+crc32,+cx8,+mmx,+popcnt,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87,+xsave"
+// CHECK: attributes #[[V]] = {{.*}}"target-features"="+avx,+avx2,+bmi,+cmov,+crc32,+cx8,+f16c,+fma,+lzcnt,+mmx,+movbe,+popcnt,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87,+xsave"


        


More information about the cfe-commits mailing list