Bring back a burr scheduling heuristic that's still needed.
authorEvan Cheng <evan.cheng@apple.com>
Thu, 20 Dec 2007 02:22:36 +0000 (02:22 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 20 Dec 2007 02:22:36 +0000 (02:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45252 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp

index eef21cc3ced53ce2c19b5917b543aaa4c15fe532..3b2679dd20f04575f4bc54fb22fa07badb5dfd75 100644 (file)
@@ -1198,6 +1198,26 @@ static unsigned closestSucc(const SUnit *SU) {
   return MaxCycle;
 }
 
+/// calcMaxScratches - Returns an cost estimate of the worse case requirement
+/// for scratch registers. Live-in operands and live-out results don't count
+/// since they are "fixed".
+static unsigned calcMaxScratches(const SUnit *SU) {
+  unsigned Scratches = 0;
+  for (SUnit::const_pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
+       I != E; ++I) {
+    if (I->isCtrl) continue;  // ignore chain preds
+    if (I->Dep->Node->getOpcode() != ISD::CopyFromReg)
+      Scratches++;
+  }
+  for (SUnit::const_succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
+       I != E; ++I) {
+    if (I->isCtrl) continue;  // ignore chain succs
+    if (I->Dep->Node->getOpcode() != ISD::CopyToReg)
+      Scratches += 10;
+  }
+  return Scratches;
+}
+
 // Bottom up
 bool bu_ls_rr_sort::operator()(const SUnit *left, const SUnit *right) const {
   // There used to be a special tie breaker here that looked for
@@ -1240,14 +1260,23 @@ bool bu_ls_rr_sort::operator()(const SUnit *left, const SUnit *right) const {
     if (LDist < RDist)
       return true;
     else if (LDist == RDist) {
-      if (left->Height > right->Height)
+      // Intuitively, it's good to push down instructions whose results are
+      // liveout so their long live ranges won't conflict with other values
+      // which are needed inside the BB. Further prioritize liveout instructions
+      // by the number of operands which are calculated within the BB.
+      unsigned LScratch = calcMaxScratches(left);
+      unsigned RScratch = calcMaxScratches(right);
+      if (LScratch > RScratch)
         return true;
-      else if (left->Height == right->Height)
-        if (left->Depth < right->Depth)
+      else if (LScratch == RScratch)
+        if (left->Height > right->Height)
           return true;
-        else if (left->Depth == right->Depth)
-          if (left->CycleBound > right->CycleBound) 
+        else if (left->Height == right->Height)
+          if (left->Depth < right->Depth)
             return true;
+          else if (left->Depth == right->Depth)
+            if (left->CycleBound > right->CycleBound) 
+              return true;
     }
   }
   return false;