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" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits