1532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -std=c++98 -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s
2532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
3532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -std=c++14 -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
4532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -std=c++17 -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
5532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -std=c++20 -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
6fb4d8fe8SFlorian Hahn 
77ca4dd82SFlorian Hahn // Check -ffinite-loops option in combination with various standard versions.
8532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -std=c++98 -ffinite-loops -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=FINITE %s
9532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -ffinite-loops -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
10532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -std=c++14 -ffinite-loops -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
11532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -std=c++17 -ffinite-loops -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
12532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -std=c++20 -ffinite-loops -triple=x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
1351bf4c0eSFlorian Hahn 
147ca4dd82SFlorian Hahn // Check -fno-finite-loops option in combination with various standard versions.
15532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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
16532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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
17532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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
18532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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
19532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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
2051bf4c0eSFlorian Hahn 
21fb4d8fe8SFlorian Hahn int a = 0;
22fb4d8fe8SFlorian Hahn int b = 0;
23fb4d8fe8SFlorian Hahn 
24fb4d8fe8SFlorian Hahn // CHECK: datalayout
25fb4d8fe8SFlorian Hahn 
26fb4d8fe8SFlorian Hahn // CXX98-NOT:  mustprogress
276c312954SFlorian Hahn // CXX11:      mustprogress
2851bf4c0eSFlorian Hahn // FINITE-NOT: mustprogress
29fb4d8fe8SFlorian Hahn // CHECK-LABEL: @_Z2f0v(
30fb4d8fe8SFlorian Hahn // CHECK-NEXT:  entry:
31fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %for.cond
32fb4d8fe8SFlorian Hahn // CHECK:       for.cond:
336c312954SFlorian Hahn // CXX98-NOT:    br {{.*}} llvm.loop
346c312954SFlorian Hahn // CXX11-NEXT:   br label %for.cond, !llvm.loop [[LOOP1:!.*]]
356c312954SFlorian Hahn // FINITE-NEXT:  br label %for.cond, !llvm.loop [[LOOP1:!.*]]
f0()36fb4d8fe8SFlorian Hahn void f0() {
37fb4d8fe8SFlorian Hahn   for (; ;) ;
38fb4d8fe8SFlorian Hahn }
39fb4d8fe8SFlorian Hahn 
40fb4d8fe8SFlorian Hahn // CXX98-NOT:  mustprogress
416c312954SFlorian Hahn // CXX11:      mustprogress
4251bf4c0eSFlorian Hahn // FINITE-NOT: mustprogress
43fb4d8fe8SFlorian Hahn // CHECK-LABEL: @_Z2f1v(
44fb4d8fe8SFlorian Hahn // CHECK-NEXT:  entry:
45fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %for.cond
46fb4d8fe8SFlorian Hahn // CHECK:       for.cond:
47fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br i1 true, label %for.body, label %for.end
48fb4d8fe8SFlorian Hahn // CHECK:       for.body:
496c312954SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
506c312954SFlorian Hahn // CXX11-NEXT:    br label %for.cond, !llvm.loop [[LOOP2:!.*]]
516c312954SFlorian Hahn // FINITE-NEXT:  br label %for.cond, !llvm.loop [[LOOP2:!.*]]
52fb4d8fe8SFlorian Hahn // CHECK:       for.end:
53fb4d8fe8SFlorian Hahn // CHECK-NEXT:    ret void
54fb4d8fe8SFlorian Hahn //
f1()55fb4d8fe8SFlorian Hahn void f1() {
56fb4d8fe8SFlorian Hahn   for (; 1;)
57fb4d8fe8SFlorian Hahn     ;
58fb4d8fe8SFlorian Hahn }
59fb4d8fe8SFlorian Hahn 
60fb4d8fe8SFlorian Hahn // CXX98-NOT:  mustprogress
61fb4d8fe8SFlorian Hahn // CXX11:      mustprogress
6251bf4c0eSFlorian Hahn // FINITE-NOT: mustprogress
63fb4d8fe8SFlorian Hahn // CHECK-LABEL: @_Z2f2v(
64fb4d8fe8SFlorian Hahn // CHECK-NEXT:  entry:
65fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %for.cond
66fb4d8fe8SFlorian Hahn // CHECK:       for.cond:
67fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
68fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
69fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
70fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br i1 [[CMP]], label %for.body, label %for.end
71fb4d8fe8SFlorian Hahn // CHECK:       for.body:
72fb4d8fe8SFlorian Hahn // CXX98-NOT:    br {{.*}}, !llvm.loop
736c312954SFlorian Hahn // CXX11:        br label %for.cond, !llvm.loop [[LOOP3:!.*]]
746c312954SFlorian Hahn // FINITE-NEXT:  br label %for.cond, !llvm.loop [[LOOP3:!.*]]
75fb4d8fe8SFlorian Hahn // CHECK:       for.end:
76fb4d8fe8SFlorian Hahn // CHECK-NEXT:    ret void
77fb4d8fe8SFlorian Hahn //
f2()78fb4d8fe8SFlorian Hahn void f2() {
79fb4d8fe8SFlorian Hahn   for (; a == b;)
80fb4d8fe8SFlorian Hahn     ;
81fb4d8fe8SFlorian Hahn }
82fb4d8fe8SFlorian Hahn 
83fb4d8fe8SFlorian Hahn // CXX98-NOT:  mustprogress
846c312954SFlorian Hahn // CXX11:      mustprogress
8551bf4c0eSFlorian Hahn // FINITE-NOT: mustprogress
86fb4d8fe8SFlorian Hahn // CHECK-LABEL: @_Z1Fv(
87fb4d8fe8SFlorian Hahn // CHECK-NEXT:  entry:
88fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %for.cond
89fb4d8fe8SFlorian Hahn // CHECK:       for.cond:
90fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br i1 true, label %for.body, label %for.end
91fb4d8fe8SFlorian Hahn // CHECK:       for.body:
926c312954SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
936c312954SFlorian Hahn // CXX11-NEXT:    br label %for.cond, !llvm.loop [[LOOP4:!.*]]
946c312954SFlorian Hahn // FINITE-NEXT:   br label %for.cond, !llvm.loop [[LOOP4:!.*]]
95fb4d8fe8SFlorian Hahn // CHECK:       for.end:
96fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %for.cond1
97fb4d8fe8SFlorian Hahn // CHECK:       for.cond1:
98fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
99fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
100fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
101fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br i1 [[CMP]], label %for.body2, label %for.end3
102fb4d8fe8SFlorian Hahn // CHECK:       for.body2:
103fb4d8fe8SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
1046c312954SFlorian Hahn // CXX11-NEXT:    br label %for.cond1, !llvm.loop [[LOOP5:!.*]]
1056c312954SFlorian Hahn // FINITE-NEXT:   br label %for.cond1, !llvm.loop [[LOOP5:!.*]]
106fb4d8fe8SFlorian Hahn // CHECK:       for.end3:
107fb4d8fe8SFlorian Hahn // CHECK-NEXT:    ret void
108fb4d8fe8SFlorian Hahn //
F()109fb4d8fe8SFlorian Hahn void F() {
110fb4d8fe8SFlorian Hahn   for (; 1;)
111fb4d8fe8SFlorian Hahn     ;
112fb4d8fe8SFlorian Hahn   for (; a == b;)
113fb4d8fe8SFlorian Hahn     ;
114fb4d8fe8SFlorian Hahn }
115fb4d8fe8SFlorian Hahn 
116fb4d8fe8SFlorian Hahn // CXX98-NOT:  mustprogress
1176c312954SFlorian Hahn // CXX11:      mustprogress
11851bf4c0eSFlorian Hahn // FINITE-NOT: mustprogress
119fb4d8fe8SFlorian Hahn // CHECK-LABEL: @_Z2F2v(
120fb4d8fe8SFlorian Hahn // CHECK-NEXT:  entry:
121fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %for.cond
122fb4d8fe8SFlorian Hahn // CHECK:       for.cond:
123fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
124fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
125fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
126fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br i1 [[CMP]], label %for.body, label %for.end
127fb4d8fe8SFlorian Hahn // CHECK:       for.body:
128*ad1d60c3SIvan Kosarev // CXX98-NOT:     br {{.*}} !llvm.loop
1296c312954SFlorian Hahn // CXX11-NEXT:    br label %for.cond, !llvm.loop [[LOOP6:!.*]]
1306c312954SFlorian Hahn // FINITE-NEXT:   br label %for.cond, !llvm.loop [[LOOP6:!.*]]
131fb4d8fe8SFlorian Hahn // CHECK:       for.end:
132fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %for.cond1
133fb4d8fe8SFlorian Hahn // CHECK:       for.cond1:
134fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br i1 true, label %for.body2, label %for.end3
135fb4d8fe8SFlorian Hahn // CHECK:       for.body2:
1366c312954SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
1376c312954SFlorian Hahn // CXX11-NEXT:    br label %for.cond1, !llvm.loop [[LOOP7:!.*]]
1386c312954SFlorian Hahn // FINITE-NEXT:   br label %for.cond1, !llvm.loop [[LOOP7:!.*]]
139fb4d8fe8SFlorian Hahn // CHECK:       for.end3:
140fb4d8fe8SFlorian Hahn // CHECK-NEXT:    ret void
141fb4d8fe8SFlorian Hahn //
F2()142fb4d8fe8SFlorian Hahn void F2() {
143fb4d8fe8SFlorian Hahn   for (; a == b;)
144fb4d8fe8SFlorian Hahn     ;
145fb4d8fe8SFlorian Hahn   for (; 1;)
146fb4d8fe8SFlorian Hahn     ;
147fb4d8fe8SFlorian Hahn }
148fb4d8fe8SFlorian Hahn 
149fb4d8fe8SFlorian Hahn // CXX98-NOT:  mustprogress
1506c312954SFlorian Hahn // CXX11:      mustprogress
15151bf4c0eSFlorian Hahn // FINITE-NOT: mustprogress
152fb4d8fe8SFlorian Hahn // CHECK-LABEL: @_Z2w1v(
153fb4d8fe8SFlorian Hahn // CHECK-NEXT:  entry:
154fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %while.body
155fb4d8fe8SFlorian Hahn // CHECK:       while.body:
1566c312954SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
1576c312954SFlorian Hahn // CXX11-NEXT:    br label %while.body, !llvm.loop [[LOOP8:!.*]]
1586c312954SFlorian Hahn // FINITE-NEXT:   br label %while.body, !llvm.loop [[LOOP8:!.*]]
159fb4d8fe8SFlorian Hahn //
w1()160fb4d8fe8SFlorian Hahn void w1() {
161fb4d8fe8SFlorian Hahn   while (1)
162fb4d8fe8SFlorian Hahn     ;
163fb4d8fe8SFlorian Hahn }
164fb4d8fe8SFlorian Hahn 
165fb4d8fe8SFlorian Hahn // CXX98-NOT:  mustprogress
166fb4d8fe8SFlorian Hahn // CXX11:      mustprogress
16751bf4c0eSFlorian Hahn // FINITE-NOT: mustprogress
168fb4d8fe8SFlorian Hahn // CHECK-LABEL: @_Z2w2v(
169fb4d8fe8SFlorian Hahn // CHECK-NEXT:  entry:
170fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %while.cond
171fb4d8fe8SFlorian Hahn // CHECK:       while.cond:
172fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
173fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
174fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
175fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br i1 [[CMP]], label %while.body, label %while.end
176fb4d8fe8SFlorian Hahn // CHECK:       while.body:
177fb4d8fe8SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
1786c312954SFlorian Hahn // CXX11-NEXT:    br label %while.cond, !llvm.loop [[LOOP9:!.*]]
1796c312954SFlorian Hahn // FINITE-NEXT:   br label %while.cond, !llvm.loop [[LOOP9:!.*]]
180fb4d8fe8SFlorian Hahn // CHECK:       while.end:
181fb4d8fe8SFlorian Hahn // CHECK-NEXT:    ret void
182fb4d8fe8SFlorian Hahn //
w2()183fb4d8fe8SFlorian Hahn void w2() {
184fb4d8fe8SFlorian Hahn   while (a == b)
185fb4d8fe8SFlorian Hahn     ;
186fb4d8fe8SFlorian Hahn }
187fb4d8fe8SFlorian Hahn 
188fb4d8fe8SFlorian Hahn // CXX98-NOT:  mustprogress
1896c312954SFlorian Hahn // CXX11:      mustprogress
19051bf4c0eSFlorian Hahn // FINITE-NOT: mustprogress
191fb4d8fe8SFlorian Hahn // CHECK-LABEL: @_Z1Wv(
192fb4d8fe8SFlorian Hahn // CHECK-NEXT:  entry:
193fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %while.cond
194fb4d8fe8SFlorian Hahn // CHECK:       while.cond:
195fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
196fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
197fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
198fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br i1 [[CMP]], label %while.body, label %while.end
199fb4d8fe8SFlorian Hahn // CHECK:       while.body:
200fb4d8fe8SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
2016c312954SFlorian Hahn // CXX11-NEXT:    br label %while.cond, !llvm.loop [[LOOP10:!.*]]
2026c312954SFlorian Hahn // FINITE-NEXT:   br label %while.cond, !llvm.loop [[LOOP10:!.*]]
203fb4d8fe8SFlorian Hahn // CHECK:       while.end:
204fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %while.body2
205fb4d8fe8SFlorian Hahn // CHECK:       while.body2:
2066c312954SFlorian Hahn // CXX98-NOT:    br {{.*}}, !llvm.loop
2076c312954SFlorian Hahn // CXX11-NEXT:   br label %while.body2, !llvm.loop [[LOOP11:!.*]]
2086c312954SFlorian Hahn // FINITE-NEXT:  br label %while.body2, !llvm.loop [[LOOP11:!.*]]
209fb4d8fe8SFlorian Hahn //
W()210fb4d8fe8SFlorian Hahn void W() {
211fb4d8fe8SFlorian Hahn   while (a == b)
212fb4d8fe8SFlorian Hahn     ;
213fb4d8fe8SFlorian Hahn   while (1)
214fb4d8fe8SFlorian Hahn     ;
215fb4d8fe8SFlorian Hahn }
216fb4d8fe8SFlorian Hahn 
217fb4d8fe8SFlorian Hahn // CXX98-NOT:  mustprogress
2186c312954SFlorian Hahn // CXX11:      mustprogress
21951bf4c0eSFlorian Hahn // FINITE-NOT: mustprogress
220fb4d8fe8SFlorian Hahn // CHECK-LABEL: @_Z2W2v(
221fb4d8fe8SFlorian Hahn // CHECK-NEXT:  entry:
222fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %while.body
223fb4d8fe8SFlorian Hahn // CHECK:       while.body:
2246c312954SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
2256c312954SFlorian Hahn // CXX11-NEXT:    br label %while.body, !llvm.loop [[LOOP12:!.*]]
2266c312954SFlorian Hahn // FINITE-NEXT:   br label %while.body, !llvm.loop [[LOOP12:!.*]]
227fb4d8fe8SFlorian Hahn //
W2()228fb4d8fe8SFlorian Hahn void W2() {
229fb4d8fe8SFlorian Hahn   while (1)
230fb4d8fe8SFlorian Hahn     ;
231fb4d8fe8SFlorian Hahn   while (a == b)
232fb4d8fe8SFlorian Hahn     ;
233fb4d8fe8SFlorian Hahn }
234fb4d8fe8SFlorian Hahn 
235fb4d8fe8SFlorian Hahn // CXX98-NOT:  mustprogress
2366c312954SFlorian Hahn // CXX11:      mustprogress
23751bf4c0eSFlorian Hahn // FINITE-NOT: mustprogress
238fb4d8fe8SFlorian Hahn // CHECK-LABEL: @_Z2d1v(
239fb4d8fe8SFlorian Hahn // CHECK-NEXT:  entry:
240fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %do.body
241fb4d8fe8SFlorian Hahn // CHECK:       do.body:
242fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %do.cond
243fb4d8fe8SFlorian Hahn // CHECK:       do.cond:
2446c312954SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
2456c312954SFlorian Hahn // CXX11-NEXT:    br i1 true, label %do.body, label %do.end, !llvm.loop [[LOOP13:!.*]]
2466c312954SFlorian Hahn // FINITE-NEXT:   br i1 true, label %do.body, label %do.end, !llvm.loop [[LOOP13:!.*]]
247fb4d8fe8SFlorian Hahn // CHECK:       do.end:
248fb4d8fe8SFlorian Hahn // CHECK-NEXT:    ret void
249fb4d8fe8SFlorian Hahn //
d1()250fb4d8fe8SFlorian Hahn void d1() {
251fb4d8fe8SFlorian Hahn   do
252fb4d8fe8SFlorian Hahn     ;
253fb4d8fe8SFlorian Hahn   while (1);
254fb4d8fe8SFlorian Hahn }
255fb4d8fe8SFlorian Hahn 
256fb4d8fe8SFlorian Hahn // CXX98-NOT:  mustprogress
257fb4d8fe8SFlorian Hahn // CXX11:      mustprogress
25851bf4c0eSFlorian Hahn // FINITE-NOT: mustprogress
259fb4d8fe8SFlorian Hahn // CHECK-LABEL: @_Z2d2v(
260fb4d8fe8SFlorian Hahn // CHECK-NEXT:  entry:
261fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %do.body
262fb4d8fe8SFlorian Hahn // CHECK:       do.body:
263fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %do.cond
264fb4d8fe8SFlorian Hahn // CHECK:       do.cond:
265fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
266fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
267fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
268fb4d8fe8SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
2696c312954SFlorian Hahn // CXX11-NEXT:    br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP14:!.*]]
2706c312954SFlorian Hahn // FINITE-NEXT:   br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP14:!.*]]
271fb4d8fe8SFlorian Hahn // CHECK:       do.end:
272fb4d8fe8SFlorian Hahn // CHECK-NEXT:    ret void
273fb4d8fe8SFlorian Hahn //
d2()274fb4d8fe8SFlorian Hahn void d2() {
275fb4d8fe8SFlorian Hahn   do
276fb4d8fe8SFlorian Hahn     ;
277fb4d8fe8SFlorian Hahn   while (a == b);
278fb4d8fe8SFlorian Hahn }
279fb4d8fe8SFlorian Hahn 
280fb4d8fe8SFlorian Hahn // CXX98-NOT:  mustprogress
2816c312954SFlorian Hahn // CXX11:      mustprogress
28251bf4c0eSFlorian Hahn // FINITE-NOT: mustprogress
283fb4d8fe8SFlorian Hahn // CHECK-LABEL: @_Z1Dv(
284fb4d8fe8SFlorian Hahn // CHECK-NEXT:  entry:
285fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %do.body
286fb4d8fe8SFlorian Hahn // CHECK:       do.body:
287fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %do.cond
288fb4d8fe8SFlorian Hahn // CHECK:       do.cond:
2896c312954SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
2906c312954SFlorian Hahn // CXX11-NEXT:    br i1 true, label %do.body, label %do.end, !llvm.loop [[LOOP15:!.*]]
2916c312954SFlorian Hahn // FINITE-NEXT:   br i1 true, label %do.body, label %do.end, !llvm.loop [[LOOP15:!.*]]
292fb4d8fe8SFlorian Hahn // CHECK:       do.end:
293fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %do.body1
294fb4d8fe8SFlorian Hahn // CHECK:       do.body1:
295fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %do.cond2
296fb4d8fe8SFlorian Hahn // CHECK:       do.cond2:
297fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
298fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
299fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
300fb4d8fe8SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
3016c312954SFlorian Hahn // CXX11-NEXT:    br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP16:!.*]]
3026c312954SFlorian Hahn // FINITE-NEXT:   br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP16:!.*]]
303fb4d8fe8SFlorian Hahn // CHECK:       do.end3:
304fb4d8fe8SFlorian Hahn // CHECK-NEXT:    ret void
305fb4d8fe8SFlorian Hahn //
D()306fb4d8fe8SFlorian Hahn void D() {
307fb4d8fe8SFlorian Hahn   do
308fb4d8fe8SFlorian Hahn     ;
309fb4d8fe8SFlorian Hahn   while (1);
310fb4d8fe8SFlorian Hahn   do
311fb4d8fe8SFlorian Hahn     ;
312fb4d8fe8SFlorian Hahn   while (a == b);
313fb4d8fe8SFlorian Hahn }
314fb4d8fe8SFlorian Hahn 
315fb4d8fe8SFlorian Hahn // CXX98-NOT : mustprogress
3166c312954SFlorian Hahn // CXX11:      mustprogress
31751bf4c0eSFlorian Hahn // FINITE-NOT: mustprogress
318fb4d8fe8SFlorian Hahn // CHECK-LABEL: @_Z2D2v(
319fb4d8fe8SFlorian Hahn // CHECK-NEXT:  entry:
320fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %do.body
321fb4d8fe8SFlorian Hahn // CHECK:       do.body:
322fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %do.cond
323fb4d8fe8SFlorian Hahn // CHECK:       do.cond:
324fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @a, align 4
325fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4
326fb4d8fe8SFlorian Hahn // CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
327fb4d8fe8SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
3286c312954SFlorian Hahn // CXX11-NEXT:    br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP17:!.*]]
3296c312954SFlorian Hahn // FINITE-NEXT:   br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP17:!.*]]
330fb4d8fe8SFlorian Hahn // CHECK:       do.end:
331fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %do.body1
332fb4d8fe8SFlorian Hahn // CHECK:       do.body1:
333fb4d8fe8SFlorian Hahn // CHECK-NEXT:    br label %do.cond2
334fb4d8fe8SFlorian Hahn // CHECK:       do.cond2:
3356c312954SFlorian Hahn // CXX98-NOT:     br {{.*}}, !llvm.loop
3366c312954SFlorian Hahn // CXX11-NEXT:    br i1 true, label %do.body1, label %do.end3, !llvm.loop [[LOOP18:!.*]]
3376c312954SFlorian Hahn // FINITE-NEXT:   br i1 true, label %do.body1, label %do.end3, !llvm.loop [[LOOP18:!.*]]
338fb4d8fe8SFlorian Hahn // CHECK:       do.end3:
339fb4d8fe8SFlorian Hahn // CHECK-NEXT:    ret void
340fb4d8fe8SFlorian Hahn //
D2()341fb4d8fe8SFlorian Hahn void D2() {
342fb4d8fe8SFlorian Hahn   do
343fb4d8fe8SFlorian Hahn     ;
344fb4d8fe8SFlorian Hahn   while (a == b);
345fb4d8fe8SFlorian Hahn   do
346fb4d8fe8SFlorian Hahn     ;
347fb4d8fe8SFlorian Hahn   while (1);
348fb4d8fe8SFlorian Hahn }
349fb4d8fe8SFlorian Hahn 
350fb4d8fe8SFlorian Hahn // CXX11: [[LOOP1]] = distinct !{[[LOOP1]], [[MP:!.*]]}
351fb4d8fe8SFlorian Hahn // CXX11: [[MP]] = !{!"llvm.loop.mustprogress"}
352fb4d8fe8SFlorian Hahn // CXX11: [[LOOP2]] = distinct !{[[LOOP2]], [[MP]]}
353fb4d8fe8SFlorian Hahn // CXX11: [[LOOP3]] = distinct !{[[LOOP3]], [[MP]]}
354fb4d8fe8SFlorian Hahn // CXX11: [[LOOP4]] = distinct !{[[LOOP4]], [[MP]]}
355fb4d8fe8SFlorian Hahn // CXX11: [[LOOP5]] = distinct !{[[LOOP5]], [[MP]]}
356fb4d8fe8SFlorian Hahn // CXX11: [[LOOP6]] = distinct !{[[LOOP6]], [[MP]]}
357fb4d8fe8SFlorian Hahn // CXX11: [[LOOP7]] = distinct !{[[LOOP7]], [[MP]]}
35851bf4c0eSFlorian Hahn // CXX11: [[LOOP8]] = distinct !{[[LOOP8]], [[MP]]}
3596c312954SFlorian Hahn // CXX11: [[LOOP9]] = distinct !{[[LOOP9]], [[MP]]}
3606c312954SFlorian Hahn // CXX11: [[LOOP10]] = distinct !{[[LOOP10]], [[MP]]}
3616c312954SFlorian Hahn // CXX11: [[LOOP11]] = distinct !{[[LOOP11]], [[MP]]}
3626c312954SFlorian Hahn // CXX11: [[LOOP12]] = distinct !{[[LOOP12]], [[MP]]}
3636c312954SFlorian Hahn // CXX11: [[LOOP13]] = distinct !{[[LOOP13]], [[MP]]}
3646c312954SFlorian Hahn // CXX11: [[LOOP14]] = distinct !{[[LOOP14]], [[MP]]}
3656c312954SFlorian Hahn // CXX11: [[LOOP15]] = distinct !{[[LOOP15]], [[MP]]}
3666c312954SFlorian Hahn // CXX11: [[LOOP16]] = distinct !{[[LOOP16]], [[MP]]}
3676c312954SFlorian Hahn // CXX11: [[LOOP17]] = distinct !{[[LOOP17]], [[MP]]}
3686c312954SFlorian Hahn // CXX11: [[LOOP18]] = distinct !{[[LOOP18]], [[MP]]}
369