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