Remove move copies and dead stuff by not clobbering the result reg of a noop copy.
authorChris Lattner <sabre@nondot.org>
Fri, 3 Feb 2006 03:16:14 +0000 (03:16 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 3 Feb 2006 03:16:14 +0000 (03:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25926 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/VirtRegMap.cpp

index c64c411d3791bb40c56fc598a322f5577b1b1c6a..8b08841ee9cd20a2ecb5bc85c73470333ba70b1f 100644 (file)
@@ -607,6 +607,15 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, const VirtRegMap &VRM) {
           }
 
           if (!OpTakenCareOf) {
+            // Check to see if this is a noop copy.  If so, eliminate the
+            // instruction before considering the dest reg to be changed.
+            unsigned Src, Dst;
+            if (TII->isMoveInstr(MI, Src, Dst) && Src == Dst) {
+              ++NumDCE;
+              DEBUG(std::cerr << "Removing now-noop copy: " << MI);
+              MBB.erase(&MI);
+              goto ProcessNextInst;
+            }
             ClobberPhysReg(VirtReg, SpillSlotsAvailable, PhysRegsAvailable);
             continue;
           }
@@ -631,6 +640,18 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, const VirtRegMap &VRM) {
         DEBUG(std::cerr << "Store:\t" << *next(MII));
         MI.SetMachineOperandReg(i, PhysReg);
 
+        // Check to see if this is a noop copy.  If so, eliminate the
+        // instruction before considering the dest reg to be changed.
+        {
+          unsigned Src, Dst;
+          if (TII->isMoveInstr(MI, Src, Dst) && Src == Dst) {
+            ++NumDCE;
+            DEBUG(std::cerr << "Removing now-noop copy: " << MI);
+            MBB.erase(&MI);
+            goto ProcessNextInst;
+          }
+        }
+        
         // If there is a dead store to this stack slot, nuke it now.
         MachineInstr *&LastStore = MaybeDeadStores[StackSlot];
         if (LastStore) {
@@ -654,18 +675,6 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, const VirtRegMap &VRM) {
         ++NumStores;
       }
     }
-     
-    // Okay, the instruction has been completely processed, input and output 
-    // registers have been added.  As a final sanity check, make sure this is
-    // not a noop-copy.  If it is, nuke it.
-    {
-      unsigned Src, Dst;
-      if (TII->isMoveInstr(MI, Src, Dst) && Src == Dst) {
-        ++NumDCE;
-        DEBUG(std::cerr << "Removing now-noop copy: " << MI);
-        MBB.erase(&MI);
-      }
-    }
   ProcessNextInst:
     MII = NextMII;
   }