diff options
author | Sjoerd Meijer <sjoerd.meijer@arm.com> | 2019-08-15 06:24:40 +0000 |
---|---|---|
committer | Sjoerd Meijer <sjoerd.meijer@arm.com> | 2019-08-15 06:24:40 +0000 |
commit | 535efab2e533f98a96df31b116b5861b5e29d32d (patch) | |
tree | 874425354d8475513abbf518183a52ac92fb1216 | |
parent | 803e849cbfa8f9a5eb5395b0417d8887cc68134a (diff) | |
download | llvm-535efab2e533f98a96df31b116b5861b5e29d32d.zip llvm-535efab2e533f98a96df31b116b5861b5e29d32d.tar.gz llvm-535efab2e533f98a96df31b116b5861b5e29d32d.tar.bz2 |
[Clang] Pragma vectorize_predicate implies vectorize
New pragma "vectorize_predicate(enable)" now implies "vectorize(enable)",
and it is ignored when vectorization is disabled with e.g.
"vectorize(disable) vectorize_predicate(enable)".
Differential Revision: https://reviews.llvm.org/D65776
llvm-svn: 368970
-rw-r--r-- | clang/lib/CodeGen/CGLoopInfo.cpp | 21 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/pragma-loop-predicate.cpp | 41 |
2 files changed, 56 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CGLoopInfo.cpp b/clang/lib/CodeGen/CGLoopInfo.cpp index 8e4a0a2..c51efdc 100644 --- a/clang/lib/CodeGen/CGLoopInfo.cpp +++ b/clang/lib/CodeGen/CGLoopInfo.cpp @@ -253,12 +253,18 @@ LoopInfo::createLoopVectorizeMetadata(const LoopAttributes &Attrs, Args.append(LoopProperties.begin(), LoopProperties.end()); // Setting vectorize.predicate - if (Attrs.VectorizePredicateEnable != LoopAttributes::Unspecified) { + bool IsVectorPredicateEnabled = false; + if (Attrs.VectorizePredicateEnable != LoopAttributes::Unspecified && + Attrs.VectorizeEnable != LoopAttributes::Disable && + Attrs.VectorizeWidth < 1) { + + IsVectorPredicateEnabled = + (Attrs.VectorizePredicateEnable == LoopAttributes::Enable); + Metadata *Vals[] = { MDString::get(Ctx, "llvm.loop.vectorize.predicate.enable"), - ConstantAsMetadata::get(ConstantInt::get( - llvm::Type::getInt1Ty(Ctx), - (Attrs.VectorizePredicateEnable == LoopAttributes::Enable)))}; + ConstantAsMetadata::get(ConstantInt::get(llvm::Type::getInt1Ty(Ctx), + IsVectorPredicateEnabled))}; Args.push_back(MDNode::get(Ctx, Vals)); } @@ -281,12 +287,15 @@ LoopInfo::createLoopVectorizeMetadata(const LoopAttributes &Attrs, } // Setting vectorize.enable - if (Attrs.VectorizeEnable != LoopAttributes::Unspecified) { + if (Attrs.VectorizeEnable != LoopAttributes::Unspecified || + IsVectorPredicateEnabled) { Metadata *Vals[] = { MDString::get(Ctx, "llvm.loop.vectorize.enable"), ConstantAsMetadata::get(ConstantInt::get( llvm::Type::getInt1Ty(Ctx), - (Attrs.VectorizeEnable == LoopAttributes::Enable)))}; + IsVectorPredicateEnabled + ? true + : (Attrs.VectorizeEnable == LoopAttributes::Enable)))}; Args.push_back(MDNode::get(Ctx, Vals)); } diff --git a/clang/test/CodeGenCXX/pragma-loop-predicate.cpp b/clang/test/CodeGenCXX/pragma-loop-predicate.cpp index 74aed5d..ec2161d 100644 --- a/clang/test/CodeGenCXX/pragma-loop-predicate.cpp +++ b/clang/test/CodeGenCXX/pragma-loop-predicate.cpp @@ -27,9 +27,50 @@ void test2(int *List, int Length) { List[i] = i * 2; } +// vectorize_predicate(enable) implies vectorize(enable) +void test3(int *List, int Length) { +// CHECK-LABEL: @{{.*}}test3{{.*}}( +// CHECK: br label {{.*}}, !llvm.loop ![[LOOP3:.*]] + + #pragma clang loop vectorize_predicate(enable) + for (int i = 0; i < Length; i++) + List[i] = i * 2; +} + +// Check that disabling vectorization means a vectorization width of 1, and +// also that vectorization_predicate isn't enabled. +void test4(int *List, int Length) { +// CHECK-LABEL: @{{.*}}test4{{.*}}( +// CHECK: br label {{.*}}, !llvm.loop ![[LOOP4:.*]] + + #pragma clang loop vectorize(disable) + for (int i = 0; i < Length; i++) + List[i] = i * 2; +} + +// Check that vectorize and vectorize_predicate are disabled. +void test5(int *List, int Length) { +// CHECK-LABEL: @{{.*}}test5{{.*}}( +// CHECK: br label {{.*}}, !llvm.loop ![[LOOP5:.*]] + + #pragma clang loop vectorize(disable) vectorize_predicate(enable) + for (int i = 0; i < Length; i++) + List[i] = i * 2; +} + + // CHECK: ![[LOOP0]] = distinct !{![[LOOP0]], !3} // CHECK-NEXT: !3 = !{!"llvm.loop.vectorize.enable", i1 true} + // CHECK-NEXT: ![[LOOP1]] = distinct !{![[LOOP1]], !5, !3} // CHECK-NEXT: !5 = !{!"llvm.loop.vectorize.predicate.enable", i1 true} + // CHECK-NEXT: ![[LOOP2]] = distinct !{![[LOOP2]], !7, !3} // CHECK-NEXT: !7 = !{!"llvm.loop.vectorize.predicate.enable", i1 false} + +// CHECK-NEXT: ![[LOOP3]] = distinct !{![[LOOP3]], !5, !3} + +// CHECK-NEXT: ![[LOOP4]] = distinct !{![[LOOP4]], !10} +// CHECK-NEXT: !10 = !{!"llvm.loop.vectorize.width", i32 1} + +// CHECK-NEXT: ![[LOOP5]] = distinct !{![[LOOP5]], !10} |