[llvm-commits] [llvm] r156572 - /llvm/trunk/lib/CodeGen/MachineScheduler.cpp
Andrew Trick
atrick at apple.com
Thu May 10 14:06:12 PDT 2012
Author: atrick
Date: Thu May 10 16:06:12 2012
New Revision: 156572
URL: http://llvm.org/viewvc/llvm-project?rev=156572&view=rev
Log:
misched: Added ReadyQ container wrapper for Top and Bottom Queues.
Modified:
llvm/trunk/lib/CodeGen/MachineScheduler.cpp
Modified: llvm/trunk/lib/CodeGen/MachineScheduler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineScheduler.cpp?rev=156572&r1=156571&r2=156572&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MachineScheduler.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineScheduler.cpp Thu May 10 16:06:12 2012
@@ -629,15 +629,46 @@
//===----------------------------------------------------------------------===//
namespace {
+struct ReadyQ {
+ typedef std::vector<SUnit*>::iterator iterator;
+
+ unsigned ID;
+ std::vector<SUnit*> Queue;
+
+ ReadyQ(unsigned id): ID(id) {}
+
+ bool isInQueue(SUnit *SU) const {
+ return SU->NodeQueueId & ID;
+ }
+
+ bool empty() const { return Queue.empty(); }
+
+ iterator find(SUnit *SU) {
+ return std::find(Queue.begin(), Queue.end(), SU);
+ }
+
+ void push(SUnit *SU) {
+ Queue.push_back(SU);
+ }
+
+ void remove(iterator I) {
+ *I = Queue.back();
+ Queue.pop_back();
+ }
+};
+
/// ConvergingScheduler shrinks the unscheduled zone using heuristics to balance
/// the schedule.
class ConvergingScheduler : public MachineSchedStrategy {
ScheduleDAGMI *DAG;
- unsigned NumTopReady;
- unsigned NumBottomReady;
+ ReadyQ TopQueue;
+ ReadyQ BotQueue;
public:
+ // NodeQueueId = 0 (none), = 1 (top), = 2 (bottom), = 3 (both)
+ ConvergingScheduler(): TopQueue(1), BotQueue(2) {}
+
virtual void initialize(ScheduleDAGMI *dag) {
DAG = dag;
@@ -646,13 +677,15 @@
}
virtual SUnit *pickNode(bool &IsTopNode) {
- if (DAG->top() == DAG->bottom())
+ if (DAG->top() == DAG->bottom()) {
+ assert(TopQueue.empty() && BotQueue.empty() && "ReadyQ garbage");
return NULL;
-
+ }
// As an initial placeholder heuristic, schedule in the direction that has
// the fewest choices.
SUnit *SU;
- if (ForceTopDown || (!ForceBottomUp && NumTopReady <= NumBottomReady)) {
+ if (ForceTopDown
+ || (!ForceBottomUp && TopQueue.Queue.size() <= BotQueue.Queue.size())) {
SU = DAG->getSUnit(DAG->top());
IsTopNode = true;
}
@@ -661,21 +694,21 @@
IsTopNode = false;
}
if (SU->isTopReady()) {
- assert(NumTopReady > 0 && "bad ready count");
- --NumTopReady;
+ assert(!TopQueue.empty() && "bad ready count");
+ TopQueue.remove(TopQueue.find(SU));
}
if (SU->isBottomReady()) {
- assert(NumBottomReady > 0 && "bad ready count");
- --NumBottomReady;
+ assert(!BotQueue.empty() && "bad ready count");
+ BotQueue.remove(BotQueue.find(SU));
}
return SU;
}
virtual void releaseTopNode(SUnit *SU) {
- ++NumTopReady;
+ TopQueue.push(SU);
}
virtual void releaseBottomNode(SUnit *SU) {
- ++NumBottomReady;
+ BotQueue.push(SU);
}
};
} // namespace
More information about the llvm-commits
mailing list