Make the same change to RegScavenger::backward.
authorEvan Cheng <evan.cheng@apple.com>
Tue, 18 Nov 2008 23:54:01 +0000 (23:54 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 18 Nov 2008 23:54:01 +0000 (23:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59566 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegisterScavenging.cpp

index e89b2a09c9936e8809de757fa94f78e3f2a09c3d..4257796500933a7983804c42f48107b2a5e5abdc 100644 (file)
@@ -282,15 +282,38 @@ void RegScavenger::backward() {
   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 @@ void RegScavenger::backward() {
 
   // 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);