# 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