[AArch64] Fix clobber computation in A57LoadBalancing pass.
authorChad Rosier <mcrosier@codeaurora.org>
Mon, 24 Nov 2014 18:57:58 +0000 (18:57 +0000)
committerChad Rosier <mcrosier@codeaurora.org>
Mon, 24 Nov 2014 18:57:58 +0000 (18:57 +0000)
Extremely difficult to reproduce, so no test case included.
PR21637

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222677 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp

index 2503764a8527fa44935f8316ca42a4a73c4a298c..d4c742bb4494c2a032f3f48bf73d836fe8c5ca34 100644 (file)
@@ -481,10 +481,16 @@ int AArch64A57FPLoadBalancing::scavengeRegister(Chain *G, Color C,
     RS.forward(I);
     AvailableRegs &= RS.getRegsAvailable(TRI->getRegClass(RegClassID));
 
-    // Remove any registers clobbered by a regmask.
+    // Remove any registers clobbered by a regmask or any def register that is
+    // immediately dead.
     for (auto J : I->operands()) {
       if (J.isRegMask())
         AvailableRegs.clearBitsNotInMask(J.getRegMask());
+
+      if (J.isReg() && J.isDef() && AvailableRegs[J.getReg()]) {
+        assert(J.isDead() && "Non-dead def should have been removed by now!");
+        AvailableRegs.reset(J.getReg());
+      }
     }
   }