1 // RUN: %clang_cc1 -std=c99 -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C99 %s
2 // RUN: %clang_cc1 -std=c11 -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C11 %s
3 // RUN: %clang_cc1 -std=c18 -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C11 %s
4 // RUN: %clang_cc1 -std=c2x -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C11 %s
5 //
6 // Check -ffinite-loops option in combination with various standard versions.
7 // RUN: %clang_cc1 -std=c99 -ffinite-loops -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=FINITE %s
8 // RUN: %clang_cc1 -std=c11 -ffinite-loops -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=FINITE %s
9 // RUN: %clang_cc1 -std=c18 -ffinite-loops -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=FINITE %s
10 // RUN: %clang_cc1 -std=c2x -ffinite-loops -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=FINITE %s
11 //
12 // Check -fno-finite-loops option in combination with various standard versions.
13 // RUN: %clang_cc1 -std=c99 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C99 %s
14 // RUN: %clang_cc1 -std=c11 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C99 %s
15 // RUN: %clang_cc1 -std=c18 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C99 %s
16 // RUN: %clang_cc1 -std=c2x -fno-finite-loops -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C99 %s
17 
18 int a = 0;
19 int b = 0;
20 
21 // CHECK: datalayout
22 //
23 // CHECK-NOT: mustprogress
24 // CHECK-LABEL: @f0(
25 // CHECK-NEXT:  entry:
26 // CHECK-NEXT:    br label %for.cond
27 // CHECK:       for.cond:
28 // CHECK-NOT:     br {{.*}}!llvm.loop
29 //
30 void f0() {
31   for (; ;) ;
32 }
33 
34 // CHECK-NOT: mustprogress
35 // CHECK-LABEL: @f1(
36 // CHECK-NEXT:  entry:
37 // CHECK-NEXT:    br label %for.cond
38 // CHECK:       for.cond:
39 // CHECK-NEXT:    br i1 true, label %for.body, label %for.end
40 // CHECK:       for.body:
41 // CHECK-NOT:     br {{.*}}, !llvm.loop
42 // CHECK:       for.end:
43 // CHECK-NEXT:    ret void
44 //
45 void f1() {
46   for (; 1;) {
47   }
48 }
49 
50 // CHECK-NOT: mustprogress
51 // CHECK-LABEL: @f2(
52 // CHECK-NEXT:  entry:
53 // CHECK-NEXT:    br label %for.cond
54 // CHECK:       for.cond:
55 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
56 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
57 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
58 // CHECK-NEXT:    br i1 [[CMP]], label %for.body, label %for.end
59 // CHECK:       for.body:
60 // C99-NOT:       br {{.*}} !llvm.loop
61 // C11:           br label %for.cond, !llvm.loop [[LOOP1:!.*]]
62 // FINITE:        br label %for.cond, !llvm.loop [[LOOP1:!.*]]
63 // CHECK:       for.end:
64 // CHECK-NEXT:    ret void
65 //
66 void f2() {
67   for (; a == b;) {
68   }
69 }
70 
71 // CHECK-NOT: mustprogress
72 // CHECK-LABEL: @F(
73 // CHECK-NEXT:  entry:
74 // CHECK-NEXT:    br label %for.cond
75 // CHECK:       for.cond:
76 // CHECK-NEXT:    br i1 true, label %for.body, label %for.end
77 // CHECK:       for.body:
78 // CHECK-NOT:     br {{.*}}, !llvm.loop
79 // CHECK:       for.end:
80 // CHECK-NEXT:    br label %for.cond1
81 // CHECK:       for.cond1:
82 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
83 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
84 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
85 // CHECK-NEXT:    br i1 [[CMP]], label %for.body2, label %for.end3
86 // CHECK:       for.body2:
87 // C99-NOT:       br {{.*}}, !llvm.loop
88 // C11:           br label %for.cond1, !llvm.loop [[LOOP2:!.*]]
89 // FINITE:        br label %for.cond1, !llvm.loop [[LOOP2:!.*]]
90 // CHECK:       for.end3:
91 // CHECK-NEXT:    ret void
92 //
93 void F() {
94   for (; 1;) {
95   }
96   for (; a == b;) {
97   }
98 }
99 
100 // CHECK-NOT: mustprogress
101 // CHECK-LABEL: @w1(
102 // CHECK-NEXT:  entry:
103 // CHECK-NEXT:    br label %while.body
104 // CHECK:       while.body:
105 // CHECK-NOT:     br {{.*}}, !llvm.loop
106 //
107 void w1() {
108   while (1) {
109   }
110 }
111 
112 // CHECK-NOT: mustprogress
113 // CHECK-LABEL: @w2(
114 // CHECK-NEXT:  entry:
115 // CHECK-NEXT:    br label %while.cond
116 // CHECK:       while.cond:
117 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
118 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
119 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
120 // CHECK-NEXT:    br i1 [[CMP]], label %while.body, label %while.end
121 // CHECK:       while.body:
122 // C99-NOT:       br {{.*}}, !llvm.loop
123 // C11:           br label %while.cond, !llvm.loop [[LOOP3:!.*]]
124 // FINITE:        br label %while.cond, !llvm.loop [[LOOP3:!.*]]
125 // CHECK:       while.end:
126 // CHECK-NEXT:    ret void
127 //
128 void w2() {
129   while (a == b) {
130   }
131 }
132 
133 // CHECK-NOT: mustprogress
134 // CHECK-LABEL: @W(
135 // CHECK-NEXT:  entry:
136 // CHECK-NEXT:    br label [[WHILE_COND:%.*]]
137 // CHECK:       while.cond:
138 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
139 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
140 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
141 // CHECK-NEXT:    br i1 [[CMP]], label %while.body, label %while.end
142 // CHECK:       while.body:
143 // C99-NOT:       br {{.*}} !llvm.loop
144 // C11:           br label %while.cond, !llvm.loop [[LOOP4:!.*]]
145 // FINITE:        br label %while.cond, !llvm.loop [[LOOP4:!.*]]
146 // CHECK:       while.end:
147 // CHECK-NEXT:    br label %while.body2
148 // CHECK:       while.body2:
149 // CHECK-NOT:     br {{.*}} !llvm.loop
150 //
151 void W() {
152   while (a == b) {
153   }
154   while (1) {
155   }
156 }
157 
158 // CHECK-NOT: mustprogress
159 // CHECK-LABEL: @d1(
160 // CHECK-NEXT:  entry:
161 // CHECK-NEXT:    br label %do.body
162 // CHECK:       do.body:
163 // CHECK-NEXT:    br label %do.cond
164 // CHECK:       do.cond:
165 // CHECK-NOT:     br {{.*}}, !llvm.loop
166 // CHECK:       do.end:
167 // CHECK-NEXT:    ret void
168 //
169 void d1() {
170   do {
171   } while (1);
172 }
173 
174 // CHECK-NOT: mustprogress
175 // CHECK-LABEL: @d2(
176 // CHECK-NEXT:  entry:
177 // CHECK-NEXT:    br label %do.body
178 // CHECK:       do.body:
179 // CHECK-NEXT:    br label %do.cond
180 // CHECK:       do.cond:
181 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
182 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
183 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
184 // C99-NOT:       br {{.*}}, !llvm.loop
185 // C11:           br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP5:!.*]]
186 // FINITE:        br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP5:!.*]]
187 // CHECK:       do.end:
188 // CHECK-NEXT:    ret void
189 //
190 void d2() {
191   do {
192   } while (a == b);
193 }
194 
195 // CHECK-NOT: mustprogress
196 // CHECK-LABEL: @D(
197 // CHECK-NEXT:  entry:
198 // CHECK-NEXT:    br label %do.body
199 // CHECK:       do.body:
200 // CHECK-NEXT:    br label %do.cond
201 // CHECK:       do.cond:
202 // CHECK-NOT:     br label {{.*}}, !llvm.loop
203 // CHECK:       do.end:
204 // CHECK-NEXT:    br label %do.body1
205 // CHECK:       do.body1:
206 // CHECK-NEXT:    br label %do.cond2
207 // CHECK:       do.cond2:
208 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
209 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
210 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
211 // C99-NOT:       br {{.*}}, !llvm.loop
212 // C11:           br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP6:!.*]]
213 // FINITE:        br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP6:!.*]]
214 // CHECK:       do.end3:
215 // CHECK-NEXT:    ret void
216 //
217 void D() {
218   do {
219   } while (1);
220   do {
221   } while (a == b);
222 }
223 
224 // C11: [[LOOP1]] = distinct !{[[LOOP1]], [[MP:!.*]]}
225 // C11: [[MP]] = !{!"llvm.loop.mustprogress"}
226 // C11: [[LOOP2]] = distinct !{[[LOOP2]], [[MP]]}
227 // C11: [[LOOP3]] = distinct !{[[LOOP3]], [[MP]]}
228 // C11: [[LOOP4]] = distinct !{[[LOOP4]], [[MP]]}
229 // C11: [[LOOP5]] = distinct !{[[LOOP5]], [[MP]]}
230 // C11: [[LOOP6]] = distinct !{[[LOOP6]], [[MP]]}
231