| # RUN: llc -mtriple=aarch64--linux-gnu -run-pass=aarch64-ldst-opt %s -verify-machineinstrs -o - | FileCheck %s |
| --- |
| name: promote-load-from-store |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: %w1, %x0, %lr |
| |
| STRWui killed %w1, %x0, 0 :: (store 4) |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| %w0 = LDRHHui killed %x0, 1 :: (load 2) |
| RET %lr, implicit %w0 |
| |
| ... |
| # Don't count transient instructions towards search limits. |
| # CHECK-LABEL: name: promote-load-from-store |
| # CHECK: STRWui %w1 |
| # CHECK: UBFMWri killed %w1 |
| --- |
| name: store-pair |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: %w1, %x0, %lr |
| |
| STRWui %w1, %x0, 0 :: (store 4) |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| CFI_INSTRUCTION 0 |
| STRWui killed %w1, killed %x0, 1 :: (store 4) |
| RET %lr |
| |
| ... |
| # CHECK-LABEL: name: store-pair |
| # CHECK: STPWi |
| --- |
| name: store-pair-clearkill0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: %w1, %x0, %lr |
| |
| STRWui %w1, %x0, 0 :: (store 4) |
| %w2 = COPY %w1 |
| %x3 = COPY %x0 |
| STRWui killed %w1, killed %x0, 1 :: (store 4) |
| RET %lr |
| ... |
| # When merging a lower store with an upper one, we must clear kill flags on |
| # the lower store. |
| # CHECK-LABEL: store-pair-clearkill0 |
| # CHECK-NOT: STPWi %w1, killed %w1, %x0, 0 :: (store 4) |
| # CHECK: STPWi %w1, %w1, %x0, 0 :: (store 4) |
| # CHECK: %w2 = COPY %w1 |
| # CHECK: RET %lr |
| --- |
| name: store-pair-clearkill1 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: %x0, %lr |
| |
| %w1 = MOVi32imm 13 |
| %w2 = MOVi32imm 7 |
| STRWui %w1, %x0, 1 :: (store 4) |
| %w2 = COPY killed %w1 |
| STRWui killed %w2, %x0, 0 :: (store 4) |
| |
| %w1 = MOVi32imm 42 |
| %w2 = MOVi32imm 7 |
| STRWui %w1, %x0, 0 :: (store 4) |
| %w2 = COPY killed %w1 |
| STRWui killed %w2, killed %x0, 1 :: (store 4) |
| |
| RET %lr |
| ... |
| # When merging an upper store with a lower one, kill flags along the way need |
| # to be removed; In this case the kill flag on %w1. |
| # CHECK-LABEL: store-pair-clearkill1 |
| # CHECK: %w1 = MOVi32imm |
| # CHECK: %w2 = MOVi32imm |
| # CHECK-NOT: %w2 = COPY killed %w1 |
| # CHECK: %w2 = COPY %w1 |
| # CHECK: STPWi killed %w2, %w1, %x0, 0 |
| |
| # CHECK: %w1 = MOVi32imm |
| # CHECK: %w2 = MOVi32imm |
| # CHECK-NOT: %w2 = COPY killed %w1 |
| # CHECK: %w2 = COPY %w1 |
| # CHECK: STPWi %w1, killed %w2, killed %x0, 0 |
| --- |
| name: store-load-clearkill |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: %w1 |
| |
| STRWui %w1, %sp, 0 :: (store 4) |
| %wzr = COPY killed %w1 ; killing use of %w1 |
| %w11 = LDRWui %sp, 0 :: (load 4) |
| HINT 0, implicit %w11 ; some use of %w11 |
| ... |
| # When replaceing the load of a store-load pair with a copy the kill flags |
| # along the way need to be cleared. |
| # CHECK-LABEL: name: store-load-clearkill |
| # CHECK: STRWui %w1, %sp, 0 :: (store 4) |
| # CHECK-NOT: COPY killed %w1 |
| # CHECK: %wzr = COPY %w1 |
| # CHECK: %w11 = ORRWrs %wzr, %w1, 0 |
| # CHECK: HINT 0, implicit %w11 |
| --- |
| name: promote-load-from-store-undef |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: %x0, %x2, %lr |
| |
| STRWui undef %w1, %x0, 0 :: (store 4) |
| %w0 = LDRBBui %x0, 1 :: (load 2) |
| STRHHui undef %w3, %x2, 0 :: (store 4) |
| %w1 = LDRBBui %x2, 0 :: (load 4) |
| RET %lr, implicit %w0 |
| ... |
| # CHECK-LABEL: name: promote-load-from-store-undef |
| # CHECK: STRWui undef %w1 |
| # CHECK: UBFMWri undef %w1 |
| # CHECK: STRHHui undef %w3 |
| # CHECK: ANDWri undef %w3 |
| --- |
| name: promote-load-from-store-trivial-kills |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: %x0, %lr |
| |
| STRXui %x0, %sp, 0 :: (store 8) |
| STRXui killed %x0, %sp, 2 :: (store 8) |
| %x0 = LDRXui %sp, 0 :: (load 8) |
| BL $bar, csr_aarch64_aapcs, implicit-def %lr, implicit %sp, implicit %x0, implicit-def %sp |
| RET %lr |
| ... |
| # CHECK-LABEL: name: promote-load-from-store-trivial-kills |
| # CHECK: STRXui %x0, %sp, 0 |
| # CHECK: STRXui %x0, %sp, 2 |
| # CHECK-NOT: LDRXui |
| # CHECK-NOT: ORR |
| # CHECK: BL $bar, csr_aarch64_aapcs, implicit-def %lr, implicit %sp, implicit %x0, implicit-def %sp |