1# RUN: llc -mtriple=aarch64--linux-gnu -run-pass=aarch64-copyelim %s -verify-machineinstrs -o - | FileCheck %s 2--- 3# Check that bb.0 COPY is seen through to allow the bb.1 COPY of XZR to be removed. 4# CHECK-LABEL: name: test1 5# CHECK-NOT: COPY $xzr 6name: test1 7tracksRegLiveness: true 8body: | 9 bb.0: 10 liveins: $x0, $x1 11 12 $x0 = COPY $x1 13 CBNZX $x1, %bb.2 14 15 bb.1: 16 $x0 = COPY $xzr 17 B %bb.3 18 19 bb.2: 20 liveins: $x1 21 22 $x0 = LDRXui $x1, 0 23 24 bb.3: 25 liveins: $x0 26 27 RET_ReallyLR implicit $x0 28 29... 30# Similar to test1, but with reversed COPY. 31# CHECK-LABEL: name: test2 32# CHECK-NOT: COPY $xzr 33name: test2 34tracksRegLiveness: true 35body: | 36 bb.0: 37 liveins: $x0, $x1 38 39 $x1 = COPY $x0 40 CBNZX $x1, %bb.2 41 42 bb.1: 43 $x0 = COPY $xzr 44 B %bb.3 45 46 bb.2: 47 liveins: $x1 48 49 $x0 = LDRXui $x1, 0 50 51 bb.3: 52 liveins: $x0 53 54 RET_ReallyLR implicit $x0 55 56... 57# Similar to test1, but with a clobber that prevents removal of the XZR COPY. 58# CHECK-LABEL: name: test3 59# CHECK: COPY $xzr 60name: test3 61tracksRegLiveness: true 62body: | 63 bb.0: 64 liveins: $x0, $x1, $x2 65 66 $x0 = COPY $x1 67 $x1 = LDRXui $x1, 0 68 CBNZX $x1, %bb.2 69 70 bb.1: 71 $x0 = COPY $xzr 72 B %bb.3 73 74 bb.2: 75 liveins: $x1 76 77 $x0 = LDRXui $x1, 0 78 79 bb.3: 80 liveins: $x0 81 82 RET_ReallyLR implicit $x0 83 84... 85# Similar to test2, but with a clobber that prevents removal of the XZR COPY. 86# CHECK-LABEL: name: test4 87# CHECK: COPY $xzr 88name: test4 89tracksRegLiveness: true 90body: | 91 bb.0: 92 liveins: $x0, $x1, $x2 93 94 $x1 = COPY $x0 95 $x1 = LDRXui $x1, 0 96 CBNZX $x1, %bb.2 97 98 bb.1: 99 $x0 = COPY $xzr 100 B %bb.3 101 102 bb.2: 103 liveins: $x1 104 105 $x0 = LDRXui $x1, 0 106 107 bb.3: 108 liveins: $x0 109 110 RET_ReallyLR implicit $x0 111 112... 113# Similar to test2, but with a clobber that prevents removal of the XZR COPY. 114# CHECK-LABEL: name: test5 115# CHECK: COPY $xzr 116name: test5 117tracksRegLiveness: true 118body: | 119 bb.0: 120 liveins: $x0, $x1, $x2 121 122 $x1 = COPY $x0 123 $x0 = LDRXui $x1, 0 124 CBNZX $x1, %bb.2 125 126 bb.1: 127 $x0 = COPY $xzr 128 B %bb.3 129 130 bb.2: 131 liveins: $x1 132 133 $x0 = LDRXui $x1, 0 134 135 bb.3: 136 liveins: $x0 137 138 RET_ReallyLR implicit $x0 139 140... 141# Similar to test1, but with two levels of COPYs. 142# CHECK-LABEL: name: test6 143# CHECK-NOT: COPY $xzr 144name: test6 145tracksRegLiveness: true 146body: | 147 bb.0: 148 liveins: $x0, $x1, $x2 149 150 $x2 = COPY $x0 151 $x1 = COPY $x2 152 CBNZX $x1, %bb.2 153 154 bb.1: 155 $x0 = COPY $xzr 156 B %bb.3 157 158 bb.2: 159 liveins: $x1 160 161 $x0 = LDRXui $x1, 0 162 163 bb.3: 164 liveins: $x0 165 166 RET_ReallyLR implicit $x0 167 168... 169# Similar to test1, but with two levels of COPYs and a clobber preventing COPY of XZR removal. 170# CHECK-LABEL: name: test7 171# CHECK: COPY $xzr 172name: test7 173tracksRegLiveness: true 174body: | 175 bb.0: 176 liveins: $x0, $x1, $x2 177 178 $x2 = COPY $x0 179 $x0 = LDRXui $x1, 0 180 $x1 = COPY $x2 181 CBNZX $x1, %bb.2 182 183 bb.1: 184 $x0 = COPY $xzr 185 B %bb.3 186 187 bb.2: 188 liveins: $x1 189 190 $x0 = LDRXui $x1, 0 191 192 bb.3: 193 liveins: $x0 194 195 RET_ReallyLR implicit $x0 196 197... 198# Check that the TargetRegs vector clobber update loop in 199# AArch64RedundantCopyElimination::optimizeCopy works correctly. 200# CHECK-LABEL: name: test8 201# CHECK: x0 = COPY $xzr 202# CHECK: x1 = COPY $xzr 203name: test8 204tracksRegLiveness: true 205body: | 206 bb.0: 207 liveins: $x0, $x1, $x2 208 209 $x1 = COPY $x0 210 CBNZX $x1, %bb.2 211 212 bb.1: 213 liveins: $x0, $x2 214 215 $x0, $x1 = LDPXi $x2, 0 216 $x0 = COPY $xzr 217 $x1 = COPY $xzr 218 B %bb.3 219 220 bb.2: 221 liveins: $x1 222 223 $x0 = LDRXui $x1, 0 224 225 bb.3: 226 liveins: $x0 227 228 RET_ReallyLR implicit $x0 229 230... 231# Check that copy isn't removed from a block with multiple predecessors. 232# CHECK-LABEL: name: test9 233# CHECK: x0 = COPY $xzr 234# CHECK-NEXT: B %bb.3 235name: test9 236tracksRegLiveness: true 237body: | 238 bb.0: 239 liveins: $x0, $x1 240 241 CBNZX $x0, %bb.2 242 243 bb.1: 244 liveins: $x0 245 246 $x0 = COPY $xzr 247 B %bb.3 248 249 bb.2: 250 liveins: $x1 251 252 $x0 = LDRXui $x1, 0 253 254 CBNZX $x1, %bb.1 255 256 bb.3: 257 liveins: $x0 258 259 RET_ReallyLR implicit $x0 260 261... 262# Eliminate redundant MOVi32imm 7 in bb.1 263# Note: 32-bit compare/32-bit move imm 264# Kill marker should be removed from compare. 265# CHECK-LABEL: name: test10 266# CHECK: SUBSWri $w0, 7, 0, implicit-def $nzcv 267# CHECK: bb.1: 268# CHECK-NOT: MOVi32imm 269name: test10 270tracksRegLiveness: true 271body: | 272 bb.0.entry: 273 liveins: $w0, $x1 274 275 dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv 276 Bcc 1, %bb.2, implicit killed $nzcv 277 B %bb.1 278 279 bb.1: 280 liveins: $x1 281 282 $w0 = MOVi32imm 7 283 STRWui killed $w0, killed $x1, 0 284 285 bb.2: 286 RET_ReallyLR 287... 288# Eliminate redundant MOVi32imm 7 in bb.1 289# Note: 64-bit compare/32-bit move imm w/implicit def 290# Kill marker should be removed from compare. 291# CHECK-LABEL: name: test11 292# CHECK: SUBSXri $x0, 7, 0, implicit-def $nzcv 293# CHECK: bb.1: 294# CHECK-NOT: MOVi32imm 295name: test11 296tracksRegLiveness: true 297body: | 298 bb.0.entry: 299 liveins: $x0, $x1 300 301 dead $xzr = SUBSXri killed $x0, 7, 0, implicit-def $nzcv 302 Bcc 1, %bb.2, implicit killed $nzcv 303 B %bb.1 304 305 bb.1: 306 liveins: $x1 307 308 $w0 = MOVi32imm 7, implicit-def $x0 309 STRXui killed $x0, killed $x1, 0 310 311 bb.2: 312 RET_ReallyLR 313... 314# Eliminate redundant MOVi32imm 7 in bb.1 315# Note: 64-bit compare/32-bit move imm 316# Kill marker should be removed from compare. 317# CHECK-LABEL: name: test12 318# CHECK: SUBSXri $x0, 7, 0, implicit-def $nzcv 319# CHECK: bb.1: 320# CHECK-NOT: MOVi32imm 321name: test12 322tracksRegLiveness: true 323body: | 324 bb.0.entry: 325 liveins: $x0, $x1 326 327 dead $xzr = SUBSXri killed $x0, 7, 0, implicit-def $nzcv 328 Bcc 1, %bb.2, implicit killed $nzcv 329 B %bb.1 330 331 bb.1: 332 liveins: $x1 333 334 $w0 = MOVi32imm 7 335 STRWui killed $w0, killed $x1, 0 336 337 bb.2: 338 RET_ReallyLR 339... 340# Don't eliminate MOVi32imm 7 in bb.1 as we don't necessarily know the upper 32-bits. 341# Note: 32-bit compare/32-bit move imm w/implicit def 342# Kill marker should remain on compare. 343# CHECK-LABEL: name: test13 344# CHECK: SUBSWri killed $w0, 7, 0, implicit-def $nzcv 345# CHECK: bb.1: 346# CHECK: MOVi32imm 347name: test13 348tracksRegLiveness: true 349body: | 350 bb.0.entry: 351 liveins: $w0, $x1 352 353 dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv 354 Bcc 1, %bb.2, implicit killed $nzcv 355 B %bb.1 356 357 bb.1: 358 liveins: $x1 359 360 $w0 = MOVi32imm 7, implicit-def $x0 361 STRXui killed $x0, killed $x1, 0 362 363 bb.2: 364 RET_ReallyLR 365... 366# We can't eliminate the MOVi32imm because of the clobbering LDRWui. 367# CHECK-LABEL: name: test14 368# CHECK: bb.1: 369# CHECK: MOVi32imm 370name: test14 371tracksRegLiveness: true 372body: | 373 bb.0.entry: 374 liveins: $w0, $x1, $x2 375 376 dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv 377 $w0 = LDRWui $x1, 0 378 STRWui killed $w0, killed $x2, 0 379 Bcc 1, %bb.2, implicit killed $nzcv 380 B %bb.1 381 382 bb.1: 383 liveins: $x1 384 385 $w0 = MOVi32imm 7 386 STRWui killed $w0, killed $x1, 0 387 388 bb.2: 389 RET_ReallyLR 390... 391# We can't eliminate the MOVi32imm because of the clobbering LDRWui. 392# CHECK-LABEL: name: test15 393# CHECK: bb.1: 394# CHECK: MOVi32imm 395name: test15 396tracksRegLiveness: true 397body: | 398 bb.0.entry: 399 liveins: $w0, $x1, $x2 400 401 dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv 402 Bcc 1, %bb.2, implicit killed $nzcv 403 B %bb.1 404 405 bb.1: 406 liveins: $x1, $x2 407 408 $w0 = LDRWui $x1, 0 409 STRWui killed $w0, killed $x2, 0 410 $w0 = MOVi32imm 7 411 STRWui killed $w0, killed $x1, 0 412 413 bb.2: 414 RET_ReallyLR 415... 416# Check that bb.0 COPY is seen through to allow the bb.1 MOVi32imm to be removed. 417# CHECK-LABEL: name: test16 418# CHECK: bb.1: 419# CHECK-NOT: MOVi32imm 420name: test16 421tracksRegLiveness: true 422body: | 423 bb.0.entry: 424 liveins: $w0, $x1 425 426 dead $wzr = SUBSWri $w0, 7, 0, implicit-def $nzcv 427 $w2 = COPY $w0 428 Bcc 1, %bb.2, implicit killed $nzcv 429 B %bb.1 430 431 bb.1: 432 liveins: $x1 433 434 $w2 = MOVi32imm 7 435 STRWui killed $w2, killed $x1, 0 436 437 bb.2: 438 RET_ReallyLR 439... 440# Check that bb.1 MOVi32imm is not removed due to self clobbering compare. 441# CHECK-LABEL: name: test17 442# CHECK: bb.1: 443# CHECK: MOVi32imm 444name: test17 445tracksRegLiveness: true 446body: | 447 bb.0.entry: 448 liveins: $w0, $x1 449 450 dead $w0 = SUBSWri killed $w0, 7, 0, implicit-def $nzcv 451 Bcc 1, %bb.2, implicit killed $nzcv 452 B %bb.1 453 454 bb.1: 455 liveins: $x1 456 457 $w0 = MOVi32imm 7 458 STRWui killed $w0, killed $x1, 0 459 460 bb.2: 461 RET_ReallyLR 462... 463# Make sure the MOVi64imm is not removed. In one version of this patch the 464# MOVi64imm immediate was truncated to 32 bits and incorrectly matched because 465# the low 32 bits of 4252017623040 are all zero. 466# CHECK-LABEL: name: test18 467# CHECK: bb.1: 468# CHECK: MOVi64imm 469name: test18 470tracksRegLiveness: true 471body: | 472 bb.0.entry: 473 liveins: $x0, $x1 474 475 CBNZX killed $x0, %bb.2 476 B %bb.1 477 478 bb.1: 479 liveins: $x1 480 481 $x0 = MOVi64imm 4252017623040 482 STRXui killed $x0, killed $x1, 0 483 484 bb.2: 485 RET_ReallyLR 486... 487# Eliminate redundant MOVi32imm -1 in bb.1 488# Note: 32-bit compare/32-bit move imm 489# Kill marker should be removed from compare. 490# CHECK-LABEL: name: test19 491# CHECK: ADDSWri $w0, 1, 0, implicit-def $nzcv 492# CHECK: bb.1: 493# CHECK-NOT: MOVi32imm 494name: test19 495tracksRegLiveness: true 496body: | 497 bb.0.entry: 498 liveins: $w0, $x1 499 500 dead $wzr = ADDSWri killed $w0, 1, 0, implicit-def $nzcv 501 Bcc 1, %bb.2, implicit killed $nzcv 502 B %bb.1 503 504 bb.1: 505 liveins: $x1 506 507 $w0 = MOVi32imm -1 508 STRWui killed $w0, killed $x1, 0 509 510 bb.2: 511 RET_ReallyLR 512... 513# Eliminate redundant MOVi64imm -1 in bb.1 514# Note: 64-bit compare/64-bit move imm 515# Kill marker should be removed from compare. 516# CHECK-LABEL: name: test20 517# CHECK: ADDSXri $x0, 1, 0, implicit-def $nzcv 518# CHECK: bb.1: 519# CHECK-NOT: MOVi64imm 520name: test20 521tracksRegLiveness: true 522body: | 523 bb.0: 524 liveins: $x0, $x1 525 526 dead $xzr = ADDSXri killed $x0, 1, 0, implicit-def $nzcv 527 Bcc 1, %bb.2, implicit killed $nzcv 528 B %bb.1 529 530 bb.1: 531 liveins: $x1 532 533 $x0 = MOVi64imm -1 534 STRXui killed $x0, killed $x1, 0 535 536 bb.2: 537 RET_ReallyLR 538... 539# Don't eliminate redundant MOVi32imm -1 in bb.1: the upper bits are nonzero. 540# Note: 64-bit compare/32-bit move imm 541# Kill marker should be removed from compare. 542# CHECK-LABEL: name: test21 543# CHECK: ADDSXri killed $x0, 1, 0, implicit-def $nzcv 544# CHECK: bb.1: 545# CHECK: MOVi32imm 546name: test21 547tracksRegLiveness: true 548body: | 549 bb.0.entry: 550 liveins: $x0, $x1 551 552 dead $xzr = ADDSXri killed $x0, 1, 0, implicit-def $nzcv 553 Bcc 1, %bb.2, implicit killed $nzcv 554 B %bb.1 555 556 bb.1: 557 liveins: $x1 558 559 $w0 = MOVi32imm -1 560 STRWui killed $w0, killed $x1, 0 561 562 bb.2: 563 RET_ReallyLR 564... 565# Don't eliminate MOVi64imm -1 in bb.1 as we don't necessarily know the upper 32-bits. 566# Note: 32-bit compare/64-bit move imm 567# CHECK-LABEL: name: test22 568# CHECK: bb.1: 569# CHECK: MOVi64imm 570name: test22 571tracksRegLiveness: true 572body: | 573 bb.0.entry: 574 liveins: $w0, $x1 575 576 dead $wzr = ADDSWri killed $w0, 1, 0, implicit-def $nzcv 577 Bcc 1, %bb.2, implicit killed $nzcv 578 B %bb.1 579 580 bb.1: 581 liveins: $x1 582 583 $x0 = MOVi64imm -1 584 STRXui killed $x0, killed $x1, 0 585 586 bb.2: 587 RET_ReallyLR 588... 589# Eliminate redundant MOVi32imm 4096 in bb.1 when the compare has a shifted immediate. 590# CHECK-LABEL: name: test23 591# CHECK: bb.1: 592# CHECK-NOT: MOVi32imm 593name: test23 594tracksRegLiveness: true 595body: | 596 bb.0.entry: 597 liveins: $w0, $x1 598 599 dead $wzr = SUBSWri killed $w0, 1, 12, implicit-def $nzcv 600 Bcc 1, %bb.2, implicit killed $nzcv 601 B %bb.1 602 603 bb.1: 604 liveins: $x1 605 606 $w0 = MOVi32imm 4096 607 STRWui killed $w0, killed $x1, 0 608 609 bb.2: 610 RET_ReallyLR 611