mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-07 12:28:24 +00:00
add an aggregate method for reinserting scheduled nodes, add a callback for
priority impls that want to be notified when a node is scheduled git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26678 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -141,7 +141,14 @@ public:
|
|||||||
|
|
||||||
virtual bool empty() const = 0;
|
virtual bool empty() const = 0;
|
||||||
virtual void push(SUnit *U) = 0;
|
virtual void push(SUnit *U) = 0;
|
||||||
|
|
||||||
|
virtual void push_all(const std::vector<SUnit *> &Nodes) = 0;
|
||||||
virtual SUnit *pop() = 0;
|
virtual SUnit *pop() = 0;
|
||||||
|
|
||||||
|
/// ScheduledNode - As each node is scheduled, this method is invoked. This
|
||||||
|
/// allows the priority function to adjust the priority of node that have
|
||||||
|
/// already been emitted.
|
||||||
|
virtual void ScheduledNode(SUnit *Node) {}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,11 +347,10 @@ void ScheduleDAGList::ListScheduleBottomUp() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add the nodes that aren't ready back onto the available list.
|
// Add the nodes that aren't ready back onto the available list.
|
||||||
while (!NotReady.empty()) {
|
PriorityQueue->push_all(NotReady);
|
||||||
PriorityQueue->push(NotReady.back());
|
NotReady.clear();
|
||||||
NotReady.pop_back();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
PriorityQueue->ScheduledNode(CurrNode);
|
||||||
ScheduleNodeBottomUp(CurrNode);
|
ScheduleNodeBottomUp(CurrNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -421,13 +427,12 @@ void ScheduleDAGList::ListScheduleTopDown() {
|
|||||||
} while (!PriorityQueue->empty());
|
} while (!PriorityQueue->empty());
|
||||||
|
|
||||||
// Add the nodes that aren't ready back onto the available list.
|
// Add the nodes that aren't ready back onto the available list.
|
||||||
while (!NotReady.empty()) {
|
PriorityQueue->push_all(NotReady);
|
||||||
PriorityQueue->push(NotReady.back());
|
NotReady.clear();
|
||||||
NotReady.pop_back();
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we found a node to schedule, do it now.
|
// If we found a node to schedule, do it now.
|
||||||
if (FoundNode) {
|
if (FoundNode) {
|
||||||
|
PriorityQueue->ScheduledNode(FoundNode);
|
||||||
ScheduleNodeTopDown(FoundNode);
|
ScheduleNodeTopDown(FoundNode);
|
||||||
HazardRec->EmitInstruction(FoundNode->Node);
|
HazardRec->EmitInstruction(FoundNode->Node);
|
||||||
} else if (!HasNoopHazards) {
|
} else if (!HasNoopHazards) {
|
||||||
@@ -700,6 +705,11 @@ namespace {
|
|||||||
void push(SUnit *U) {
|
void push(SUnit *U) {
|
||||||
Queue.push(U);
|
Queue.push(U);
|
||||||
}
|
}
|
||||||
|
void push_all(const std::vector<SUnit *> &Nodes) {
|
||||||
|
for (unsigned i = 0, e = Nodes.size(); i != e; ++i)
|
||||||
|
Queue.push(Nodes[i]);
|
||||||
|
}
|
||||||
|
|
||||||
SUnit *pop() {
|
SUnit *pop() {
|
||||||
SUnit *V = Queue.top();
|
SUnit *V = Queue.top();
|
||||||
Queue.pop();
|
Queue.pop();
|
||||||
@@ -843,6 +853,11 @@ public:
|
|||||||
void push(SUnit *U) {
|
void push(SUnit *U) {
|
||||||
Queue.push(U);
|
Queue.push(U);
|
||||||
}
|
}
|
||||||
|
void push_all(const std::vector<SUnit *> &Nodes) {
|
||||||
|
for (unsigned i = 0, e = Nodes.size(); i != e; ++i)
|
||||||
|
Queue.push(Nodes[i]);
|
||||||
|
}
|
||||||
|
|
||||||
SUnit *pop() {
|
SUnit *pop() {
|
||||||
SUnit *V = Queue.top();
|
SUnit *V = Queue.top();
|
||||||
Queue.pop();
|
Queue.pop();
|
||||||
|
Reference in New Issue
Block a user