OSDN Git Service

Speed-up the SumOfUnscheduledPredsOfSuccs by introducing a new function
authorRoman Levenstein <romix.llvm@googlemail.com>
Thu, 27 Mar 2008 09:14:57 +0000 (09:14 +0000)
committerRoman Levenstein <romix.llvm@googlemail.com>
Thu, 27 Mar 2008 09:14:57 +0000 (09:14 +0000)
called LimitedSumOfUnscheduledPredsOfSuccs. It terminates the computation
after a given treshold is reached. This new function is always faster, but
brings real wins only on bigger test-cases.

The old function SumOfUnscheduledPredsOfSuccs is left in-place for now and therefore a warning about an unused static function is produced.

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

lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp

index 8d63631..caaa6a5 100644 (file)
@@ -1724,6 +1724,29 @@ static unsigned SumOfUnscheduledPredsOfSuccs(const SUnit *SU) {
   return Sum;
 }
 
+/// LimitedSumOfUnscheduledPredsOfSuccs - compute the sum of the unscheduled
+/// predecessors of the successors of the SUnit SU. Stop when the provided
+/// limit is exceeded.
+
+static unsigned LimitedSumOfUnscheduledPredsOfSuccs(const SUnit *SU, 
+                                                    unsigned Limit) {
+  unsigned Sum = 0;
+  for (SUnit::const_succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
+       I != E; ++I) {
+    SUnit *SuccSU = I->Dep;
+    for (SUnit::const_pred_iterator II = SuccSU->Preds.begin(),
+         EE = SuccSU->Preds.end(); II != EE; ++II) {
+      SUnit *PredSU = II->Dep;
+      if (!PredSU->isScheduled) {
+        ++Sum;
+        if(Sum > Limit)
+            return Sum;
+      }
+    }
+  }
+  return Sum;
+}
+
 
 // Top down
 bool td_ls_rr_sort::operator()(const SUnit *left, const SUnit *right) const {
@@ -1733,8 +1756,8 @@ bool td_ls_rr_sort::operator()(const SUnit *left, const SUnit *right) const {
   bool RIsTarget = right->Node && right->Node->isTargetOpcode();
   bool LIsFloater = LIsTarget && left->NumPreds == 0;
   bool RIsFloater = RIsTarget && right->NumPreds == 0;
-  unsigned LBonus = (SumOfUnscheduledPredsOfSuccs(left) == 1) ? 2 : 0;
-  unsigned RBonus = (SumOfUnscheduledPredsOfSuccs(right) == 1) ? 2 : 0;
+  unsigned LBonus = (LimitedSumOfUnscheduledPredsOfSuccs(left,1) == 1) ? 2 : 0;
+  unsigned RBonus = (LimitedSumOfUnscheduledPredsOfSuccs(right,1) == 1) ? 2 : 0;
 
   if (left->NumSuccs == 0 && right->NumSuccs != 0)
     return false;