21 #define DEBUG_TYPE "scheduler"
38 if (LHSLatency < RHSLatency)
return true;
39 if (LHSLatency > RHSLatency)
return false;
45 if (LHSBlocked < RHSBlocked)
return true;
46 if (LHSBlocked > RHSBlocked)
return false;
50 return RHSNum < LHSNum;
56 SUnit *LatencyPriorityQueue::getSingleUnscheduledPred(
SUnit *SU) {
57 SUnit *OnlyAvailablePred =
nullptr;
60 SUnit &Pred = *
I->getSUnit();
64 if (OnlyAvailablePred && OnlyAvailablePred != &Pred)
66 OnlyAvailablePred = &Pred;
70 return OnlyAvailablePred;
76 unsigned NumNodesBlocking = 0;
79 if (getSingleUnscheduledPred(
I->getSUnit()) == SU)
82 NumNodesSolelyBlocking[SU->
NodeNum] = NumNodesBlocking;
95 AdjustPriorityOfUnscheduledPreds(
I->getSUnit());
105 void LatencyPriorityQueue::AdjustPriorityOfUnscheduledPreds(
SUnit *SU) {
108 SUnit *OnlyAvailablePred = getSingleUnscheduledPred(SU);
109 if (!OnlyAvailablePred || !OnlyAvailablePred->
isAvailable)
return;
113 remove(OnlyAvailablePred);
117 push(OnlyAvailablePred);
121 if (
empty())
return nullptr;
122 std::vector<SUnit *>::iterator Best = Queue.begin();
123 for (std::vector<SUnit *>::iterator
I = std::next(Queue.begin()),
124 E = Queue.end();
I != E; ++
I)
125 if (Picker(*Best, *
I))
128 if (Best != std::prev(Queue.end()))
135 assert(!Queue.empty() &&
"Queue is empty!");
136 std::vector<SUnit *>::iterator
I = std::find(Queue.begin(), Queue.end(), SU);
137 if (I != std::prev(Queue.end()))
SmallVector< SDep, 4 > Preds
void remove(SUnit *SU) override
void scheduledNode(SUnit *Node) override
scheduledNode - As each node is scheduled, this method is invoked.
bool operator()(const SUnit *left, const SUnit *right) const
unsigned getLatency(unsigned NodeNum) const
void push(SUnit *U) override
LatencyPriorityQueue * PQ
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
unsigned getNumSolelyBlockNodes(unsigned NodeNum) const
SmallVector< SDep, 4 > Succs
bool empty() const override
SUnit - Scheduling unit. This is a node in the scheduling DAG.