1 // RUN: %clang_cc1 -std=c++98 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s
2 // RUN: %clang_cc1 -std=c++11 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
3 // RUN: %clang_cc1 -std=c++14 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
4 // RUN: %clang_cc1 -std=c++17 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
5 // RUN: %clang_cc1 -std=c++20 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
6
7 // Check -ffinite-loops option in combination with various standard versions.
8 // RUN: %clang_cc1 -std=c++98 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=FINITE %s
9 // RUN: %clang_cc1 -std=c++11 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
10 // RUN: %clang_cc1 -std=c++14 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
11 // RUN: %clang_cc1 -std=c++17 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
12 // RUN: %clang_cc1 -std=c++20 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
13
14 // Check -fno-finite-loops option in combination with various standard versions.
15 // RUN: %clang_cc1 -std=c++98 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s
16 // RUN: %clang_cc1 -std=c++11 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s
17 // RUN: %clang_cc1 -std=c++14 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s
18 // RUN: %clang_cc1 -std=c++17 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s
19 // RUN: %clang_cc1 -std=c++20 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s
20
21 int a = 0;
22 int b = 0;
23
24 // CHECK: datalayout
25
26 // CXX98-NOT: mustprogress
27 // CXX11-NOT: mustprogress
28 // FINITE-NOT: mustprogress
29 // CHECK-LABEL: @_Z2f0v(
30 // CHECK-NEXT: entry:
31 // CHECK-NEXT: br label %for.cond
32 // CHECK: for.cond:
33 // CXX98-NOT: br {{.*}} llvm.loop
34 // CXX11-NOT: br {{.*}} llvm.loop
35 // FINITE-NOT: br {{.*}} llvm.loop
f0()36 void f0() {
37 for (; ;) ;
38 }
39
40 // CXX98-NOT: mustprogress
41 // CXX11-NOT: mustprogress
42 // FINITE-NOT: mustprogress
43 // CHECK-LABEL: @_Z2f1v(
44 // CHECK-NEXT: entry:
45 // CHECK-NEXT: br label %for.cond
46 // CHECK: for.cond:
47 // CHECK-NEXT: br i1 true, label %for.body, label %for.end
48 // CHECK: for.body:
49 // CXX98-NOT: br {{.*}}, !llvm.loop
50 // CXX11-NOT: br {{.*}} llvm.loop
51 // FINITE-NOT: br {{.*}} llvm.loop
52 // CHECK: for.end:
53 // CHECK-NEXT: ret void
54 //
f1()55 void f1() {
56 for (; 1;)
57 ;
58 }
59
60 // CXX98-NOT: mustprogress
61 // CXX11: mustprogress
62 // FINITE-NOT: mustprogress
63 // CHECK-LABEL: @_Z2f2v(
64 // CHECK-NEXT: entry:
65 // CHECK-NEXT: br label %for.cond
66 // CHECK: for.cond:
67 // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
68 // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
69 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
70 // CHECK-NEXT: br i1 [[CMP]], label %for.body, label %for.end
71 // CHECK: for.body:
72 // CXX98-NOT: br {{.*}}, !llvm.loop
73 // CXX11: br label %for.cond, !llvm.loop [[LOOP3:!.*]]
74 // FINITE-NEXT: br label %for.cond, !llvm.loop [[LOOP3:!.*]]
75 // CHECK: for.end:
76 // CHECK-NEXT: ret void
77 //
f2()78 void f2() {
79 for (; a == b;)
80 ;
81 }
82
83 // CXX98-NOT: mustprogress
84 // CXX11-NOT: mustprogress
85 // FINITE-NOT: mustprogress
86 // CHECK-LABEL: @_Z1Fv(
87 // CHECK-NEXT: entry:
88 // CHECK-NEXT: br label %for.cond
89 // CHECK: for.cond:
90 // CHECK-NEXT: br i1 true, label %for.body, label %for.end
91 // CHECK: for.body:
92 // CXX98-NOT: br {{.*}}, !llvm.loop
93 // CXX11-NOT: br {{.*}}, !llvm.loop
94 // FINITE-NOT: br {{.*}}, !llvm.loop
95 // CHECK: for.end:
96 // CHECK-NEXT: br label %for.cond1
97 // CHECK: for.cond1:
98 // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
99 // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
100 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
101 // CHECK-NEXT: br i1 [[CMP]], label %for.body2, label %for.end3
102 // CHECK: for.body2:
103 // CXX98-NOT: br {{.*}}, !llvm.loop
104 // CXX11-NEXT: br label %for.cond1, !llvm.loop [[LOOP5:!.*]]
105 // FINITE-NEXT: br label %for.cond1, !llvm.loop [[LOOP5:!.*]]
106 // CHECK: for.end3:
107 // CHECK-NEXT: ret void
108 //
F()109 void F() {
110 for (; 1;)
111 ;
112 for (; a == b;)
113 ;
114 }
115
116 // CXX98-NOT: mustprogress
117 // CXX11-NOT: mustprogress
118 // FINITE-NOT: mustprogress
119 // CHECK-LABEL: @_Z2F2v(
120 // CHECK-NEXT: entry:
121 // CHECK-NEXT: br label %for.cond
122 // CHECK: for.cond:
123 // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
124 // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
125 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
126 // CHECK-NEXT: br i1 [[CMP]], label %for.body, label %for.end
127 // CHECK: for.body:
128 // CXX98-NOT: br {{.*}} !llvm.loop
129 // CXX11-NEXT: br label %for.cond, !llvm.loop [[LOOP6:!.*]]
130 // FINITE-NEXT: br label %for.cond, !llvm.loop [[LOOP6:!.*]]
131 // CHECK: for.end:
132 // CHECK-NEXT: br label %for.cond1
133 // CHECK: for.cond1:
134 // CHECK-NEXT: br i1 true, label %for.body2, label %for.end3
135 // CHECK: for.body2:
136 // CXX98-NOT: br {{.*}}, !llvm.loop
137 // CXX11-NOT: br {{.*}}, !llvm.loop
138 // FINITE-NOT: br {{.*}}, !llvm.loop
139 // CHECK: for.end3:
140 // CHECK-NEXT: ret void
141 //
F2()142 void F2() {
143 for (; a == b;)
144 ;
145 for (; 1;)
146 ;
147 }
148
149 // CXX98-NOT: mustprogress
150 // CXX11-NOT: mustprogress
151 // FINITE-NOT: mustprogress
152 // CHECK-LABEL: @_Z2w1v(
153 // CHECK-NEXT: entry:
154 // CHECK-NEXT: br label %while.body
155 // CHECK: while.body:
156 // CXX98-NOT: br {{.*}}, !llvm.loop
157 // CXX11-NOT: br {{.*}}, !llvm.loop
158 // FINITE-NOT: br {{.*}}, !llvm.loop
159 //
w1()160 void w1() {
161 while (1)
162 ;
163 }
164
165 // CXX98-NOT: mustprogress
166 // CXX11: mustprogress
167 // FINITE-NOT: mustprogress
168 // CHECK-LABEL: @_Z2w2v(
169 // CHECK-NEXT: entry:
170 // CHECK-NEXT: br label %while.cond
171 // CHECK: while.cond:
172 // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
173 // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
174 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
175 // CHECK-NEXT: br i1 [[CMP]], label %while.body, label %while.end
176 // CHECK: while.body:
177 // CXX98-NOT: br {{.*}}, !llvm.loop
178 // CXX11-NEXT: br label %while.cond, !llvm.loop [[LOOP9:!.*]]
179 // FINITE-NEXT: br label %while.cond, !llvm.loop [[LOOP9:!.*]]
180 // CHECK: while.end:
181 // CHECK-NEXT: ret void
182 //
w2()183 void w2() {
184 while (a == b)
185 ;
186 }
187
188 // CXX98-NOT: mustprogress
189 // CXX11-NOT: mustprogress
190 // FINITE-NOT: mustprogress
191 // CHECK-LABEL: @_Z1Wv(
192 // CHECK-NEXT: entry:
193 // CHECK-NEXT: br label %while.cond
194 // CHECK: while.cond:
195 // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
196 // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
197 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
198 // CHECK-NEXT: br i1 [[CMP]], label %while.body, label %while.end
199 // CHECK: while.body:
200 // CXX98-NOT: br {{.*}}, !llvm.loop
201 // CXX11-NEXT: br label %while.cond, !llvm.loop [[LOOP10:!.*]]
202 // FINITE-NEXT: br label %while.cond, !llvm.loop [[LOOP10:!.*]]
203 // CHECK: while.end:
204 // CHECK-NEXT: br label %while.body2
205 // CHECK: while.body2:
206 // CXX98-NOT: br {{.*}}, !llvm.loop
207 // CXX11-NOT: br {{.*}}, !llvm.loop
208 // FINITE-NOT: br {{.*}}, !llvm.loop
209 //
W()210 void W() {
211 while (a == b)
212 ;
213 while (1)
214 ;
215 }
216
217 // CXX98-NOT: mustprogress
218 // CXX11-NOT: mustprogress
219 // FINITE-NOT: mustprogress
220 // CHECK-LABEL: @_Z2W2v(
221 // CHECK-NEXT: entry:
222 // CHECK-NEXT: br label %while.body
223 // CHECK: while.body:
224 // CXX98-NOT: br {{.*}}, !llvm.loop
225 // CXX11-NOT: br {{.*}}, !llvm.loop
226 // FINITE-NOT: br {{.*}}, !llvm.loop
227 //
W2()228 void W2() {
229 while (1)
230 ;
231 while (a == b)
232 ;
233 }
234
235 // CXX98-NOT: mustprogress
236 // CXX11-NOT: mustprogress
237 // FINITE-NOT: mustprogress
238 // CHECK-LABEL: @_Z2d1v(
239 // CHECK-NEXT: entry:
240 // CHECK-NEXT: br label %do.body
241 // CHECK: do.body:
242 // CHECK-NEXT: br label %do.cond
243 // CHECK: do.cond:
244 // CXX98-NOT: br {{.*}}, !llvm.loop
245 // CXX11-NOT: br {{.*}}, !llvm.loop
246 // FINITE-NOT: br {{.*}}, !llvm.loop
247 // CHECK: do.end:
248 // CHECK-NEXT: ret void
249 //
d1()250 void d1() {
251 do
252 ;
253 while (1);
254 }
255
256 // CXX98-NOT: mustprogress
257 // CXX11: mustprogress
258 // FINITE-NOT: mustprogress
259 // CHECK-LABEL: @_Z2d2v(
260 // CHECK-NEXT: entry:
261 // CHECK-NEXT: br label %do.body
262 // CHECK: do.body:
263 // CHECK-NEXT: br label %do.cond
264 // CHECK: do.cond:
265 // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
266 // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
267 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
268 // CXX98-NOT: br {{.*}}, !llvm.loop
269 // CXX11-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP14:!.*]]
270 // FINITE-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP14:!.*]]
271 // CHECK: do.end:
272 // CHECK-NEXT: ret void
273 //
d2()274 void d2() {
275 do
276 ;
277 while (a == b);
278 }
279
280 // CXX98-NOT: mustprogress
281 // CXX11-NOT: mustprogress
282 // FINITE-NOT: mustprogress
283 // CHECK-LABEL: @_Z1Dv(
284 // CHECK-NEXT: entry:
285 // CHECK-NEXT: br label %do.body
286 // CHECK: do.body:
287 // CHECK-NEXT: br label %do.cond
288 // CHECK: do.cond:
289 // CXX98-NOT: br {{.*}}, !llvm.loop
290 // CXX11-NOT: br {{.*}}, !llvm.loop
291 // FINITE-NOT: br {{.*}}, !llvm.loop
292 // CHECK: do.end:
293 // CHECK-NEXT: br label %do.body1
294 // CHECK: do.body1:
295 // CHECK-NEXT: br label %do.cond2
296 // CHECK: do.cond2:
297 // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
298 // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
299 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
300 // CXX98-NOT: br {{.*}}, !llvm.loop
301 // CXX11-NEXT: br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP16:!.*]]
302 // FINITE-NEXT: br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP16:!.*]]
303 // CHECK: do.end3:
304 // CHECK-NEXT: ret void
305 //
D()306 void D() {
307 do
308 ;
309 while (1);
310 do
311 ;
312 while (a == b);
313 }
314
315 // CXX98-NOT: mustprogress
316 // CXX11-NOT: mustprogress
317 // FINITE-NOT: mustprogress
318 // CHECK-LABEL: @_Z2D2v(
319 // CHECK-NEXT: entry:
320 // CHECK-NEXT: br label %do.body
321 // CHECK: do.body:
322 // CHECK-NEXT: br label %do.cond
323 // CHECK: do.cond:
324 // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
325 // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
326 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
327 // CXX98-NOT: br {{.*}}, !llvm.loop
328 // CXX11-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP17:!.*]]
329 // FINITE-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP17:!.*]]
330 // CHECK: do.end:
331 // CHECK-NEXT: br label %do.body1
332 // CHECK: do.body1:
333 // CHECK-NEXT: br label %do.cond2
334 // CHECK: do.cond2:
335 // CXX98-NOT: br {{.*}}, !llvm.loop
336 // CXX11-NOT: br {{.*}}, !llvm.loop
337 // FINITE-NOT: br {{.*}}, !llvm.loop
338 // CHECK: do.end3:
339 // CHECK-NEXT: ret void
340 //
D2()341 void D2() {
342 do
343 ;
344 while (a == b);
345 do
346 ;
347 while (1);
348 }
349
350 // CXX98-NOT: mustprogress
351 // CXX11-NOT: mustprogress
352 // FINITE-NOT: mustprogress
353 // CHECK-LABEL: @_Z9compound0v(
354 // CHECK-NEXT: entry:
355 // CHECK-NEXT: br label %for.cond
356 // CHECK: for.cond:
357 // CXX98-NOT: br {{.*}}, !llvm.loop
358 // CXX11-NOT: br {{.*}}, !llvm.loop
359 // FINITE-NOT: br {{.*}}, !llvm.loop
compound0()360 void compound0() {
361 for (; ;) {}
362 }
363
364 // CXX98-NOT: mustprogress
365 // CXX11-NOT: mustprogress
366 // FINITE-NOT: mustprogress
367 // CHECK-LABEL: @_Z9compound1v(
368 // CHECK-NEXT: entry:
369 // CHECK-NEXT: br label %for.cond
370 // CHECK: for.cond:
371 // CXX98-NOT: br {{.*}}, llvm.loop
372 // CXX11-NOT: br {{.*}}, llvm.loop
373 // FINITE-NOT: br {{.*}}, !llvm.loop
compound1()374 void compound1() {
375 for (; ;) {/*! */}
376 }
377
378 // CXX98-NOT: mustprogress
379 // CXX11-NOT: mustprogress
380 // FINITE-NOT: mustprogress
381 // CHECK-LABEL: @_Z9compound2v(
382 // CHECK-NEXT: entry:
383 // CHECK-NEXT: br label %do.body
384 // CHECK: do.body:
385 // CHECK-NEXT: br label %do.cond
386 // CHECK: do.cond:
387 // CXX98-NOT: br {{.*}}, !llvm.loop
388 // CXX11-NOT: br {{.*}}, !llvm.loop
389 // FINITE-NOT: br {{.*}}, !llvm.loop
390 // CHECK: do.end:
391 // CHECK-NEXT: ret void
392 //
compound2()393 void compound2() {
394 do {} while (1+1);
395 }
396
397 // CXX98-NOT: mustprogress
398 // CXX11 : mustprogress
399 // FINITE : mustprogress
400 // CHECK-LABEL: @_Z5Falsev(
401 // CHECK-NEXT: entry:
402 // CHECK-NEXT: br label %do.body
403 // CHECK: do.body:
404 // CHECK-NEXT: br label %do.end
405 // CHECK: do.end:
406 // CHECK-NEXT: ret void
407 //
False()408 void False() {
409 do {} while (1-1);
410 }
411
412
413 // CXX11: [[LOOP3]] = distinct !{[[LOOP3]], [[MP:.*]]}
414 // CXX11: [[MP]] = !{!"llvm.loop.mustprogress"}
415 // CXX11: [[LOOP5]] = distinct !{[[LOOP5]], [[MP]]}
416 // CXX11: [[LOOP6]] = distinct !{[[LOOP6]], [[MP]]}
417 // CXX11: [[LOOP9]] = distinct !{[[LOOP9]], [[MP]]}
418 // CXX11: [[LOOP10]] = distinct !{[[LOOP10]], [[MP]]}
419 // CXX11: [[LOOP14]] = distinct !{[[LOOP14]], [[MP]]}
420 // CXX11: [[LOOP16]] = distinct !{[[LOOP16]], [[MP]]}
421 // CXX11: [[LOOP17]] = distinct !{[[LOOP17]], [[MP]]}
422