[A57FPLoadBalancing] Modify r217689 - actually we do need to check defs
authorJames Molloy <james.molloy@arm.com>
Sun, 14 Sep 2014 18:24:26 +0000 (18:24 +0000)
committerJames Molloy <james.molloy@arm.com>
Sun, 14 Sep 2014 18:24:26 +0000 (18:24 +0000)
... Just make sure we check uses first so we see the kill first. It
turns out ignoring defs gives some pretty nasty runtime failures.
I'm certain this is the fix but I'm still reducing a testcase.

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

lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp

index d8bafc16fe160c26a0eba72d80e0e0d0dab839a6..98e4bc3e9235b3ef7789df5c4a4779602a1e7b54 100644 (file)
@@ -582,7 +582,9 @@ scanInstruction(MachineInstr *MI, unsigned Idx,
 
   if (isMul(MI)) {
 
-    for (auto &I : MI->operands())
+    for (auto &I : MI->uses())
+      maybeKillChain(I, Idx, ActiveChains);
+    for (auto &I : MI->defs())
       maybeKillChain(I, Idx, ActiveChains);
 
     // Create a new chain. Multiplies don't require forwarding so can go on any
@@ -644,7 +646,9 @@ scanInstruction(MachineInstr *MI, unsigned Idx,
 
     // Non-MUL or MLA instruction. Invalidate any chain in the uses or defs
     // lists.
-    for (auto &I : MI->operands())
+    for (auto &I : MI->uses())
+      maybeKillChain(I, Idx, ActiveChains);
+    for (auto &I : MI->defs())
       maybeKillChain(I, Idx, ActiveChains);
 
   }
@@ -657,10 +661,6 @@ maybeKillChain(MachineOperand &MO, unsigned Idx,
   // determine if a chain should be ended and remove from ActiveChains.
   MachineInstr *MI = MO.getParent();
 
-  if (MO.isReg() && MO.isDef())
-    // We don't care about defs. We see them before uses, so reject them early.
-    return;
-
   if (MO.isReg()) {
 
     // If this is a KILL of a current chain, record it.