1 // RUN: %clang_cc1 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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-NOT: 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 // CHECK-NOT: br {{.*}} llvm.loop 34 void f0() { 35 for (; ;) ; 36 } 37 38 // CXX98-NOT: mustprogress 39 // CXX11-NOT: mustprogress 40 // FINITE-NOT: mustprogress 41 // CHECK-LABEL: @_Z2f1v( 42 // CHECK-NEXT: entry: 43 // CHECK-NEXT: br label %for.cond 44 // CHECK: for.cond: 45 // CHECK-NEXT: br i1 true, label %for.body, label %for.end 46 // CHECK: for.body: 47 // CHECK-NOT: br {{.*}}, !llvm.loop 48 // CHECK: for.end: 49 // CHECK-NEXT: ret void 50 // 51 void f1() { 52 for (; 1;) 53 ; 54 } 55 56 // CXX98-NOT: mustprogress 57 // CXX11: mustprogress 58 // FINITE-NOT: mustprogress 59 // CHECK-LABEL: @_Z2f2v( 60 // CHECK-NEXT: entry: 61 // CHECK-NEXT: br label %for.cond 62 // CHECK: for.cond: 63 // CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4 64 // CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @b, align 4 65 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]] 66 // CHECK-NEXT: br i1 [[CMP]], label %for.body, label %for.end 67 // CHECK: for.body: 68 // CXX98-NOT: br {{.*}}, !llvm.loop 69 // CXX11: br label %for.cond, !llvm.loop [[LOOP1:!.*]] 70 // FINITE-NEXT: br label %for.cond, !llvm.loop [[LOOP1:!.*]] 71 // CHECK: for.end: 72 // CHECK-NEXT: ret void 73 // 74 void f2() { 75 for (; a == b;) 76 ; 77 } 78 79 // CXX98-NOT: mustprogress 80 // CXX11-NOT: mustprogress 81 // FINITE-NOT: mustprogress 82 // CHECK-LABEL: @_Z1Fv( 83 // CHECK-NEXT: entry: 84 // CHECK-NEXT: br label %for.cond 85 // CHECK: for.cond: 86 // CHECK-NEXT: br i1 true, label %for.body, label %for.end 87 // CHECK: for.body: 88 // CHECK-NOT: br {{.*}}, !llvm.loop 89 // CHECK: for.end: 90 // CHECK-NEXT: br label %for.cond1 91 // CHECK: for.cond1: 92 // CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4 93 // CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @b, align 4 94 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]] 95 // CHECK-NEXT: br i1 [[CMP]], label %for.body2, label %for.end3 96 // CHECK: for.body2: 97 // CXX98-NOT: br {{.*}}, !llvm.loop 98 // CXX11-NEXT: br label %for.cond1, !llvm.loop [[LOOP2:!.*]] 99 // FINITE-NEXT: br label %for.cond1, !llvm.loop [[LOOP2:!.*]] 100 // CHECK: for.end3: 101 // CHECK-NEXT: ret void 102 // 103 void F() { 104 for (; 1;) 105 ; 106 for (; a == b;) 107 ; 108 } 109 110 // CXX98-NOT: mustprogress 111 // CXX11-NOT: mustprogress 112 // FINITE-NOT: mustprogress 113 // CHECK-LABEL: @_Z2F2v( 114 // CHECK-NEXT: entry: 115 // CHECK-NEXT: br label %for.cond 116 // CHECK: for.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 %for.body, label %for.end 121 // CHECK: for.body: 122 // CXX98_NOT: br {{.*}} !llvm.loop 123 // CXX11-NEXT: br label %for.cond, !llvm.loop [[LOOP3:!.*]] 124 // FINITE-NEXT: br label %for.cond, !llvm.loop [[LOOP3:!.*]] 125 // CHECK: for.end: 126 // CHECK-NEXT: br label %for.cond1 127 // CHECK: for.cond1: 128 // CHECK-NEXT: br i1 true, label %for.body2, label %for.end3 129 // CHECK: for.body2: 130 // CHECK-NOT: br {{.*}}, !llvm.loop 131 // CHECK: for.end3: 132 // CHECK-NEXT: ret void 133 // 134 void F2() { 135 for (; a == b;) 136 ; 137 for (; 1;) 138 ; 139 } 140 141 // CXX98-NOT: mustprogress 142 // CXX11-NOT: mustprogress 143 // FINITE-NOT: mustprogress 144 // CHECK-LABEL: @_Z2w1v( 145 // CHECK-NEXT: entry: 146 // CHECK-NEXT: br label %while.body 147 // CHECK: while.body: 148 // CHECK-NOT: br {{.*}}, !llvm.loop 149 // 150 void w1() { 151 while (1) 152 ; 153 } 154 155 // CXX98-NOT: mustprogress 156 // CXX11: mustprogress 157 // FINITE-NOT: mustprogress 158 // CHECK-LABEL: @_Z2w2v( 159 // CHECK-NEXT: entry: 160 // CHECK-NEXT: br label %while.cond 161 // CHECK: while.cond: 162 // CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4 163 // CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @b, align 4 164 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]] 165 // CHECK-NEXT: br i1 [[CMP]], label %while.body, label %while.end 166 // CHECK: while.body: 167 // CXX98-NOT: br {{.*}}, !llvm.loop 168 // CXX11-NEXT: br label %while.cond, !llvm.loop [[LOOP4:!.*]] 169 // FINITE-NEXT: br label %while.cond, !llvm.loop [[LOOP4:!.*]] 170 // CHECK: while.end: 171 // CHECK-NEXT: ret void 172 // 173 void w2() { 174 while (a == b) 175 ; 176 } 177 178 // CXX98-NOT: mustprogress 179 // CXX11-NOT: mustprogress 180 // FINITE-NOT: mustprogress 181 // CHECK-LABEL: @_Z1Wv( 182 // CHECK-NEXT: entry: 183 // CHECK-NEXT: br label %while.cond 184 // CHECK: while.cond: 185 // CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4 186 // CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @b, align 4 187 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]] 188 // CHECK-NEXT: br i1 [[CMP]], label %while.body, label %while.end 189 // CHECK: while.body: 190 // CXX98-NOT: br {{.*}}, !llvm.loop 191 // CXX11-NEXT: br label %while.cond, !llvm.loop [[LOOP5:!.*]] 192 // FINITE-NEXT: br label %while.cond, !llvm.loop [[LOOP5:!.*]] 193 // CHECK: while.end: 194 // CHECK-NEXT: br label %while.body2 195 // CHECK: while.body2: 196 // CHECK-NOT: br {{.*}}, !llvm.loop 197 // 198 void W() { 199 while (a == b) 200 ; 201 while (1) 202 ; 203 } 204 205 // CXX98-NOT: mustprogress 206 // CXX11-NOT: mustprogress 207 // FINITE-NOT: mustprogress 208 // CHECK-LABEL: @_Z2W2v( 209 // CHECK-NEXT: entry: 210 // CHECK-NEXT: br label %while.body 211 // CHECK: while.body: 212 // CHECK-NOT: br {{.*}}, !llvm.loop 213 // 214 void W2() { 215 while (1) 216 ; 217 while (a == b) 218 ; 219 } 220 221 // CXX98-NOT: mustprogress 222 // CXX11-NOT: mustprogress 223 // FINITE-NOT: mustprogress 224 // CHECK-LABEL: @_Z2d1v( 225 // CHECK-NEXT: entry: 226 // CHECK-NEXT: br label %do.body 227 // CHECK: do.body: 228 // CHECK-NEXT: br label %do.cond 229 // CHECK: do.cond: 230 // CHECK-NOT: br {{.*}}, !llvm.loop 231 // CHECK: do.end: 232 // CHECK-NEXT: ret void 233 // 234 void d1() { 235 do 236 ; 237 while (1); 238 } 239 240 // CXX98-NOT: mustprogress 241 // CXX11: mustprogress 242 // FINITE-NOT: mustprogress 243 // CHECK-LABEL: @_Z2d2v( 244 // CHECK-NEXT: entry: 245 // CHECK-NEXT: br label %do.body 246 // CHECK: do.body: 247 // CHECK-NEXT: br label %do.cond 248 // CHECK: do.cond: 249 // CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4 250 // CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @b, align 4 251 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]] 252 // CXX98-NOT: br {{.*}}, !llvm.loop 253 // CXX11-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP6:!.*]] 254 // FINITE-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP6:!.*]] 255 // CHECK: do.end: 256 // CHECK-NEXT: ret void 257 // 258 void d2() { 259 do 260 ; 261 while (a == b); 262 } 263 264 // CXX98-NOT: mustprogress 265 // CXX11-NOT: mustprogress 266 // FINITE-NOT: mustprogress 267 // CHECK-LABEL: @_Z1Dv( 268 // CHECK-NEXT: entry: 269 // CHECK-NEXT: br label %do.body 270 // CHECK: do.body: 271 // CHECK-NEXT: br label %do.cond 272 // CHECK: do.cond: 273 // CHECK-NOT: br {{.*}}, !llvm.loop 274 // CHECK: do.end: 275 // CHECK-NEXT: br label %do.body1 276 // CHECK: do.body1: 277 // CHECK-NEXT: br label %do.cond2 278 // CHECK: do.cond2: 279 // CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4 280 // CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @b, align 4 281 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]] 282 // CXX98-NOT: br {{.*}}, !llvm.loop 283 // CXX11-NEXT: br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP7:!.*]] 284 // FINITE-NEXT: br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP7:!.*]] 285 // CHECK: do.end3: 286 // CHECK-NEXT: ret void 287 // 288 void D() { 289 do 290 ; 291 while (1); 292 do 293 ; 294 while (a == b); 295 } 296 297 // CXX98-NOT: mustprogress 298 // CXX11-NOT: mustprogress 299 // FINITE-NOT: mustprogress 300 // CHECK-LABEL: @_Z2D2v( 301 // CHECK-NEXT: entry: 302 // CHECK-NEXT: br label %do.body 303 // CHECK: do.body: 304 // CHECK-NEXT: br label %do.cond 305 // CHECK: do.cond: 306 // CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4 307 // CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @b, align 4 308 // CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]] 309 // CXX98-NOT: br {{.*}}, !llvm.loop 310 // CXX11-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP8:!.*]] 311 // FINITE-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP8:!.*]] 312 // CHECK: do.end: 313 // CHECK-NEXT: br label %do.body1 314 // CHECK: do.body1: 315 // CHECK-NEXT: br label %do.cond2 316 // CHECK: do.cond2: 317 // CHECK-NOT: br {{.*}}, !llvm.loop 318 // CHECK: do.end3: 319 // CHECK-NEXT: ret void 320 // 321 void D2() { 322 do 323 ; 324 while (a == b); 325 do 326 ; 327 while (1); 328 } 329 330 // CXX11: [[LOOP1]] = distinct !{[[LOOP1]], [[MP:!.*]]} 331 // CXX11: [[MP]] = !{!"llvm.loop.mustprogress"} 332 // CXX11: [[LOOP2]] = distinct !{[[LOOP2]], [[MP]]} 333 // CXX11: [[LOOP3]] = distinct !{[[LOOP3]], [[MP]]} 334 // CXX11: [[LOOP4]] = distinct !{[[LOOP4]], [[MP]]} 335 // CXX11: [[LOOP5]] = distinct !{[[LOOP5]], [[MP]]} 336 // CXX11: [[LOOP6]] = distinct !{[[LOOP6]], [[MP]]} 337 // CXX11: [[LOOP7]] = distinct !{[[LOOP7]], [[MP]]} 338 // CXX11: [[LOOP8]] = distinct !{[[LOOP8]], [[MP]]} 339