craig.topper updated this revision to Diff 386524. craig.topper added a comment.
Add test file Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D113647/new/ https://reviews.llvm.org/D113647 Files: clang/lib/AST/ASTContext.cpp clang/test/CodeGen/attr-cpuspecific-avx-abi.c Index: clang/test/CodeGen/attr-cpuspecific-avx-abi.c =================================================================== --- /dev/null +++ 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 different 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" Index: clang/lib/AST/ASTContext.cpp =================================================================== --- clang/lib/AST/ASTContext.cpp +++ clang/lib/AST/ASTContext.cpp @@ -11759,6 +11759,9 @@ 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;
Index: clang/test/CodeGen/attr-cpuspecific-avx-abi.c =================================================================== --- /dev/null +++ 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 different 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" Index: clang/lib/AST/ASTContext.cpp =================================================================== --- clang/lib/AST/ASTContext.cpp +++ clang/lib/AST/ASTContext.cpp @@ -11759,6 +11759,9 @@ 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;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits