AArch64LoadStoreOptimizer: Correctly clear kill flags

When promoting the Load of a Store-Load pair to a COPY all kill flags
between the store and the load need to be cleared.

rdar://30402435

Differential Revision: https://reviews.llvm.org/D30110

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295512 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Matthias Braun 2017-02-17 23:15:03 +00:00
parent 6bd44f2375
commit 92e3dc4c50
2 changed files with 24 additions and 8 deletions

View File

@ -866,9 +866,11 @@ AArch64LoadStoreOpt::promoteLoadFromStore(MachineBasicBlock::iterator LoadI,
.addImm(Imms);
}
}
StoreI->clearRegisterKills(StRt, TRI);
(void)BitExtMI;
// Clear kill flags between store and load.
for (MachineInstr &MI : make_range(StoreI->getIterator(),
BitExtMI->getIterator()))
MI.clearRegisterKills(StRt, TRI);
DEBUG(dbgs() << "Promoting load by replacing :\n ");
DEBUG(StoreI->print(dbgs()));

View File

@ -1,10 +1,4 @@
# RUN: llc -mtriple=aarch64--linux-gnu -run-pass=aarch64-ldst-opt %s -verify-machineinstrs -o - 2>&1 | FileCheck %s
--- |
define void @promote-load-from-store() { ret void }
define void @store-pair() { ret void }
define void @store-pair-clearkill0() { ret void }
define void @store-pair-clearkill1() { ret void }
...
---
name: promote-load-from-store
tracksRegLiveness: true
@ -130,3 +124,23 @@ body: |
# 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