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