Fix a bug in the local spiller, where we could take code like this:

  store r12 -> [ss#2]
  R3 = load [ss#1]
  use R3
  R3 = load [ss#2]
  R4 = load [ss#1]

and turn it into this code:

  store R12 -> [ss#2]
  R3 = load [ss#1]
  use R3
  R3 = R12
  R4 = R3    <- oops!

The problem was that promoting R3 = load[ss#2] to a copy missed the fact that
the instruction invalidated R3 at that point.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23638 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp
index 633cf2b..f7306c5 100644
--- a/lib/CodeGen/VirtRegMap.cpp
+++ b/lib/CodeGen/VirtRegMap.cpp
@@ -490,11 +490,11 @@
             if (DestReg != It->second) {
               MRI->copyRegToReg(MBB, &MI, DestReg, It->second,
                                 MF.getSSARegMap()->getRegClass(VirtReg));
-              // Revisit the copy if the destination is a vreg.
-              if (MRegisterInfo::isVirtualRegister(DestReg)) {
-                NextMII = &MI;
-                --NextMII;  // backtrack to the copy.
-              }
+              // Revisit the copy so we make sure to notice the effects of the
+              // operation on the destreg (either needing to RA it if it's 
+              // virtual or needing to clobber any values if it's physical).
+              NextMII = &MI;
+              --NextMII;  // backtrack to the copy.
             }
             MBB.erase(&MI);
             goto ProcessNextInst;