[llvm] r306318 - AArch64: remove all kill flags when extending register liveness.

Tim Northover via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 26 11:49:25 PDT 2017


Author: tnorthover
Date: Mon Jun 26 11:49:25 2017
New Revision: 306318

URL: http://llvm.org/viewvc/llvm-project?rev=306318&view=rev
Log:
AArch64: remove all kill flags when extending register liveness.

When we forward a stored value to a load and eliminate it entirely we need to
make sure the liveness of the register is maintained all the way to its use.
Previously we only cleared liveness on the store doing the forwarding, but
there could be other killing uses in between.

We already do the right thing when the load has to be converted into something
else, it was just this one path that skipped it.

Modified:
    llvm/trunk/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp
    llvm/trunk/test/CodeGen/AArch64/ldst-opt.mir

Modified: llvm/trunk/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp?rev=306318&r1=306317&r2=306318&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp (original)
+++ llvm/trunk/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp Mon Jun 26 11:49:25 2017
@@ -808,7 +808,13 @@ AArch64LoadStoreOpt::promoteLoadFromStor
     // Remove the load, if the destination register of the loads is the same
     // register for stored value.
     if (StRt == LdRt && LoadSize == 8) {
-      StoreI->clearRegisterKills(StRt, TRI);
+      for (MachineInstr &MI : make_range(StoreI->getIterator(),
+                                         LoadI->getIterator())) {
+        if (MI.killsRegister(StRt, TRI)) {
+          MI.clearRegisterKills(StRt, TRI);
+          break;
+        }
+      }
       DEBUG(dbgs() << "Remove load instruction:\n    ");
       DEBUG(LoadI->print(dbgs()));
       DEBUG(dbgs() << "\n");

Modified: llvm/trunk/test/CodeGen/AArch64/ldst-opt.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/ldst-opt.mir?rev=306318&r1=306317&r2=306318&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/ldst-opt.mir (original)
+++ llvm/trunk/test/CodeGen/AArch64/ldst-opt.mir Mon Jun 26 11:49:25 2017
@@ -162,3 +162,22 @@ body: |
 # 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




More information about the llvm-commits mailing list