1 // RUN: %clang_cc1 -std=c++98 -triple=x86_64-unknown-linux-gnu -S -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 -S -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 -S -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 -S -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 -S -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 -S -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 -S -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 -S -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 -S -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 -S -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 -S -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 -S -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 -S -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 -S -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 -S -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 // CHECK-NOT:    br {{.*}} llvm.loop
34 void f0() {
35   for (; ;) ;
36 }
37 
38 // CXX98-NOT: mustprogress
39 // CXX11-NOT: mustprogress
40 // FINITE-NOT: mustprogress
41 // CHECK-LABEL: @_Z2f1v(
42 // CHECK-NEXT:  entry:
43 // CHECK-NEXT:    br label %for.cond
44 // CHECK:       for.cond:
45 // CHECK-NEXT:    br i1 true, label %for.body, label %for.end
46 // CHECK:       for.body:
47 // CHECK-NOT:    br {{.*}}, !llvm.loop
48 // CHECK:       for.end:
49 // CHECK-NEXT:    ret void
50 //
51 void f1() {
52   for (; 1;)
53     ;
54 }
55 
56 // CXX98-NOT: mustprogress
57 // CXX11:     mustprogress
58 // FINITE-NOT: mustprogress
59 // CHECK-LABEL: @_Z2f2v(
60 // CHECK-NEXT:  entry:
61 // CHECK-NEXT:    br label %for.cond
62 // CHECK:       for.cond:
63 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
64 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
65 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
66 // CHECK-NEXT:    br i1 [[CMP]], label %for.body, label %for.end
67 // CHECK:       for.body:
68 // CXX98-NOT:    br {{.*}}, !llvm.loop
69 // CXX11:        br label %for.cond, !llvm.loop [[LOOP1:!.*]]
70 // FINITE-NEXT:   br label %for.cond, !llvm.loop [[LOOP1:!.*]]
71 // CHECK:       for.end:
72 // CHECK-NEXT:    ret void
73 //
74 void f2() {
75   for (; a == b;)
76     ;
77 }
78 
79 // CXX98-NOT: mustprogress
80 // CXX11-NOT: mustprogress
81 // FINITE-NOT: mustprogress
82 // CHECK-LABEL: @_Z1Fv(
83 // CHECK-NEXT:  entry:
84 // CHECK-NEXT:    br label %for.cond
85 // CHECK:       for.cond:
86 // CHECK-NEXT:    br i1 true, label %for.body, label %for.end
87 // CHECK:       for.body:
88 // CHECK-NOT:     br {{.*}}, !llvm.loop
89 // CHECK:       for.end:
90 // CHECK-NEXT:    br label %for.cond1
91 // CHECK:       for.cond1:
92 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
93 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
94 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
95 // CHECK-NEXT:    br i1 [[CMP]], label %for.body2, label %for.end3
96 // CHECK:       for.body2:
97 // CXX98-NOT:     br {{.*}}, !llvm.loop
98 // CXX11-NEXT:    br label %for.cond1, !llvm.loop [[LOOP2:!.*]]
99 // FINITE-NEXT:   br label %for.cond1, !llvm.loop [[LOOP2:!.*]]
100 // CHECK:       for.end3:
101 // CHECK-NEXT:    ret void
102 //
103 void F() {
104   for (; 1;)
105     ;
106   for (; a == b;)
107     ;
108 }
109 
110 // CXX98-NOT: mustprogress
111 // CXX11-NOT: mustprogress
112 // FINITE-NOT: mustprogress
113 // CHECK-LABEL: @_Z2F2v(
114 // CHECK-NEXT:  entry:
115 // CHECK-NEXT:    br label %for.cond
116 // CHECK:       for.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 %for.body, label %for.end
121 // CHECK:       for.body:
122 // CXX98_NOT:     br {{.*}} !llvm.loop
123 // CXX11-NEXT:    br label %for.cond, !llvm.loop [[LOOP3:!.*]]
124 // FINITE-NEXT:    br label %for.cond, !llvm.loop [[LOOP3:!.*]]
125 // CHECK:       for.end:
126 // CHECK-NEXT:    br label %for.cond1
127 // CHECK:       for.cond1:
128 // CHECK-NEXT:    br i1 true, label %for.body2, label %for.end3
129 // CHECK:       for.body2:
130 // CHECK-NOT:     br {{.*}}, !llvm.loop
131 // CHECK:       for.end3:
132 // CHECK-NEXT:    ret void
133 //
134 void F2() {
135   for (; a == b;)
136     ;
137   for (; 1;)
138     ;
139 }
140 
141 // CXX98-NOT: mustprogress
142 // CXX11-NOT: mustprogress
143 // FINITE-NOT:     mustprogress
144 // CHECK-LABEL: @_Z2w1v(
145 // CHECK-NEXT:  entry:
146 // CHECK-NEXT:    br label %while.body
147 // CHECK:       while.body:
148 // CHECK-NOT:     br {{.*}}, !llvm.loop
149 //
150 void w1() {
151   while (1)
152     ;
153 }
154 
155 // CXX98-NOT: mustprogress
156 // CXX11:     mustprogress
157 // FINITE-NOT: mustprogress
158 // CHECK-LABEL: @_Z2w2v(
159 // CHECK-NEXT:  entry:
160 // CHECK-NEXT:    br label %while.cond
161 // CHECK:       while.cond:
162 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
163 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
164 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
165 // CHECK-NEXT:    br i1 [[CMP]], label %while.body, label %while.end
166 // CHECK:       while.body:
167 // CXX98-NOT:     br {{.*}}, !llvm.loop
168 // CXX11-NEXT:    br label %while.cond, !llvm.loop [[LOOP4:!.*]]
169 // FINITE-NEXT:   br label %while.cond, !llvm.loop [[LOOP4:!.*]]
170 // CHECK:       while.end:
171 // CHECK-NEXT:    ret void
172 //
173 void w2() {
174   while (a == b)
175     ;
176 }
177 
178 // CXX98-NOT: mustprogress
179 // CXX11-NOT: mustprogress
180 // FINITE-NOT: mustprogress
181 // CHECK-LABEL: @_Z1Wv(
182 // CHECK-NEXT:  entry:
183 // CHECK-NEXT:    br label %while.cond
184 // CHECK:       while.cond:
185 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
186 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
187 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
188 // CHECK-NEXT:    br i1 [[CMP]], label %while.body, label %while.end
189 // CHECK:       while.body:
190 // CXX98-NOT:     br {{.*}}, !llvm.loop
191 // CXX11-NEXT:    br label %while.cond, !llvm.loop [[LOOP5:!.*]]
192 // FINITE-NEXT:   br label %while.cond, !llvm.loop [[LOOP5:!.*]]
193 // CHECK:       while.end:
194 // CHECK-NEXT:    br label %while.body2
195 // CHECK:       while.body2:
196 // CHECK-NOT:     br {{.*}}, !llvm.loop
197 //
198 void W() {
199   while (a == b)
200     ;
201   while (1)
202     ;
203 }
204 
205 // CXX98-NOT: mustprogress
206 // CXX11-NOT: mustprogress
207 // FINITE-NOT: mustprogress
208 // CHECK-LABEL: @_Z2W2v(
209 // CHECK-NEXT:  entry:
210 // CHECK-NEXT:    br label %while.body
211 // CHECK:       while.body:
212 // CHECK-NOT:     br {{.*}}, !llvm.loop
213 //
214 void W2() {
215   while (1)
216     ;
217   while (a == b)
218     ;
219 }
220 
221 // CXX98-NOT: mustprogress
222 // CXX11-NOT: mustprogress
223 // FINITE-NOT: mustprogress
224 // CHECK-LABEL: @_Z2d1v(
225 // CHECK-NEXT:  entry:
226 // CHECK-NEXT:    br label %do.body
227 // CHECK:       do.body:
228 // CHECK-NEXT:    br label %do.cond
229 // CHECK:       do.cond:
230 // CHECK-NOT:     br {{.*}}, !llvm.loop
231 // CHECK:       do.end:
232 // CHECK-NEXT:    ret void
233 //
234 void d1() {
235   do
236     ;
237   while (1);
238 }
239 
240 // CXX98-NOT: mustprogress
241 // CXX11:     mustprogress
242 // FINITE-NOT:  mustprogress
243 // CHECK-LABEL: @_Z2d2v(
244 // CHECK-NEXT:  entry:
245 // CHECK-NEXT:    br label %do.body
246 // CHECK:       do.body:
247 // CHECK-NEXT:    br label %do.cond
248 // CHECK:       do.cond:
249 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
250 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
251 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
252 // CXX98-NOT:     br {{.*}}, !llvm.loop
253 // CXX11-NEXT:    br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP6:!.*]]
254 // FINITE-NEXT:   br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP6:!.*]]
255 // CHECK:       do.end:
256 // CHECK-NEXT:    ret void
257 //
258 void d2() {
259   do
260     ;
261   while (a == b);
262 }
263 
264 // CXX98-NOT: mustprogress
265 // CXX11-NOT: mustprogress
266 // FINITE-NOT:     mustprogress
267 // CHECK-LABEL: @_Z1Dv(
268 // CHECK-NEXT:  entry:
269 // CHECK-NEXT:    br label %do.body
270 // CHECK:       do.body:
271 // CHECK-NEXT:    br label %do.cond
272 // CHECK:       do.cond:
273 // CHECK-NOT:     br {{.*}}, !llvm.loop
274 // CHECK:       do.end:
275 // CHECK-NEXT:    br label %do.body1
276 // CHECK:       do.body1:
277 // CHECK-NEXT:    br label %do.cond2
278 // CHECK:       do.cond2:
279 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
280 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
281 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
282 // CXX98-NOT:     br {{.*}}, !llvm.loop
283 // CXX11-NEXT:    br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP7:!.*]]
284 // FINITE-NEXT:   br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP7:!.*]]
285 // CHECK:       do.end3:
286 // CHECK-NEXT:    ret void
287 //
288 void D() {
289   do
290     ;
291   while (1);
292   do
293     ;
294   while (a == b);
295 }
296 
297 // CXX98-NOT: mustprogress
298 // CXX11-NOT: mustprogress
299 // FINITE-NOT:     mustprogress
300 // CHECK-LABEL: @_Z2D2v(
301 // CHECK-NEXT:  entry:
302 // CHECK-NEXT:    br label %do.body
303 // CHECK:       do.body:
304 // CHECK-NEXT:    br label %do.cond
305 // CHECK:       do.cond:
306 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
307 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
308 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
309 // CXX98-NOT:     br {{.*}}, !llvm.loop
310 // CXX11-NEXT:    br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP8:!.*]]
311 // FINITE-NEXT:   br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP8:!.*]]
312 // CHECK:       do.end:
313 // CHECK-NEXT:    br label %do.body1
314 // CHECK:       do.body1:
315 // CHECK-NEXT:    br label %do.cond2
316 // CHECK:       do.cond2:
317 // CHECK-NOT:     br {{.*}}, !llvm.loop
318 // CHECK:       do.end3:
319 // CHECK-NEXT:    ret void
320 //
321 void D2() {
322   do
323     ;
324   while (a == b);
325   do
326     ;
327   while (1);
328 }
329 
330 // CXX11: [[LOOP1]] = distinct !{[[LOOP1]], [[MP:!.*]]}
331 // CXX11: [[MP]] = !{!"llvm.loop.mustprogress"}
332 // CXX11: [[LOOP2]] = distinct !{[[LOOP2]], [[MP]]}
333 // CXX11: [[LOOP3]] = distinct !{[[LOOP3]], [[MP]]}
334 // CXX11: [[LOOP4]] = distinct !{[[LOOP4]], [[MP]]}
335 // CXX11: [[LOOP5]] = distinct !{[[LOOP5]], [[MP]]}
336 // CXX11: [[LOOP6]] = distinct !{[[LOOP6]], [[MP]]}
337 // CXX11: [[LOOP7]] = distinct !{[[LOOP7]], [[MP]]}
338 // CXX11: [[LOOP8]] = distinct !{[[LOOP8]], [[MP]]}
339