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