malharJ created this revision. Herald added a subscriber: rogfer01. malharJ requested review of this revision. Herald added subscribers: cfe-commits, vkmr. Herald added a project: clang.
This ensures that the Clang loop pragma vectorize_predicate([enable|disable]) is ignored when vectorize_width(1) is also used, since that effectively disables vectorization. For all other non-zero vectorization widths, the pragma is not ignored unless vectorization is explicitly disabled using vectorize(disable) Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D94779 Files: clang/lib/CodeGen/CGLoopInfo.cpp clang/test/CodeGenCXX/pragma-loop-predicate.cpp Index: clang/test/CodeGenCXX/pragma-loop-predicate.cpp =================================================================== --- clang/test/CodeGenCXX/pragma-loop-predicate.cpp +++ clang/test/CodeGenCXX/pragma-loop-predicate.cpp @@ -58,6 +58,28 @@ 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: ![[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 +96,8 @@ // 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} Index: clang/lib/CodeGen/CGLoopInfo.cpp =================================================================== --- clang/lib/CodeGen/CGLoopInfo.cpp +++ 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);
Index: clang/test/CodeGenCXX/pragma-loop-predicate.cpp =================================================================== --- clang/test/CodeGenCXX/pragma-loop-predicate.cpp +++ clang/test/CodeGenCXX/pragma-loop-predicate.cpp @@ -58,6 +58,28 @@ 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: ![[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 +96,8 @@ // 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} Index: clang/lib/CodeGen/CGLoopInfo.cpp =================================================================== --- clang/lib/CodeGen/CGLoopInfo.cpp +++ 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);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits