- if (All) {
- std::cerr << "# preds left : " << NumPredsLeft << "\n";
- std::cerr << "# succs left : " << NumSuccsLeft << "\n";
- std::cerr << "# chain preds left : " << NumChainPredsLeft << "\n";
- std::cerr << "# chain succs left : " << NumChainSuccsLeft << "\n";
- std::cerr << "Latency : " << Latency << "\n";
- std::cerr << "Priority : " << Priority1 << " , " << Priority2 << "\n";
-
- if (Preds.size() != 0) {
- std::cerr << "Predecessors :\n";
- for (std::set<SUnit*>::const_iterator I = Preds.begin(),
- E = Preds.end(); I != E; ++I) {
- std::cerr << " ";
- (*I)->dump(G, false);
- }
- }
- if (ChainPreds.size() != 0) {
- std::cerr << "Chained Preds :\n";
- for (std::set<SUnit*>::const_iterator I = ChainPreds.begin(),
- E = ChainPreds.end(); I != E; ++I) {
- std::cerr << " ";
- (*I)->dump(G, false);
- }
- }
- if (Succs.size() != 0) {
- std::cerr << "Successors :\n";
- for (std::set<SUnit*>::const_iterator I = Succs.begin(),
- E = Succs.end(); I != E; ++I) {
- std::cerr << " ";
- (*I)->dump(G, false);
- }
- }
- if (ChainSuccs.size() != 0) {
- std::cerr << "Chained succs :\n";
- for (std::set<SUnit*>::const_iterator I = ChainSuccs.begin(),
- E = ChainSuccs.end(); I != E; ++I) {
- std::cerr << " ";
- (*I)->dump(G, false);
- }
- }
- }
-}
-
-/// Sorting functions for the Available queue.
-struct ls_rr_sort : public std::binary_function<SUnit*, SUnit*, bool> {
- bool operator()(const SUnit* left, const SUnit* right) const {
- bool LFloater = (left ->Preds.size() == 0);
- bool RFloater = (right->Preds.size() == 0);
- int LBonus = (int)left ->isDefNUseOperand;
- int RBonus = (int)right->isDefNUseOperand;
- int LPriority1 = left ->Priority1 - LBonus;
- int RPriority1 = right->Priority1 - RBonus;
- int LPriority2 = left ->Priority2 + LBonus;
- int RPriority2 = right->Priority2 + RBonus;
-
- // Favor floaters (i.e. node with no non-passive predecessors):
- // e.g. MOV32ri.
- if (!LFloater && RFloater)
- return true;
- else if (LFloater == RFloater)
- if (LPriority1 > RPriority1)
- return true;
- else if (LPriority1 == RPriority1)
- if (LPriority2 < RPriority2)
- return true;
- else if (LPriority1 == RPriority1)
- if (left->CycleBound > right->CycleBound)
- return true;
- else
- return left->Node->getNodeDepth() < right->Node->getNodeDepth();
-
- return false;
- }
-};
-
-/// ScheduleDAGList - List scheduler.
-class ScheduleDAGList : public ScheduleDAG {
+static RegisterScheduler
+ tdListDAGScheduler("list-td", " Top-down list scheduler",
+ createTDListDAGScheduler);
+
+namespace {
+//===----------------------------------------------------------------------===//
+/// ScheduleDAGList - The actual list scheduler implementation. This supports
+/// top-down scheduling.
+///
+class VISIBILITY_HIDDEN ScheduleDAGList : public ScheduleDAG {