X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FCodeGen%2FLatencyPriorityQueue.h;h=13cebeaf42f47dff5af2ee9aa672037aac3b92d2;hb=2f2b0abbac946a6e37ffa4a9775f0af5b91e723c;hp=f04d2ede5ac6f0c85e8c4fdfaf2f9bf50b8f0a99;hpb=343f0c046702831a4a6aec951b6a297a23241a55;p=oota-llvm.git diff --git a/include/llvm/CodeGen/LatencyPriorityQueue.h b/include/llvm/CodeGen/LatencyPriorityQueue.h index f04d2ede5ac..13cebeaf42f 100644 --- a/include/llvm/CodeGen/LatencyPriorityQueue.h +++ b/include/llvm/CodeGen/LatencyPriorityQueue.h @@ -17,7 +17,6 @@ #define LATENCY_PRIORITY_QUEUE_H #include "llvm/CodeGen/ScheduleDAG.h" -#include "llvm/ADT/PriorityQueue.h" namespace llvm { class LatencyPriorityQueue; @@ -34,46 +33,39 @@ namespace llvm { // SUnits - The SUnits for the current graph. std::vector *SUnits; - // Latencies - The latency (max of latency from this node to the bb exit) - // for each node. - std::vector Latencies; - /// NumNodesSolelyBlocking - This vector contains, for every node in the /// Queue, the number of nodes that the node is the sole unscheduled /// predecessor for. This is used as a tie-breaker heuristic for better /// mobility. std::vector NumNodesSolelyBlocking; + + /// Queue - The queue. + std::vector Queue; + latency_sort Picker; - PriorityQueue, latency_sort> Queue; -public: - LatencyPriorityQueue() : Queue(latency_sort(this)) { + public: + LatencyPriorityQueue() : Picker(this) { } - + void initNodes(std::vector &sunits) { SUnits = &sunits; - // Calculate node priorities. - CalculatePriorities(); + NumNodesSolelyBlocking.resize(SUnits->size(), 0); } void addNode(const SUnit *SU) { - Latencies.resize(SUnits->size(), -1); NumNodesSolelyBlocking.resize(SUnits->size(), 0); - CalcLatency(*SU); } void updateNode(const SUnit *SU) { - Latencies[SU->NodeNum] = -1; - CalcLatency(*SU); } void releaseState() { SUnits = 0; - Latencies.clear(); } unsigned getLatency(unsigned NodeNum) const { - assert(NodeNum < Latencies.size()); - return Latencies[NodeNum]; + assert(NodeNum < (*SUnits).size()); + return (*SUnits)[NodeNum].getHeight(); } unsigned getNumSolelyBlockNodes(unsigned NodeNum) const { @@ -81,31 +73,13 @@ public: return NumNodesSolelyBlocking[NodeNum]; } - unsigned size() const { return Queue.size(); } - bool empty() const { return Queue.empty(); } - virtual void push(SUnit *U) { - push_impl(U); - } - void push_impl(SUnit *U); - - void push_all(const std::vector &Nodes) { - for (unsigned i = 0, e = Nodes.size(); i != e; ++i) - push_impl(Nodes[i]); - } + virtual void push(SUnit *U); - SUnit *pop() { - if (empty()) return NULL; - SUnit *V = Queue.top(); - Queue.pop(); - return V; - } + virtual SUnit *pop(); - void remove(SUnit *SU) { - assert(!Queue.empty() && "Not in queue!"); - Queue.erase_one(SU); - } + virtual void remove(SUnit *SU); // ScheduledNode - As nodes are scheduled, we look to see if there are any // successor nodes that have a single unscheduled predecessor. If so, that @@ -114,8 +88,6 @@ public: void ScheduledNode(SUnit *Node); private: - void CalculatePriorities(); - int CalcLatency(const SUnit &SU); void AdjustPriorityOfUnscheduledPreds(SUnit *SU); SUnit *getSingleUnscheduledPred(SUnit *SU); };