diff --git a/clang/lib/CodeGen/CGLoopInfo.cpp b/clang/lib/CodeGen/CGLoopInfo.cpp --- a/clang/lib/CodeGen/CGLoopInfo.cpp +++ b/clang/lib/CodeGen/CGLoopInfo.cpp @@ -249,11 +249,12 @@ Args.push_back(nullptr); Args.append(LoopProperties.begin(), LoopProperties.end()); - // Setting vectorize.predicate + // Setting vectorize.predicate when it has been specified and vectorization + // has not been disabled. bool IsVectorPredicateEnabled = false; if (Attrs.VectorizePredicateEnable != LoopAttributes::Unspecified && Attrs.VectorizeEnable != LoopAttributes::Disable && - Attrs.VectorizeWidth < 1) { + Attrs.VectorizeWidth != 1) { IsVectorPredicateEnabled = (Attrs.VectorizePredicateEnable == LoopAttributes::Enable); diff --git a/clang/test/CodeGenCXX/pragma-loop-predicate.cpp b/clang/test/CodeGenCXX/pragma-loop-predicate.cpp --- a/clang/test/CodeGenCXX/pragma-loop-predicate.cpp +++ b/clang/test/CodeGenCXX/pragma-loop-predicate.cpp @@ -58,6 +58,49 @@ List[i] = i * 2; } +// Check that vectorize_predicate is ignored when vectorization width is 1 +void test6(int *List, int Length) { +// CHECK-LABEL: @{{.*}}test6{{.*}}( +// CHECK: br label {{.*}}, !llvm.loop ![[LOOP6:.*]] + +#pragma clang loop vectorize_predicate(disable) vectorize_width(1) + for (int i = 0; i < Length; i++) + List[i] = i * 2; +} + + +// Check that vectorize_width(!=1) does not affect vectorize_predicate. +void test7(int *List, int Length) { +// CHECK-LABEL: @{{.*}}test7{{.*}}( +// CHECK: br label {{.*}}, !llvm.loop ![[LOOP7:.*]] + +#pragma clang loop vectorize_predicate(disable) vectorize_width(4) + for (int i = 0; i < Length; i++) + List[i] = i * 2; +} + + +// Check that vectorize_predicate is ignored when vectorization width is 1 +void test8(int *List, int Length) { +// CHECK-LABEL: @{{.*}}test8{{.*}}( +// CHECK: br label {{.*}}, !llvm.loop ![[LOOP8:.*]] + +#pragma clang loop vectorize_predicate(enable) vectorize_width(1) + for (int i = 0; i < Length; i++) + List[i] = i * 2; +} + + +// Check that vectorize_width(!=1) does not affect vectorize_predicate. +void test9(int *List, int Length) { +// CHECK-LABEL: @{{.*}}test9{{.*}}( +// CHECK: br label {{.*}}, !llvm.loop ![[LOOP9:.*]] + +#pragma clang loop vectorize_predicate(enable) vectorize_width(4) + for (int i = 0; i < Length; i++) + List[i] = i * 2; +} + // CHECK: ![[LOOP0]] = distinct !{![[LOOP0]], [[MP:![0-9]+]], [[GEN3:![0-9]+]]} // CHECK: [[MP]] = !{!"llvm.loop.mustprogress"} // CHECK-NEXT: [[GEN3]] = !{!"llvm.loop.vectorize.enable", i1 true} @@ -74,3 +117,12 @@ // CHECK-NEXT: [[GEN10]] = !{!"llvm.loop.vectorize.width", i32 1} // CHECK-NEXT: ![[LOOP5]] = distinct !{![[LOOP5]], [[MP]], [[GEN10]]} + +// CHECK-NEXT: ![[LOOP6]] = distinct !{![[LOOP6]], [[MP]], [[GEN10]]} + +// CHECK-NEXT: ![[LOOP7]] = distinct !{![[LOOP7]], [[MP]], [[GEN8]], [[GEN11:![0-9]+]], [[GEN3]]} +// CHECK-NEXT: [[GEN11]] = !{!"llvm.loop.vectorize.width", i32 4} + +// CHECK-NEXT: ![[LOOP8]] = distinct !{![[LOOP8]], [[MP]], [[GEN10]]} + +// CHECK-NEXT: ![[LOOP9]] = distinct !{![[LOOP9]], [[MP]], [[GEN6]], [[GEN11]], [[GEN3]]}