16 #define DEBUG_TYPE "scheduler"
37 if (LHSLatency < RHSLatency)
return true;
38 if (LHSLatency > RHSLatency)
return false;
44 if (LHSBlocked < RHSBlocked)
return true;
45 if (LHSBlocked > RHSBlocked)
return false;
49 return RHSNum < LHSNum;
55 SUnit *LatencyPriorityQueue::getSingleUnscheduledPred(
SUnit *SU) {
56 SUnit *OnlyAvailablePred = 0;
59 SUnit &Pred = *
I->getSUnit();
63 if (OnlyAvailablePred && OnlyAvailablePred != &Pred)
65 OnlyAvailablePred = &Pred;
69 return OnlyAvailablePred;
75 unsigned NumNodesBlocking = 0;
78 if (getSingleUnscheduledPred(
I->getSUnit()) == SU)
81 NumNodesSolelyBlocking[SU->
NodeNum] = NumNodesBlocking;
94 AdjustPriorityOfUnscheduledPreds(
I->getSUnit());
104 void LatencyPriorityQueue::AdjustPriorityOfUnscheduledPreds(
SUnit *SU) {
107 SUnit *OnlyAvailablePred = getSingleUnscheduledPred(SU);
108 if (OnlyAvailablePred == 0 || !OnlyAvailablePred->
isAvailable)
return;
112 remove(OnlyAvailablePred);
116 push(OnlyAvailablePred);
120 if (
empty())
return NULL;
121 std::vector<SUnit *>::iterator Best = Queue.begin();
122 for (std::vector<SUnit *>::iterator
I =
llvm::next(Queue.begin()),
123 E = Queue.end();
I != E; ++
I)
124 if (Picker(*Best, *
I))
127 if (Best !=
prior(Queue.end()))
134 assert(!Queue.empty() &&
"Queue is empty!");
135 std::vector<SUnit *>::iterator
I = std::find(Queue.begin(), Queue.end(), SU);
136 if (I !=
prior(Queue.end()))
virtual void push(SUnit *U)
SmallVector< SDep, 4 > Preds
unsigned getHeight() const
virtual void dump(ScheduleDAG *DAG) const
virtual void remove(SUnit *SU)
ItTy next(ItTy it, Dist n)
bool operator()(const SUnit *left, const SUnit *right) const
unsigned getLatency(unsigned NodeNum) const
LatencyPriorityQueue * PQ
void scheduledNode(SUnit *Node)
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
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
ItTy prior(ItTy it, Dist n)
void dump(const ScheduleDAG *G) const
SUnit - Scheduling unit. This is a node in the scheduling DAG.