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