| # RUN: llc -mtriple=aarch64--linux-gnu -run-pass=aarch64-copyelim %s -verify-machineinstrs -o - | FileCheck %s | |
| --- | |
| # CHECK-LABEL: name: test1 | |
| # CHECK: ANDSWri $w0, 1, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $wzr | |
| name: test1 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $w0, $x1, $x2 | |
| $w0 = ANDSWri $w0, 1, implicit-def $nzcv | |
| STRWui killed $w0, killed $x1, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x2 | |
| $w0 = COPY $wzr | |
| STRWui killed $w0, killed $x2, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test2 | |
| # CHECK: ANDSXri $x0, 1, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $xzr | |
| name: test2 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $x0, $x1, $x2 | |
| $x0 = ANDSXri $x0, 1, implicit-def $nzcv | |
| STRXui killed $x0, killed $x1, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x2 | |
| $x0 = COPY $xzr | |
| STRXui killed $x0, killed $x2, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test3 | |
| # CHECK: ADDSWri $w0, 1, 0, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $wzr | |
| name: test3 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $w0, $x1, $x2 | |
| $w0 = ADDSWri $w0, 1, 0, implicit-def $nzcv | |
| STRWui killed $w0, killed $x1, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x2 | |
| $w0 = COPY $wzr | |
| STRWui killed $w0, killed $x2, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test4 | |
| # CHECK: ADDSXri $x0, 1, 0, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $xzr | |
| name: test4 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $x0, $x1, $x2 | |
| $x0 = ADDSXri $x0, 1, 0, implicit-def $nzcv | |
| STRXui killed $x0, killed $x1, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x2 | |
| $x0 = COPY $xzr | |
| STRXui killed $x0, killed $x2, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test5 | |
| # CHECK: SUBSWri $w0, 1, 0, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $wzr | |
| name: test5 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $w0, $x1, $x2 | |
| $w0 = SUBSWri $w0, 1, 0, implicit-def $nzcv | |
| STRWui killed $w0, killed $x1, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x2 | |
| $w0 = COPY $wzr | |
| STRWui killed $w0, killed $x2, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test6 | |
| # CHECK: SUBSXri $x0, 1, 0, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $xzr | |
| name: test6 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $x0, $x1, $x2 | |
| $x0 = SUBSXri $x0, 1, 0, implicit-def $nzcv | |
| STRXui killed $x0, killed $x1, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x2 | |
| $x0 = COPY $xzr | |
| STRXui killed $x0, killed $x2, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test7 | |
| # CHECK: ADDSWrr $w0, $w1, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $wzr | |
| name: test7 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $w0, $w1, $x2, $x3 | |
| $w0 = ADDSWrr $w0, $w1, implicit-def $nzcv | |
| STRWui killed $w0, killed $x2, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x3 | |
| $w0 = COPY $wzr | |
| STRWui killed $w0, killed $x3, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test8 | |
| # CHECK: ADDSXrr $x0, $x1, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $xzr | |
| name: test8 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $x0, $x1, $x2, $x3 | |
| $x0 = ADDSXrr $x0, $x1, implicit-def $nzcv | |
| STRXui killed $x0, killed $x2, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x3 | |
| $x0 = COPY $xzr | |
| STRXui killed $x0, killed $x3, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test9 | |
| # CHECK: ANDSWrr $w0, $w1, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $wzr | |
| name: test9 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $w0, $w1, $x2, $x3 | |
| $w0 = ANDSWrr $w0, $w1, implicit-def $nzcv | |
| STRWui killed $w0, killed $x2, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x3 | |
| $w0 = COPY $wzr | |
| STRWui killed $w0, killed $x3, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test10 | |
| # CHECK: ANDSXrr $x0, $x1, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $xzr | |
| name: test10 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $x0, $x1, $x2, $x3 | |
| $x0 = ANDSXrr $x0, $x1, implicit-def $nzcv | |
| STRXui killed $x0, killed $x2, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x3 | |
| $x0 = COPY $xzr | |
| STRXui killed $x0, killed $x3, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test11 | |
| # CHECK: BICSWrr $w0, $w1, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $wzr | |
| name: test11 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $w0, $w1, $x2, $x3 | |
| $w0 = BICSWrr $w0, $w1, implicit-def $nzcv | |
| STRWui killed $w0, killed $x2, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x3 | |
| $w0 = COPY $wzr | |
| STRWui killed $w0, killed $x3, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test12 | |
| # CHECK: BICSXrr $x0, $x1, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $xzr | |
| name: test12 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $x0, $x1, $x2, $x3 | |
| $x0 = BICSXrr $x0, $x1, implicit-def $nzcv | |
| STRXui killed $x0, killed $x2, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x3 | |
| $x0 = COPY $xzr | |
| STRXui killed $x0, killed $x3, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test13 | |
| # CHECK: SUBSWrr $w0, $w1, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $wzr | |
| name: test13 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $w0, $w1, $x2, $x3 | |
| $w0 = SUBSWrr $w0, $w1, implicit-def $nzcv | |
| STRWui killed $w0, killed $x2, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x3 | |
| $w0 = COPY $wzr | |
| STRWui killed $w0, killed $x3, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test14 | |
| # CHECK: SUBSXrr $x0, $x1, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $xzr | |
| name: test14 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $x0, $x1, $x2, $x3 | |
| $x0 = SUBSXrr $x0, $x1, implicit-def $nzcv | |
| STRXui killed $x0, killed $x2, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x3 | |
| $x0 = COPY $xzr | |
| STRXui killed $x0, killed $x3, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test15 | |
| # CHECK: ADDSWrs $w0, $w1, 0, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $wzr | |
| name: test15 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $w0, $w1, $x2, $x3 | |
| $w0 = ADDSWrs $w0, $w1, 0, implicit-def $nzcv | |
| STRWui killed $w0, killed $x2, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x3 | |
| $w0 = COPY $wzr | |
| STRWui killed $w0, killed $x3, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test16 | |
| # CHECK: ADDSXrs $x0, $x1, 0, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $xzr | |
| name: test16 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $x0, $x1, $x2, $x3 | |
| $x0 = ADDSXrs $x0, $x1, 0, implicit-def $nzcv | |
| STRXui killed $x0, killed $x2, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x3 | |
| $x0 = COPY $xzr | |
| STRXui killed $x0, killed $x3, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test17 | |
| # CHECK: ANDSWrs $w0, $w1, 0, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $wzr | |
| name: test17 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $w0, $w1, $x2, $x3 | |
| $w0 = ANDSWrs $w0, $w1, 0, implicit-def $nzcv | |
| STRWui killed $w0, killed $x2, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x3 | |
| $w0 = COPY $wzr | |
| STRWui killed $w0, killed $x3, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test18 | |
| # CHECK: ANDSXrs $x0, $x1, 0, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $xzr | |
| name: test18 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $x0, $x1, $x2, $x3 | |
| $x0 = ANDSXrs $x0, $x1, 0, implicit-def $nzcv | |
| STRXui killed $x0, killed $x2, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x3 | |
| $x0 = COPY $xzr | |
| STRXui killed $x0, killed $x3, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # CHECK-LABEL: name: test19 | |
| # CHECK: BICSWrs $w0, $w1, 0, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: COPY $wzr | |
| name: test19 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $w0, $w1, $x2, $x3 | |
| $w0 = BICSWrs $w0, $w1, 0, implicit-def $nzcv | |
| STRWui killed $w0, killed $x2, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x3 | |
| $w0 = COPY $wzr | |
| STRWui killed $w0, killed $x3, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # Unicorn test - we can remove a redundant copy and a redundant mov | |
| # CHECK-LABEL: name: test20 | |
| # CHECK: SUBSWri $w1, 1, 0, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK-NOT: $w0 = COPY $wzr | |
| # CHECK-NOT: $w1 = MOVi32imm 1 | |
| name: test20 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $w1, $x2 | |
| $w0 = SUBSWri $w1, 1, 0, implicit-def $nzcv | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x2 | |
| $w0 = COPY $wzr | |
| $w1 = MOVi32imm 1 | |
| STRWui killed $w0, $x2, 0 | |
| STRWui killed $w1, killed $x2, 1 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # Negative test - MOVi32imm clobbers $w0 | |
| # CHECK-LABEL: name: test21 | |
| # CHECK: ANDSWri $w0, 1, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK: $w0 = COPY $wzr | |
| name: test21 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $w0, $x1, $x2 | |
| $w0 = ANDSWri $w0, 1, implicit-def $nzcv | |
| STRWui killed $w0, $x1, 0 | |
| $w0 = MOVi32imm -1 | |
| STRWui killed $w0, killed $x1, 1 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x2 | |
| $w0 = COPY $wzr | |
| STRWui killed $w0, killed $x2, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # Negative test - SUBSXri self-clobbers x0, so MOVi64imm can't be removed | |
| # CHECK-LABEL: name: test22 | |
| # CHECK: SUBSXri $x0, 1, 0, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK: $x0 = MOVi64imm 1 | |
| name: test22 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $x0, $x1, $x2 | |
| $x0 = SUBSXri $x0, 1, 0, implicit-def $nzcv | |
| STRXui killed $x0, killed $x1, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x2 | |
| $x0 = MOVi64imm 1 | |
| STRXui killed $x0, killed $x2, 0 | |
| bb.2: | |
| RET_ReallyLR | |
| ... | |
| # Negative test - bb.1 has multiple preds | |
| # CHECK-LABEL: name: test23 | |
| # CHECK: ADDSWri $w0, 1, 0, implicit-def $nzcv | |
| # CHECK: bb.1: | |
| # CHECK: COPY $wzr | |
| name: test23 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0.entry: | |
| liveins: $w0, $x1, $x2 | |
| $w0 = ADDSWri $w0, 1, 0, implicit-def $nzcv | |
| STRWui killed $w0, killed $x1, 0 | |
| Bcc 1, %bb.2, implicit killed $nzcv | |
| B %bb.1 | |
| bb.3: | |
| B %bb.1 | |
| bb.1: | |
| liveins: $x2 | |
| $w0 = COPY $wzr | |
| STRWui killed $w0, killed $x2, 0 | |
| bb.2: | |
| RET_ReallyLR |