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