[llvm-commits] CVS: llvm/lib/CodeGen/VirtRegMap.cpp

Bill Wendling isanbard at gmail.com
Mon Aug 21 00:33:50 PDT 2006



Changes in directory llvm/lib/CodeGen:

VirtRegMap.cpp updated: 1.69 -> 1.70
---
Log message:

Added a check so that if we have two machine instructions in this form

    MOV R0, R1
    MOV R1, R0

the second machine instruction is removed. Added a regression test.


---
Diffs of the changes:  (+30 -10)

 VirtRegMap.cpp |   40 ++++++++++++++++++++++++++++++----------
 1 files changed, 30 insertions(+), 10 deletions(-)


Index: llvm/lib/CodeGen/VirtRegMap.cpp
diff -u llvm/lib/CodeGen/VirtRegMap.cpp:1.69 llvm/lib/CodeGen/VirtRegMap.cpp:1.70
--- llvm/lib/CodeGen/VirtRegMap.cpp:1.69	Fri Jul 21 16:15:20 2006
+++ llvm/lib/CodeGen/VirtRegMap.cpp	Mon Aug 21 02:33:33 2006
@@ -521,6 +521,7 @@
     // Process all of the spilled uses and all non spilled reg references.
     for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
       MachineOperand &MO = MI.getOperand(i);
+
       if (!MO.isRegister() || MO.getReg() == 0)
         continue;   // Ignore non-register operands.
       
@@ -790,16 +791,37 @@
           }
 
           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);
-              VRM.RemoveFromFoldedVirtMap(&MI);
-              goto ProcessNextInst;
+            if (TII->isMoveInstr(MI, Src, Dst)) {
+              if (Src == Dst) {
+                // Check to see if this is a noop copy.  If so, eliminate
+                // the instruction before considering the dest reg to be
+                // changed.
+                ++NumDCE;
+                DEBUG(std::cerr << "Removing now-noop copy: " << MI);
+                MBB.erase(&MI);
+                VRM.RemoveFromFoldedVirtMap(&MI);
+                goto ProcessNextInst;
+              } else if (MII != MBB.begin()) {
+                // Check to see if this is a sequence of the form:
+                //    mov R0, R1
+                //    mov R1, R0
+                // Eliminate the second move if so.
+                MachineBasicBlock::iterator PrevMII = MII; --PrevMII;
+                MachineInstr& PrevMI = *PrevMII;
+                unsigned PrevSrc, PrevDst;
+
+                if (TII->isMoveInstr(PrevMI, PrevSrc, PrevDst))
+                  if (PrevSrc == Dst && PrevDst == Src) {
+                    ++NumDCE;
+                    DEBUG(std::cerr << "Removing now-noop copy: " << MI);
+                    MBB.erase(&MI);
+                    VRM.RemoveFromFoldedVirtMap(&MI);
+                    goto ProcessNextInst;
+                  }
+              }
             }
+
             Spills.ClobberPhysReg(VirtReg);
             continue;
           }
@@ -861,8 +883,6 @@
   }
 }
 
-
-
 llvm::Spiller* llvm::createSpiller() {
   switch (SpillerOpt) {
   default: assert(0 && "Unreachable!");






More information about the llvm-commits mailing list