1a48f58c9SSjoerd Meijer // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm -o - %s | FileCheck %s
2a48f58c9SSjoerd Meijer 
test0(int * List,int Length)3a48f58c9SSjoerd Meijer void test0(int *List, int Length) {
4a48f58c9SSjoerd Meijer // CHECK-LABEL: @{{.*}}test0{{.*}}(
5a48f58c9SSjoerd Meijer // CHECK: br label {{.*}}, !llvm.loop ![[LOOP0:.*]]
6a48f58c9SSjoerd Meijer 
7a48f58c9SSjoerd Meijer   #pragma clang loop vectorize(enable)
8a48f58c9SSjoerd Meijer   for (int i = 0; i < Length; i++)
9a48f58c9SSjoerd Meijer     List[i] = i * 2;
10a48f58c9SSjoerd Meijer }
11a48f58c9SSjoerd Meijer 
test1(int * List,int Length)12a48f58c9SSjoerd Meijer void test1(int *List, int Length) {
13a48f58c9SSjoerd Meijer // CHECK-LABEL: @{{.*}}test1{{.*}}(
14a48f58c9SSjoerd Meijer // CHECK: br label {{.*}}, !llvm.loop ![[LOOP1:.*]]
15a48f58c9SSjoerd Meijer 
16a48f58c9SSjoerd Meijer   #pragma clang loop vectorize(enable) vectorize_predicate(enable)
17a48f58c9SSjoerd Meijer   for (int i = 0; i < Length; i++)
18a48f58c9SSjoerd Meijer     List[i] = i * 2;
19a48f58c9SSjoerd Meijer }
20a48f58c9SSjoerd Meijer 
test2(int * List,int Length)21a48f58c9SSjoerd Meijer void test2(int *List, int Length) {
22a48f58c9SSjoerd Meijer // CHECK-LABEL: @{{.*}}test2{{.*}}(
23a48f58c9SSjoerd Meijer // CHECK:       br label {{.*}}, !llvm.loop ![[LOOP2:.*]]
24a48f58c9SSjoerd Meijer 
25a48f58c9SSjoerd Meijer   #pragma clang loop vectorize(enable) vectorize_predicate(disable)
26a48f58c9SSjoerd Meijer   for (int i = 0; i < Length; i++)
27a48f58c9SSjoerd Meijer     List[i] = i * 2;
28a48f58c9SSjoerd Meijer }
29a48f58c9SSjoerd Meijer 
30535efab2SSjoerd Meijer // vectorize_predicate(enable) implies vectorize(enable)
test3(int * List,int Length)31535efab2SSjoerd Meijer void test3(int *List, int Length) {
32535efab2SSjoerd Meijer // CHECK-LABEL: @{{.*}}test3{{.*}}(
33535efab2SSjoerd Meijer // CHECK:       br label {{.*}}, !llvm.loop ![[LOOP3:.*]]
34535efab2SSjoerd Meijer 
35535efab2SSjoerd Meijer   #pragma clang loop vectorize_predicate(enable)
36535efab2SSjoerd Meijer   for (int i = 0; i < Length; i++)
37535efab2SSjoerd Meijer     List[i] = i * 2;
38535efab2SSjoerd Meijer }
39535efab2SSjoerd Meijer 
40535efab2SSjoerd Meijer // Check that disabling vectorization means a vectorization width of 1, and
41535efab2SSjoerd Meijer // also that vectorization_predicate isn't enabled.
test4(int * List,int Length)42535efab2SSjoerd Meijer void test4(int *List, int Length) {
43535efab2SSjoerd Meijer // CHECK-LABEL: @{{.*}}test4{{.*}}(
44535efab2SSjoerd Meijer // CHECK: br label {{.*}}, !llvm.loop ![[LOOP4:.*]]
45535efab2SSjoerd Meijer 
46535efab2SSjoerd Meijer   #pragma clang loop vectorize(disable)
47535efab2SSjoerd Meijer   for (int i = 0; i < Length; i++)
48535efab2SSjoerd Meijer     List[i] = i * 2;
49535efab2SSjoerd Meijer }
50535efab2SSjoerd Meijer 
51535efab2SSjoerd Meijer // Check that vectorize and vectorize_predicate are disabled.
test5(int * List,int Length)52535efab2SSjoerd Meijer void test5(int *List, int Length) {
53535efab2SSjoerd Meijer // CHECK-LABEL: @{{.*}}test5{{.*}}(
54535efab2SSjoerd Meijer // CHECK: br label {{.*}}, !llvm.loop ![[LOOP5:.*]]
55535efab2SSjoerd Meijer 
56535efab2SSjoerd Meijer   #pragma clang loop vectorize(disable) vectorize_predicate(enable)
57535efab2SSjoerd Meijer   for (int i = 0; i < Length; i++)
58535efab2SSjoerd Meijer     List[i] = i * 2;
59535efab2SSjoerd Meijer }
60535efab2SSjoerd Meijer 
61*74ddacd3SMalhar // Check that vectorize_predicate is ignored when vectorization width is 1
test6(int * List,int Length)62*74ddacd3SMalhar void test6(int *List, int Length) {
63*74ddacd3SMalhar // CHECK-LABEL: @{{.*}}test6{{.*}}(
64*74ddacd3SMalhar // CHECK: br label {{.*}}, !llvm.loop ![[LOOP6:.*]]
65*74ddacd3SMalhar 
66*74ddacd3SMalhar #pragma clang loop vectorize_predicate(disable) vectorize_width(1)
67*74ddacd3SMalhar   for (int i = 0; i < Length; i++)
68*74ddacd3SMalhar     List[i] = i * 2;
69*74ddacd3SMalhar }
70*74ddacd3SMalhar 
71*74ddacd3SMalhar 
72*74ddacd3SMalhar // Check that vectorize_width(!=1) does not affect vectorize_predicate.
test7(int * List,int Length)73*74ddacd3SMalhar void test7(int *List, int Length) {
74*74ddacd3SMalhar // CHECK-LABEL: @{{.*}}test7{{.*}}(
75*74ddacd3SMalhar // CHECK: br label {{.*}}, !llvm.loop ![[LOOP7:.*]]
76*74ddacd3SMalhar 
77*74ddacd3SMalhar #pragma clang loop vectorize_predicate(disable) vectorize_width(4)
78*74ddacd3SMalhar   for (int i = 0; i < Length; i++)
79*74ddacd3SMalhar     List[i] = i * 2;
80*74ddacd3SMalhar }
81*74ddacd3SMalhar 
82*74ddacd3SMalhar 
83*74ddacd3SMalhar // Check that vectorize_predicate is ignored when vectorization width is 1
test8(int * List,int Length)84*74ddacd3SMalhar void test8(int *List, int Length) {
85*74ddacd3SMalhar // CHECK-LABEL: @{{.*}}test8{{.*}}(
86*74ddacd3SMalhar // CHECK: br label {{.*}}, !llvm.loop ![[LOOP8:.*]]
87*74ddacd3SMalhar 
88*74ddacd3SMalhar #pragma clang loop vectorize_predicate(enable) vectorize_width(1)
89*74ddacd3SMalhar   for (int i = 0; i < Length; i++)
90*74ddacd3SMalhar     List[i] = i * 2;
91*74ddacd3SMalhar }
92*74ddacd3SMalhar 
93*74ddacd3SMalhar 
94*74ddacd3SMalhar // Check that vectorize_width(!=1) does not affect vectorize_predicate.
test9(int * List,int Length)95*74ddacd3SMalhar void test9(int *List, int Length) {
96*74ddacd3SMalhar // CHECK-LABEL: @{{.*}}test9{{.*}}(
97*74ddacd3SMalhar // CHECK: br label {{.*}}, !llvm.loop ![[LOOP9:.*]]
98*74ddacd3SMalhar 
99*74ddacd3SMalhar #pragma clang loop vectorize_predicate(enable) vectorize_width(4)
100*74ddacd3SMalhar   for (int i = 0; i < Length; i++)
101*74ddacd3SMalhar     List[i] = i * 2;
102*74ddacd3SMalhar }
103*74ddacd3SMalhar 
104ac73b73cSAtmn Patel // CHECK:      ![[LOOP0]] = distinct !{![[LOOP0]], [[MP:![0-9]+]], [[GEN3:![0-9]+]]}
105ac73b73cSAtmn Patel // CHECK:      [[MP]] = !{!"llvm.loop.mustprogress"}
106ac73b73cSAtmn Patel // CHECK-NEXT: [[GEN3]] = !{!"llvm.loop.vectorize.enable", i1 true}
1076d424a16SJordan Rupprecht 
108ac73b73cSAtmn Patel // CHECK-NEXT: ![[LOOP1]] = distinct !{![[LOOP1]], [[MP]], [[GEN6:![0-9]+]], [[GEN3]]}
109ac73b73cSAtmn Patel // CHECK-NEXT: [[GEN6]] = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
110535efab2SSjoerd Meijer 
111ac73b73cSAtmn Patel // CHECK-NEXT: ![[LOOP2]] = distinct !{![[LOOP2]], [[MP]], [[GEN8:![0-9]+]], [[GEN3]]}
112ac73b73cSAtmn Patel // CHECK-NEXT: [[GEN8]] = !{!"llvm.loop.vectorize.predicate.enable", i1 false}
113535efab2SSjoerd Meijer 
114ac73b73cSAtmn Patel // CHECK-NEXT: ![[LOOP3]] = distinct !{![[LOOP3]], [[MP]], [[GEN6]], [[GEN3]]}
115535efab2SSjoerd Meijer 
116ac73b73cSAtmn Patel // CHECK-NEXT: ![[LOOP4]] = distinct !{![[LOOP4]], [[MP]], [[GEN10:![0-9]+]]}
117ac73b73cSAtmn Patel // CHECK-NEXT: [[GEN10]] = !{!"llvm.loop.vectorize.width", i32 1}
118535efab2SSjoerd Meijer 
119*74ddacd3SMalhar // CHECK-NEXT: ![[LOOP5]] = distinct !{![[LOOP5]], [[MP]], [[GEN6]], [[GEN10]]}
120*74ddacd3SMalhar 
121*74ddacd3SMalhar // CHECK-NEXT: ![[LOOP6]] = distinct !{![[LOOP6]], [[MP]], [[GEN8]], [[GEN10]], [[GEN11:![0-9]+]]}
122*74ddacd3SMalhar // CHECK-NEXT: [[GEN11]] = !{!"llvm.loop.vectorize.scalable.enable", i1 false}
123*74ddacd3SMalhar 
124*74ddacd3SMalhar // CHECK-NEXT: ![[LOOP7]] = distinct !{![[LOOP7]], [[MP]], [[GEN8]], [[GEN12:![0-9]+]], [[GEN11]], [[GEN3]]}
125*74ddacd3SMalhar // CHECK-NEXT: [[GEN12]] = !{!"llvm.loop.vectorize.width", i32 4}
126*74ddacd3SMalhar 
127*74ddacd3SMalhar // CHECK-NEXT: ![[LOOP8]] = distinct !{![[LOOP8]], [[MP]], [[GEN6]], [[GEN10]], [[GEN11]]}
128*74ddacd3SMalhar 
129*74ddacd3SMalhar // CHECK-NEXT: ![[LOOP9]] = distinct !{![[LOOP9]], [[MP]], [[GEN6]], [[GEN12]], [[GEN11]], [[GEN3]]}
130