1 ; REQUIRES: asserts 2 ; The regression tests need to test for order of emitted instructions, and 3 ; therefore, the tests are a bit fragile/reliant on instruction scheduling. The 4 ; test cases have been minimized as much as possible, but still most of the test 5 ; cases could break if instruction scheduling heuristics for cortex-a53 change 6 ; RUN: llc < %s -mcpu=cortex-a53 -aarch64-fix-cortex-a53-835769=1 -stats 2>&1 \ 7 ; RUN: | FileCheck %s --check-prefix CHECK 8 ; RUN: llc < %s -mcpu=cortex-a53 -aarch64-fix-cortex-a53-835769=0 -stats 2>&1 \ 9 ; RUN: | FileCheck %s --check-prefix CHECK-NOWORKAROUND 10 ; The following run lines are just to verify whether or not this pass runs by 11 ; default for given CPUs. Given the fragility of the tests, this is only run on 12 ; a test case where the scheduler has not freedom at all to reschedule the 13 ; instructions, so the potentially massively different scheduling heuristics 14 ; will not break the test case. 15 ; RUN: llc < %s -mcpu=generic | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED 16 ; RUN: llc < %s -mcpu=cortex-a53 | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED 17 ; RUN: llc < %s -mcpu=cortex-a57 | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED 18 ; RUN: llc < %s -mcpu=cyclone | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED 19 20 target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128" 21 target triple = "aarch64--linux-gnu" 22 23 define i64 @f_load_madd_64(i64 %a, i64 %b, i64* nocapture readonly %c) #0 { 24 entry: 25 %0 = load i64, i64* %c, align 8 26 %mul = mul nsw i64 %0, %b 27 %add = add nsw i64 %mul, %a 28 ret i64 %add 29 } 30 ; CHECK-LABEL: f_load_madd_64: 31 ; CHECK: ldr 32 ; CHECK-NEXT: nop 33 ; CHECK-NEXT: madd 34 ; CHECK-NOWORKAROUND-LABEL: f_load_madd_64: 35 ; CHECK-NOWORKAROUND: ldr 36 ; CHECK-NOWORKAROUND-NEXT: madd 37 ; CHECK-BASIC-PASS-DISABLED-LABEL: f_load_madd_64: 38 ; CHECK-BASIC-PASS-DISABLED: ldr 39 ; CHECK-BASIC-PASS-DISABLED-NEXT: madd 40 41 42 define i32 @f_load_madd_32(i32 %a, i32 %b, i32* nocapture readonly %c) #0 { 43 entry: 44 %0 = load i32, i32* %c, align 4 45 %mul = mul nsw i32 %0, %b 46 %add = add nsw i32 %mul, %a 47 ret i32 %add 48 } 49 ; CHECK-LABEL: f_load_madd_32: 50 ; CHECK: ldr 51 ; CHECK-NEXT: madd 52 ; CHECK-NOWORKAROUND-LABEL: f_load_madd_32: 53 ; CHECK-NOWORKAROUND: ldr 54 ; CHECK-NOWORKAROUND-NEXT: madd 55 56 57 define i64 @f_load_msub_64(i64 %a, i64 %b, i64* nocapture readonly %c) #0 { 58 entry: 59 %0 = load i64, i64* %c, align 8 60 %mul = mul nsw i64 %0, %b 61 %sub = sub nsw i64 %a, %mul 62 ret i64 %sub 63 } 64 ; CHECK-LABEL: f_load_msub_64: 65 ; CHECK: ldr 66 ; CHECK-NEXT: nop 67 ; CHECK-NEXT: msub 68 ; CHECK-NOWORKAROUND-LABEL: f_load_msub_64: 69 ; CHECK-NOWORKAROUND: ldr 70 ; CHECK-NOWORKAROUND-NEXT: msub 71 72 73 define i32 @f_load_msub_32(i32 %a, i32 %b, i32* nocapture readonly %c) #0 { 74 entry: 75 %0 = load i32, i32* %c, align 4 76 %mul = mul nsw i32 %0, %b 77 %sub = sub nsw i32 %a, %mul 78 ret i32 %sub 79 } 80 ; CHECK-LABEL: f_load_msub_32: 81 ; CHECK: ldr 82 ; CHECK-NEXT: msub 83 ; CHECK-NOWORKAROUND-LABEL: f_load_msub_32: 84 ; CHECK-NOWORKAROUND: ldr 85 ; CHECK-NOWORKAROUND-NEXT: msub 86 87 88 define i64 @f_load_mul_64(i64 %a, i64 %b, i64* nocapture readonly %c) #0 { 89 entry: 90 %0 = load i64, i64* %c, align 8 91 %mul = mul nsw i64 %0, %b 92 ret i64 %mul 93 } 94 ; CHECK-LABEL: f_load_mul_64: 95 ; CHECK: ldr 96 ; CHECK-NEXT: mul 97 ; CHECK-NOWORKAROUND-LABEL: f_load_mul_64: 98 ; CHECK-NOWORKAROUND: ldr 99 ; CHECK-NOWORKAROUND-NEXT: mul 100 101 102 define i32 @f_load_mul_32(i32 %a, i32 %b, i32* nocapture readonly %c) #0 { 103 entry: 104 %0 = load i32, i32* %c, align 4 105 %mul = mul nsw i32 %0, %b 106 ret i32 %mul 107 } 108 ; CHECK-LABEL: f_load_mul_32: 109 ; CHECK: ldr 110 ; CHECK-NEXT: mul 111 ; CHECK-NOWORKAROUND-LABEL: f_load_mul_32: 112 ; CHECK-NOWORKAROUND: ldr 113 ; CHECK-NOWORKAROUND-NEXT: mul 114 115 116 define i64 @f_load_mneg_64(i64 %a, i64 %b, i64* nocapture readonly %c) #0 { 117 entry: 118 %0 = load i64, i64* %c, align 8 119 %mul = sub i64 0, %b 120 %sub = mul i64 %0, %mul 121 ret i64 %sub 122 } 123 ; CHECK-LABEL: f_load_mneg_64: 124 ; CHECK-NOWORKAROUND-LABEL: f_load_mneg_64: 125 ; FIXME: only add further checks here once LLVM actually produces 126 ; neg instructions 127 ; FIXME-CHECK: ldr 128 ; FIXME-CHECK-NEXT: nop 129 ; FIXME-CHECK-NEXT: mneg 130 ; FIXME-CHECK-NOWORKAROUND: ldr 131 ; FIXME-CHECK-NOWORKAROUND-NEXT: mneg 132 133 134 define i32 @f_load_mneg_32(i32 %a, i32 %b, i32* nocapture readonly %c) #0 { 135 entry: 136 %0 = load i32, i32* %c, align 4 137 %mul = sub i32 0, %b 138 %sub = mul i32 %0, %mul 139 ret i32 %sub 140 } 141 ; CHECK-LABEL: f_load_mneg_32: 142 ; CHECK-NOWORKAROUND-LABEL: f_load_mneg_32: 143 ; FIXME: only add further checks here once LLVM actually produces 144 ; neg instructions 145 ; FIXME-CHECK: ldr 146 ; FIXME-CHECK-NEXT: mneg 147 ; FIXME-CHECK-NOWORKAROUND: ldr 148 ; FIXME-CHECK-NOWORKAROUND-NEXT: mneg 149 150 151 define i64 @f_load_smaddl(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 { 152 entry: 153 %conv = sext i32 %b to i64 154 %conv1 = sext i32 %c to i64 155 %mul = mul nsw i64 %conv1, %conv 156 %add = add nsw i64 %mul, %a 157 %0 = load i32, i32* %d, align 4 158 %conv2 = sext i32 %0 to i64 159 %add3 = add nsw i64 %add, %conv2 160 ret i64 %add3 161 } 162 ; CHECK-LABEL: f_load_smaddl: 163 ; CHECK: ldrsw 164 ; CHECK-NEXT: nop 165 ; CHECK-NEXT: smaddl 166 ; CHECK-NOWORKAROUND-LABEL: f_load_smaddl: 167 ; CHECK-NOWORKAROUND: ldrsw 168 ; CHECK-NOWORKAROUND-NEXT: smaddl 169 170 171 define i64 @f_load_smsubl_64(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 { 172 entry: 173 %conv = sext i32 %b to i64 174 %conv1 = sext i32 %c to i64 175 %mul = mul nsw i64 %conv1, %conv 176 %sub = sub i64 %a, %mul 177 %0 = load i32, i32* %d, align 4 178 %conv2 = sext i32 %0 to i64 179 %add = add nsw i64 %sub, %conv2 180 ret i64 %add 181 } 182 ; CHECK-LABEL: f_load_smsubl_64: 183 ; CHECK: ldrsw 184 ; CHECK-NEXT: nop 185 ; CHECK-NEXT: smsubl 186 ; CHECK-NOWORKAROUND-LABEL: f_load_smsubl_64: 187 ; CHECK-NOWORKAROUND: ldrsw 188 ; CHECK-NOWORKAROUND-NEXT: smsubl 189 190 191 define i64 @f_load_smull(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 { 192 entry: 193 %conv = sext i32 %b to i64 194 %conv1 = sext i32 %c to i64 195 %mul = mul nsw i64 %conv1, %conv 196 %0 = load i32, i32* %d, align 4 197 %conv2 = sext i32 %0 to i64 198 %div = sdiv i64 %mul, %conv2 199 ret i64 %div 200 } 201 ; CHECK-LABEL: f_load_smull: 202 ; CHECK: ldrsw 203 ; CHECK-NEXT: smull 204 ; CHECK-NOWORKAROUND-LABEL: f_load_smull: 205 ; CHECK-NOWORKAROUND: ldrsw 206 ; CHECK-NOWORKAROUND-NEXT: smull 207 208 209 define i64 @f_load_smnegl_64(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 { 210 entry: 211 %conv = sext i32 %b to i64 212 %conv1 = sext i32 %c to i64 213 %mul = sub nsw i64 0, %conv 214 %sub = mul i64 %conv1, %mul 215 %0 = load i32, i32* %d, align 4 216 %conv2 = sext i32 %0 to i64 217 %div = sdiv i64 %sub, %conv2 218 ret i64 %div 219 } 220 ; CHECK-LABEL: f_load_smnegl_64: 221 ; CHECK-NOWORKAROUND-LABEL: f_load_smnegl_64: 222 ; FIXME: only add further checks here once LLVM actually produces 223 ; smnegl instructions 224 225 226 define i64 @f_load_umaddl(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 { 227 entry: 228 %conv = zext i32 %b to i64 229 %conv1 = zext i32 %c to i64 230 %mul = mul i64 %conv1, %conv 231 %add = add i64 %mul, %a 232 %0 = load i32, i32* %d, align 4 233 %conv2 = zext i32 %0 to i64 234 %add3 = add i64 %add, %conv2 235 ret i64 %add3 236 } 237 ; CHECK-LABEL: f_load_umaddl: 238 ; CHECK: ldr 239 ; CHECK-NEXT: nop 240 ; CHECK-NEXT: umaddl 241 ; CHECK-NOWORKAROUND-LABEL: f_load_umaddl: 242 ; CHECK-NOWORKAROUND: ldr 243 ; CHECK-NOWORKAROUND-NEXT: umaddl 244 245 246 define i64 @f_load_umsubl_64(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 { 247 entry: 248 %conv = zext i32 %b to i64 249 %conv1 = zext i32 %c to i64 250 %mul = mul i64 %conv1, %conv 251 %sub = sub i64 %a, %mul 252 %0 = load i32, i32* %d, align 4 253 %conv2 = zext i32 %0 to i64 254 %add = add i64 %sub, %conv2 255 ret i64 %add 256 } 257 ; CHECK-LABEL: f_load_umsubl_64: 258 ; CHECK: ldr 259 ; CHECK-NEXT: nop 260 ; CHECK-NEXT: umsubl 261 ; CHECK-NOWORKAROUND-LABEL: f_load_umsubl_64: 262 ; CHECK-NOWORKAROUND: ldr 263 ; CHECK-NOWORKAROUND-NEXT: umsubl 264 265 266 define i64 @f_load_umull(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 { 267 entry: 268 %conv = zext i32 %b to i64 269 %conv1 = zext i32 %c to i64 270 %mul = mul i64 %conv1, %conv 271 %0 = load i32, i32* %d, align 4 272 %conv2 = zext i32 %0 to i64 273 %div = udiv i64 %mul, %conv2 274 ret i64 %div 275 } 276 ; CHECK-LABEL: f_load_umull: 277 ; CHECK: ldr 278 ; CHECK-NEXT: umull 279 ; CHECK-NOWORKAROUND-LABEL: f_load_umull: 280 ; CHECK-NOWORKAROUND: ldr 281 ; CHECK-NOWORKAROUND-NEXT: umull 282 283 284 define i64 @f_load_umnegl_64(i64 %a, i32 %b, i32 %c, i32* nocapture readonly %d) #0 { 285 entry: 286 %conv = zext i32 %b to i64 287 %conv1 = zext i32 %c to i64 288 %mul = sub nsw i64 0, %conv 289 %sub = mul i64 %conv1, %mul 290 %0 = load i32, i32* %d, align 4 291 %conv2 = zext i32 %0 to i64 292 %div = udiv i64 %sub, %conv2 293 ret i64 %div 294 } 295 ; CHECK-LABEL: f_load_umnegl_64: 296 ; CHECK-NOWORKAROUND-LABEL: f_load_umnegl_64: 297 ; FIXME: only add further checks here once LLVM actually produces 298 ; umnegl instructions 299 300 301 define i64 @f_store_madd_64(i64 %a, i64 %b, i64* nocapture readonly %cp, i64* nocapture %e) #1 { 302 entry: 303 %0 = load i64, i64* %cp, align 8 304 store i64 %a, i64* %e, align 8 305 %mul = mul nsw i64 %0, %b 306 %add = add nsw i64 %mul, %a 307 ret i64 %add 308 } 309 ; CHECK-LABEL: f_store_madd_64: 310 ; CHECK: str 311 ; CHECK-NEXT: nop 312 ; CHECK-NEXT: madd 313 ; CHECK-NOWORKAROUND-LABEL: f_store_madd_64: 314 ; CHECK-NOWORKAROUND: str 315 ; CHECK-NOWORKAROUND-NEXT: madd 316 317 318 define i32 @f_store_madd_32(i32 %a, i32 %b, i32* nocapture readonly %cp, i32* nocapture %e) #1 { 319 entry: 320 %0 = load i32, i32* %cp, align 4 321 store i32 %a, i32* %e, align 4 322 %mul = mul nsw i32 %0, %b 323 %add = add nsw i32 %mul, %a 324 ret i32 %add 325 } 326 ; CHECK-LABEL: f_store_madd_32: 327 ; CHECK: str 328 ; CHECK-NEXT: madd 329 ; CHECK-NOWORKAROUND-LABEL: f_store_madd_32: 330 ; CHECK-NOWORKAROUND: str 331 ; CHECK-NOWORKAROUND-NEXT: madd 332 333 334 define i64 @f_store_msub_64(i64 %a, i64 %b, i64* nocapture readonly %cp, i64* nocapture %e) #1 { 335 entry: 336 %0 = load i64, i64* %cp, align 8 337 store i64 %a, i64* %e, align 8 338 %mul = mul nsw i64 %0, %b 339 %sub = sub nsw i64 %a, %mul 340 ret i64 %sub 341 } 342 ; CHECK-LABEL: f_store_msub_64: 343 ; CHECK: str 344 ; CHECK-NEXT: nop 345 ; CHECK-NEXT: msub 346 ; CHECK-NOWORKAROUND-LABEL: f_store_msub_64: 347 ; CHECK-NOWORKAROUND: str 348 ; CHECK-NOWORKAROUND-NEXT: msub 349 350 351 define i32 @f_store_msub_32(i32 %a, i32 %b, i32* nocapture readonly %cp, i32* nocapture %e) #1 { 352 entry: 353 %0 = load i32, i32* %cp, align 4 354 store i32 %a, i32* %e, align 4 355 %mul = mul nsw i32 %0, %b 356 %sub = sub nsw i32 %a, %mul 357 ret i32 %sub 358 } 359 ; CHECK-LABEL: f_store_msub_32: 360 ; CHECK: str 361 ; CHECK-NEXT: msub 362 ; CHECK-NOWORKAROUND-LABEL: f_store_msub_32: 363 ; CHECK-NOWORKAROUND: str 364 ; CHECK-NOWORKAROUND-NEXT: msub 365 366 367 define i64 @f_store_mul_64(i64 %a, i64 %b, i64* nocapture readonly %cp, i64* nocapture %e) #1 { 368 entry: 369 %0 = load i64, i64* %cp, align 8 370 store i64 %a, i64* %e, align 8 371 %mul = mul nsw i64 %0, %b 372 ret i64 %mul 373 } 374 ; CHECK-LABEL: f_store_mul_64: 375 ; CHECK: str 376 ; CHECK-NEXT: mul 377 ; CHECK-NOWORKAROUND-LABEL: f_store_mul_64: 378 ; CHECK-NOWORKAROUND: str 379 ; CHECK-NOWORKAROUND-NEXT: mul 380 381 382 define i32 @f_store_mul_32(i32 %a, i32 %b, i32* nocapture readonly %cp, i32* nocapture %e) #1 { 383 entry: 384 %0 = load i32, i32* %cp, align 4 385 store i32 %a, i32* %e, align 4 386 %mul = mul nsw i32 %0, %b 387 ret i32 %mul 388 } 389 ; CHECK-LABEL: f_store_mul_32: 390 ; CHECK: str 391 ; CHECK-NEXT: mul 392 ; CHECK-NOWORKAROUND-LABEL: f_store_mul_32: 393 ; CHECK-NOWORKAROUND: str 394 ; CHECK-NOWORKAROUND-NEXT: mul 395 396 397 define i64 @f_prefetch_madd_64(i64 %a, i64 %b, i64* nocapture readonly %cp, i64* nocapture %e) #1 { 398 entry: 399 %0 = load i64, i64* %cp, align 8 400 %1 = bitcast i64* %e to i8* 401 tail call void @llvm.prefetch(i8* %1, i32 0, i32 0, i32 1) 402 %mul = mul nsw i64 %0, %b 403 %add = add nsw i64 %mul, %a 404 ret i64 %add 405 } 406 ; CHECK-LABEL: f_prefetch_madd_64: 407 ; CHECK: prfm 408 ; CHECK-NEXT: nop 409 ; CHECK-NEXT: madd 410 ; CHECK-NOWORKAROUND-LABEL: f_prefetch_madd_64: 411 ; CHECK-NOWORKAROUND: prfm 412 ; CHECK-NOWORKAROUND-NEXT: madd 413 414 declare void @llvm.prefetch(i8* nocapture, i32, i32, i32) #2 415 416 define i32 @f_prefetch_madd_32(i32 %a, i32 %b, i32* nocapture readonly %cp, i32* nocapture %e) #1 { 417 entry: 418 %0 = load i32, i32* %cp, align 4 419 %1 = bitcast i32* %e to i8* 420 tail call void @llvm.prefetch(i8* %1, i32 1, i32 0, i32 1) 421 %mul = mul nsw i32 %0, %b 422 %add = add nsw i32 %mul, %a 423 ret i32 %add 424 } 425 ; CHECK-LABEL: f_prefetch_madd_32: 426 ; CHECK: prfm 427 ; CHECK-NEXT: madd 428 ; CHECK-NOWORKAROUND-LABEL: f_prefetch_madd_32: 429 ; CHECK-NOWORKAROUND: prfm 430 ; CHECK-NOWORKAROUND-NEXT: madd 431 432 define i64 @f_prefetch_msub_64(i64 %a, i64 %b, i64* nocapture readonly %cp, i64* nocapture %e) #1 { 433 entry: 434 %0 = load i64, i64* %cp, align 8 435 %1 = bitcast i64* %e to i8* 436 tail call void @llvm.prefetch(i8* %1, i32 0, i32 1, i32 1) 437 %mul = mul nsw i64 %0, %b 438 %sub = sub nsw i64 %a, %mul 439 ret i64 %sub 440 } 441 ; CHECK-LABEL: f_prefetch_msub_64: 442 ; CHECK: prfm 443 ; CHECK-NEXT: nop 444 ; CHECK-NEXT: msub 445 ; CHECK-NOWORKAROUND-LABEL: f_prefetch_msub_64: 446 ; CHECK-NOWORKAROUND: prfm 447 ; CHECK-NOWORKAROUND-NEXT: msub 448 449 define i32 @f_prefetch_msub_32(i32 %a, i32 %b, i32* nocapture readonly %cp, i32* nocapture %e) #1 { 450 entry: 451 %0 = load i32, i32* %cp, align 4 452 %1 = bitcast i32* %e to i8* 453 tail call void @llvm.prefetch(i8* %1, i32 1, i32 1, i32 1) 454 %mul = mul nsw i32 %0, %b 455 %sub = sub nsw i32 %a, %mul 456 ret i32 %sub 457 } 458 ; CHECK-LABEL: f_prefetch_msub_32: 459 ; CHECK: prfm 460 ; CHECK-NEXT: msub 461 ; CHECK-NOWORKAROUND-LABEL: f_prefetch_msub_32: 462 ; CHECK-NOWORKAROUND: prfm 463 ; CHECK-NOWORKAROUND-NEXT: msub 464 465 define i64 @f_prefetch_mul_64(i64 %a, i64 %b, i64* nocapture readonly %cp, i64* nocapture %e) #1 { 466 entry: 467 %0 = load i64, i64* %cp, align 8 468 %1 = bitcast i64* %e to i8* 469 tail call void @llvm.prefetch(i8* %1, i32 0, i32 3, i32 1) 470 %mul = mul nsw i64 %0, %b 471 ret i64 %mul 472 } 473 ; CHECK-LABEL: f_prefetch_mul_64: 474 ; CHECK: prfm 475 ; CHECK-NEXT: mul 476 ; CHECK-NOWORKAROUND-LABEL: f_prefetch_mul_64: 477 ; CHECK-NOWORKAROUND: prfm 478 ; CHECK-NOWORKAROUND-NEXT: mul 479 480 define i32 @f_prefetch_mul_32(i32 %a, i32 %b, i32* nocapture readonly %cp, i32* nocapture %e) #1 { 481 entry: 482 %0 = load i32, i32* %cp, align 4 483 %1 = bitcast i32* %e to i8* 484 tail call void @llvm.prefetch(i8* %1, i32 1, i32 3, i32 1) 485 %mul = mul nsw i32 %0, %b 486 ret i32 %mul 487 } 488 ; CHECK-LABEL: f_prefetch_mul_32: 489 ; CHECK: prfm 490 ; CHECK-NEXT: mul 491 ; CHECK-NOWORKAROUND-LABEL: f_prefetch_mul_32: 492 ; CHECK-NOWORKAROUND: prfm 493 ; CHECK-NOWORKAROUND-NEXT: mul 494 495 define i64 @fall_through(i64 %a, i64 %b, i64* nocapture readonly %c) #0 { 496 entry: 497 %0 = load i64, i64* %c, align 8 498 br label %block1 499 500 block1: 501 %mul = mul nsw i64 %0, %b 502 %add = add nsw i64 %mul, %a 503 %tmp = ptrtoint i8* blockaddress(@fall_through, %block1) to i64 504 %ret = add nsw i64 %tmp, %add 505 ret i64 %ret 506 } 507 ; CHECK-LABEL: fall_through 508 ; CHECK: ldr 509 ; CHECK-NEXT: nop 510 ; CHECK-NEXT: .Ltmp 511 ; CHECK-NEXT: BB 512 ; CHECK-NEXT: madd 513 ; CHECK-NOWORKAROUND-LABEL: fall_through 514 ; CHECK-NOWORKAROUND: ldr 515 ; CHECK-NOWORKAROUND-NEXT: .Ltmp 516 ; CHECK-NOWORKAROUND-NEXT: BB 517 ; CHECK-NOWORKAROUND-NEXT: madd 518 519 ; No checks for this, just check it doesn't crash 520 define i32 @crash_check(i8** nocapture readnone %data) #0 { 521 entry: 522 br label %while.cond 523 524 while.cond: 525 br label %while.cond 526 } 527 528 attributes #0 = { nounwind readonly "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 529 attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 530 attributes #2 = { nounwind } 531 532 533 ; CHECK-LABEL: ... Statistics Collected ... 534 ; CHECK: 11 aarch64-fix-cortex-a53-835769 - Number of Nops added to work around erratum 835769 535