Handle register masks in MachineCopyPropagation.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 8 Feb 2012 22:37:35 +0000 (22:37 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 8 Feb 2012 22:37:35 +0000 (22:37 +0000)
For simplicity, treat calls with register masks as basic block
boundaries.  This means we can't copy propagate callee-saved registers
across calls, but I don't think that is a big deal.

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

lib/CodeGen/MachineCopyPropagation.cpp

index ed3f3498f5fa7295bcc22a793037b2de3c7e2c56..56be93a95bc4626cca9ec25d97bbc0c4ebeb815e 100644 (file)
@@ -191,8 +191,11 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
 
     // Not a copy.
     SmallVector<unsigned, 2> Defs;
+    bool HasRegMask = false;
     for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
       MachineOperand &MO = MI->getOperand(i);
+      if (MO.isRegMask())
+        HasRegMask = true;
       if (!MO.isReg())
         continue;
       unsigned Reg = MO.getReg();
@@ -220,6 +223,20 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
       }
     }
 
+    // The instruction has a register mask operand which means that it clobbers
+    // 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.
+      MaybeDeadCopies.clear();
+      AvailCopyMap.clear();
+      CopyMap.clear();
+      SrcMap.clear();
+      continue;
+    }
+
     for (unsigned i = 0, e = Defs.size(); i != e; ++i) {
       unsigned Reg = Defs[i];