Changes in directory llvm/lib/CodeGen/SelectionDAG:

ScheduleDAGList.cpp updated: 1.46 -> 1.47
---
Log message:

Chain operands aren't real uses: they don't require the full latency of the
predecessor to finish before they can start.


---
Diffs of the changes:  (+10 -4)

 ScheduleDAGList.cpp |   14 ++++++++++----
 1 files changed, 10 insertions(+), 4 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp:1.46 
llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp:1.47
--- llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp:1.46      Sat Mar 11 
18:38:57 2006
+++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp   Sat Mar 11 21:52:09 2006
@@ -387,8 +387,6 @@
 }
 
 /// Schedule - Schedule the DAG using list scheduling.
-/// FIXME: Right now it only supports the burr (bottom up register reducing)
-/// heuristic.
 void ScheduleDAGList::Schedule() {
   DEBUG(std::cerr << "********** List Scheduling **********\n");
   
@@ -552,8 +550,16 @@
     unsigned AvailableCycle = 0;
     for (std::set<std::pair<SUnit*, bool> >::iterator I = 
SuccSU->Preds.begin(),
          E = SuccSU->Preds.end(); I != E; ++I) {
-      AvailableCycle = std::max(AvailableCycle, 
-                                I->first->Cycle + I->first->Latency);
+      // If this is a token edge, we don't need to wait for the full latency of
+      // the preceeding instruction (e.g. a long-latency load) unless there is
+      // also some other data dependence.
+      unsigned PredDoneCycle = I->first->Cycle;
+      if (!I->second)
+        PredDoneCycle += I->first->Latency;
+      else
+        PredDoneCycle += 1;  
+
+      AvailableCycle = std::max(AvailableCycle, PredDoneCycle);
     }
     
     PendingQueue.push_back(std::make_pair(AvailableCycle, SuccSU));



_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to