| # RUN: llc -mtriple=aarch64-none-linux-gnu -run-pass=postra-machine-sink -verify-machineinstrs -o - %s | FileCheck %s |
| |
| --- |
| # Sink w19 to %bb.1. |
| # CHECK-LABEL: name: sinkcopy1 |
| # CHECK-LABEL: bb.0: |
| # CHECK-NOT: $w19 = COPY killed $w0 |
| # CHECK-LABEL: bb.1: |
| # CHECK: liveins: $w1, $w0 |
| # CHECK: renamable $w19 = COPY killed $w0 |
| |
| name: sinkcopy1 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| renamable $w19 = COPY killed $w0 |
| Bcc 11, %bb.1, implicit $nzcv |
| B %bb.2 |
| |
| bb.1: |
| liveins: $w1, $w19 |
| $w0 = ADDWrr $w1, $w19 |
| RET $x0 |
| |
| bb.2: |
| $w0 = COPY $wzr |
| RET $x0 |
| ... |
| |
| --- |
| # Sink w19 to %bb.2. |
| # CHECK-LABEL: name: sinkcopy2 |
| # CHECK-LABEL: bb.0: |
| # CHECK-NOT: renamable $w19 = COPY killed $w0 |
| # CHECK-LABEL: bb.2: |
| # CHECK: liveins: $w1, $w0 |
| # CHECK: renamable $w19 = COPY killed $w0 |
| name: sinkcopy2 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| renamable $w19 = COPY killed $w0 |
| Bcc 11, %bb.2, implicit $nzcv |
| B %bb.1 |
| |
| bb.1: |
| $w0 = COPY $wzr |
| RET $x0 |
| |
| bb.2: |
| liveins: $w1, $w19 |
| $w0 = ADDWrr $w1, $w19 |
| RET $x0 |
| ... |
| |
| --- |
| # Sink w19 and w20 to %bb.1. |
| # CHECK-LABEL: name: sinkcopy3 |
| # CHECK-LABEL: bb.0: |
| # CHECK-NOT: renamable $w19 = COPY killed $w0 |
| # CHECK-LABEL: bb.1: |
| # CHECK: liveins: $w1, $w0 |
| # CHECK: renamable $w19 = COPY killed $w0 |
| # CHECK: renamable $w20 = COPY killed $w1 |
| name: sinkcopy3 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| renamable $w19 = COPY killed $w0 |
| renamable $w20 = COPY killed $w1 |
| |
| bb.1: |
| liveins: $w19, $w20 |
| $w0 = COPY $w19 |
| $w1 = COPY $w20 |
| RET $x0 |
| ... |
| |
| |
| # Sink w19 to %bb.1 and w20 to %bb.2. |
| # CHECK-LABEL: name: sinkcopy4 |
| # CHECK-LABEL: bb.0: |
| # CHECK-NOT: renamable $w19 = COPY killed $w0 |
| # CHECK-NOT: renamable $w20 = COPY killed $w1 |
| # CHECK-LABEL: bb.1: |
| # CHECK: liveins: $w1, $w0 |
| # CHECK: renamable $w19 = COPY killed $w0 |
| # CHECK-LABEL: bb.2: |
| # CHECK: liveins: $w0, $w1 |
| # CHECK: renamable $w20 = COPY killed $w1 |
| name: sinkcopy4 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| renamable $w19 = COPY killed $w0 |
| renamable $w20 = COPY killed $w1 |
| Bcc 11, %bb.2, implicit $nzcv |
| B %bb.1 |
| |
| bb.1: |
| liveins: $w1, $w19 |
| $w0 = ADDWrr $w1, $w19 |
| RET $x0 |
| |
| bb.2: |
| liveins: $w0, $w20 |
| $w0 = ADDWrr $w0, $w20 |
| RET $x0 |
| ... |
| |
| # Sink w19 to %bb.3 through %bb.2. |
| # CHECK-LABEL: name: sinkcopy5 |
| # CHECK-LABEL: bb.0: |
| # CHECK-NOT: renamable $w19 = COPY $w0 |
| # CHECK-LABEL: bb.2: |
| # CHECK: $w1 = ADDWrr $w1, $w0 |
| # CHECK-LABEL: bb.3: |
| # CHECK: liveins: $w1, $w0 |
| # CHECK: renamable $w19 = COPY killed $w0 |
| name: sinkcopy5 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| renamable $w19 = COPY $w0 |
| Bcc 11, %bb.2, implicit $nzcv |
| |
| bb.1: |
| liveins: $x0 |
| $w19 = COPY $wzr |
| RET $x0 |
| |
| bb.2: |
| liveins: $w0, $w1, $w19 |
| $w1 = ADDWrr $w1, killed $w0 |
| |
| bb.3: |
| liveins: $w1, $w19 |
| $w0 = ADDWrr $w1, $w19 |
| RET $x0 |
| ... |
| |
| # Sink w19 to %bb.3, but through %bb.2. |
| # CHECK-LABEL: name: sinkcopy6 |
| # CHECK-LABEL: bb.0: |
| # CHECK-NOT: renamable $w19 = COPY $w0 |
| # CHECK-NOT: renamable $w20 = COPY $w0 |
| # CHECK-LABEL: bb.2: |
| # CHECK: liveins: $w1, $w0 |
| # CHECK: renamable $w19 = COPY $w0 |
| # CHECK: renamable $w20 = COPY $w19 |
| name: sinkcopy6 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| renamable $w19 = COPY $w0 |
| renamable $w20 = COPY $w19 |
| Bcc 11, %bb.2, implicit $nzcv |
| |
| bb.1: |
| $w0 = COPY $wzr |
| RET $x0 |
| |
| bb.2: |
| liveins: $w1, $w20 |
| $w0 = ADDWrr killed $w1, $w20 |
| RET $x0 |
| ... |
| |
| --- |
| # Sink w19 regardless of the def of wzr in bb.0. |
| # CHECK-LABEL: name: sinkcopy7 |
| # CHECK-LABEL: bb.0: |
| # CHECK-NOT: renamable $w19 = COPY $w0 |
| # CHECK-LABEL: bb.2: |
| # CHECK: renamable $w19 = COPY $wzr |
| name: sinkcopy7 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| renamable $w19 = COPY $wzr |
| $wzr = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| Bcc 11, %bb.2, implicit $nzcv |
| B %bb.1 |
| |
| bb.1: |
| $x0 = COPY $xzr |
| RET $x0 |
| |
| bb.2: |
| liveins: $w0, $w19 |
| $w0 = ADDWrr $w0, $w19 |
| RET $x0 |
| ... |
| |
| --- |
| # Sink w19 to %bb.3 through %bb.2. |
| # CHECK-LABEL: name: sinkcopy8 |
| # CHECK-LABEL: bb.0: |
| # CHECK-NOT: renamable $w19 = COPY $w0, implicit-def $x19 |
| # CHECK-LABEL: bb.2: |
| # CHECK: $w1 = ADDWrr $w1, $w0, implicit $x0 |
| # CHECK-LABEL: bb.3: |
| # CHECK: liveins: $x1, $w0 |
| # CHECK: renamable $w19 = COPY killed $w0, implicit-def $x19 |
| name: sinkcopy8 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $w0, $x1 |
| $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| renamable $w19 = COPY $w0, implicit-def $x19 |
| Bcc 11, %bb.2, implicit $nzcv |
| |
| bb.1: |
| liveins: $x0 |
| $w19 = COPY $wzr |
| RET $x0 |
| |
| bb.2: |
| liveins: $w0, $x1, $x19 |
| $w1 = ADDWrr $w1, $w0, implicit killed $x0 |
| |
| bb.3: |
| liveins: $x1, $x19 |
| $x0 = ADDXrr $x1, $x19 |
| RET $x0 |
| ... |
| |
| --- |
| # Don't sink w19 as w0 is defined in bb.0. |
| # CHECK-LABEL: name: donotsinkcopy1 |
| # CHECK-LABEL: bb.0: |
| # CHECK: renamable $w19 = COPY $w0 |
| # CHECK: $w0 = LDRWui $sp, 0 |
| name: donotsinkcopy1 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| renamable $w19 = COPY $w0 |
| $w0 = LDRWui $sp, 0 :: (load 4) |
| Bcc 11, %bb.2, implicit $nzcv |
| B %bb.1 |
| |
| bb.1: |
| $x0 = COPY $xzr |
| RET $x0 |
| |
| bb.2: |
| liveins: $w0, $w19 |
| $w0 = ADDWrr $w0, $w19 |
| RET $x0 |
| ... |
| |
| --- |
| # Don't sink w19 as w19 is used in bb.0. |
| # CHECK-LABEL: name: donotsinkcopy2 |
| # CHECK-LABEL: bb.0: |
| # CHECK: renamable $w19 = COPY $w0 |
| # CHECK: STRWui $w1, $x19, 0 |
| name: donotsinkcopy2 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| renamable $w19 = COPY $w0 |
| STRWui $w1, $x19, 0 :: (store 4) |
| Bcc 11, %bb.2, implicit $nzcv |
| B %bb.1 |
| |
| bb.1: |
| $x0 = COPY $xzr |
| RET $x0 |
| |
| bb.2: |
| liveins: $w0, $w19 |
| $w0 = ADDWrr $w0, $w19 |
| RET $x0 |
| ... |
| |
| --- |
| # Don't sink w19 as w19 is used in both %bb.1 and %bb.2. |
| # CHECK-LABEL: name: donotsinkcopy3 |
| # CHECK-LABEL: bb.0: |
| # CHECK: renamable $w19 = COPY $w0 |
| name: donotsinkcopy3 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| renamable $w19 = COPY $w0 |
| Bcc 11, %bb.2, implicit $nzcv |
| B %bb.1 |
| |
| bb.1: |
| liveins: $w19 |
| $w0 = COPY $w19 |
| RET $x0 |
| |
| bb.2: |
| liveins: $w0, $w19 |
| $w0 = ADDWrr $w0, $w19 |
| RET $x0 |
| ... |
| |
| --- |
| # Don't sink w19 as %bb.2 has multiple predecessors. |
| # CHECK-LABEL: name: donotsinkcopy4 |
| # CHECK-LABEL: bb.0: |
| # CHECK: renamable $w19 = COPY $w0 |
| name: donotsinkcopy4 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| renamable $w19 = COPY $w0 |
| Bcc 11, %bb.2, implicit $nzcv |
| B %bb.1 |
| |
| bb.1: |
| liveins: $w0 |
| $w19 = COPY $w0 |
| B %bb.2 |
| |
| bb.2: |
| liveins: $w0, $w19 |
| $w0 = ADDWrr $w0, $w19 |
| RET $x0 |
| ... |
| |
| |
| # Don't sink w19 after sinking w20. |
| # CHECK-LABEL: name: donotsinkcopy5 |
| # CHECK-LABEL: bb.0: |
| # CHECK: renamable $w19 = COPY $w0 |
| # CHECK-LABEL: bb.2: |
| # CHECK: liveins: $w0, $w19 |
| # CHECK: renamable $w20 = COPY $w19 |
| name: donotsinkcopy5 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| renamable $w19 = COPY $w0 |
| renamable $w20 = COPY $w19 |
| Bcc 11, %bb.2, implicit $nzcv |
| |
| bb.1: |
| liveins: $w19 |
| $w0 = COPY $w19 |
| RET $x0 |
| |
| bb.2: |
| liveins: $w0, $w20 |
| $w0 = ADDWrr killed $w0, $w20 |
| RET $x0 |
| ... |
| |
| --- |
| # Don't sink w19 as x19 is live-in in %bb.2. |
| # CHECK-LABEL: name: donotsinkcopy6 |
| # CHECK-LABEL: bb.0: |
| name: donotsinkcopy6 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $x0, $w1 |
| $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv |
| renamable $x19 = COPY $x0 |
| Bcc 11, %bb.2, implicit $nzcv |
| B %bb.1 |
| |
| bb.1: |
| liveins: $w19 |
| $w0 = COPY $w19 |
| RET $x0 |
| |
| bb.2: |
| liveins: $x0, $x19 |
| $x0 = ADDXrr $x0, $x19 |
| RET $x0 |
| ... |