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