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