[llvm-commits] [llvm] r150118 - /llvm/trunk/lib/CodeGen/MachineCopyPropagation.cpp

Jakob Stoklund Olesen stoklund at 2pi.dk
Wed Feb 8 16:19:08 PST 2012


Author: stoklund
Date: Wed Feb  8 18:19:08 2012
New Revision: 150118

URL: http://llvm.org/viewvc/llvm-project?rev=150118&view=rev
Log:
Erase dead copies that are clobbered by a call.

This does make a difference, at least when using RABasic.

Modified:
    llvm/trunk/lib/CodeGen/MachineCopyPropagation.cpp

Modified: llvm/trunk/lib/CodeGen/MachineCopyPropagation.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineCopyPropagation.cpp?rev=150118&r1=150117&r2=150118&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MachineCopyPropagation.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineCopyPropagation.cpp Wed Feb  8 18:19:08 2012
@@ -191,11 +191,11 @@
 
     // Not a copy.
     SmallVector<unsigned, 2> Defs;
-    bool HasRegMask = false;
+    int RegMaskOpNum = -1;
     for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
       MachineOperand &MO = MI->getOperand(i);
       if (MO.isRegMask())
-        HasRegMask = true;
+        RegMaskOpNum = i;
       if (!MO.isReg())
         continue;
       unsigned Reg = MO.getReg();
@@ -227,9 +227,21 @@
     // a large set of registers.  It is possible to use the register mask to
     // prune the available copies, but treat it like a basic block boundary for
     // now.
-    if (HasRegMask) {
-      // FIXME: We could possibly erase some MaybeDeadCopies if their registers
-      // are clobbered by the mask.
+    if (RegMaskOpNum >= 0) {
+      // Erase any MaybeDeadCopies whose destination register is clobbered.
+      const MachineOperand &MaskMO = MI->getOperand(RegMaskOpNum);
+      for (SmallSetVector<MachineInstr*, 8>::iterator
+           DI = MaybeDeadCopies.begin(), DE = MaybeDeadCopies.end();
+           DI != DE; ++DI) {
+        unsigned Reg = (*DI)->getOperand(0).getReg();
+        if (ReservedRegs.test(Reg) || !MaskMO.clobbersPhysReg(Reg))
+          continue;
+        (*DI)->eraseFromParent();
+        Changed = true;
+        ++NumDeletes;
+      }
+
+      // Clear all data structures as if we were beginning a new basic block.
       MaybeDeadCopies.clear();
       AvailCopyMap.clear();
       CopyMap.clear();





More information about the llvm-commits mailing list