[llvm-commits] [llvm] r59566 - /llvm/trunk/lib/CodeGen/RegisterScavenging.cpp

Evan Cheng evan.cheng at apple.com
Tue Nov 18 15:54:01 PST 2008


Author: evancheng
Date: Tue Nov 18 17:54:01 2008
New Revision: 59566

URL: http://llvm.org/viewvc/llvm-project?rev=59566&view=rev
Log:
Make the same change to RegScavenger::backward.

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

Modified: llvm/trunk/lib/CodeGen/RegisterScavenging.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegisterScavenging.cpp?rev=59566&r1=59565&r2=59566&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/RegisterScavenging.cpp (original)
+++ llvm/trunk/lib/CodeGen/RegisterScavenging.cpp Tue Nov 18 17:54:01 2008
@@ -282,15 +282,38 @@
   MBBI = prior(MBBI);
 
   MachineInstr *MI = MBBI;
-  // Process defs first.
   const TargetInstrDesc &TID = MI->getDesc();
+
+  // Separate register operands into 3 classes: uses, defs, earlyclobbers.
+  SmallVector<std::pair<const MachineOperand*,unsigned>, 4> UseMOs;
+  SmallVector<std::pair<const MachineOperand*,unsigned>, 4> DefMOs;
+  SmallVector<std::pair<const MachineOperand*,unsigned>, 4> EarlyClobberMOs;
   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
     const MachineOperand &MO = MI->getOperand(i);
-    if (!MO.isReg() || !MO.isDef())
+    if (!MO.isReg() || MO.getReg() == 0)
       continue;
+    if (MO.isUse())
+      UseMOs.push_back(std::make_pair(&MO,i));
+    else if (MO.isEarlyClobber())
+      EarlyClobberMOs.push_back(std::make_pair(&MO,i));
+    else
+      DefMOs.push_back(std::make_pair(&MO,i));
+  }
+
+
+  // Process defs first.
+  unsigned NumECs = EarlyClobberMOs.size();
+  unsigned NumDefs = DefMOs.size();
+  for (unsigned i = 0, e = NumECs + NumDefs; i != e; ++i) {
+    const MachineOperand &MO = (i < NumDefs)
+      ? *DefMOs[i].first : *EarlyClobberMOs[i-NumDefs].first;
+    unsigned Idx = (i < NumECs)
+      ? DefMOs[i].second : EarlyClobberMOs[i-NumDefs].second;
+
     // Skip two-address destination operand.
-    if (TID.findTiedToSrcOperand(i) != -1)
+    if (TID.findTiedToSrcOperand(Idx) != -1)
       continue;
+
     unsigned Reg = MO.getReg();
     assert(isUsed(Reg));
     if (!isReserved(Reg))
@@ -299,13 +322,9 @@
 
   // Process uses.
   BitVector UseRegs(NumPhysRegs);
-  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
-    const MachineOperand &MO = MI->getOperand(i);
-    if (!MO.isReg() || !MO.isUse())
-      continue;
+  for (unsigned i = 0, e = UseMOs.size(); i != e; ++i) {
+    const MachineOperand MO = *UseMOs[i].first;
     unsigned Reg = MO.getReg();
-    if (Reg == 0)
-      continue;
     assert(isUnused(Reg) || isReserved(Reg));
     UseRegs.set(Reg);
 





More information about the llvm-commits mailing list