| # 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 |