1 //===---- LatencyPriorityQueue.h - A latency-oriented priority queue ------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file declares the LatencyPriorityQueue class, which is a
10 // SchedulingPriorityQueue that schedules using latency information to
11 // reduce the length of the critical path through the basic block.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CODEGEN_LATENCYPRIORITYQUEUE_H
16 #define LLVM_CODEGEN_LATENCYPRIORITYQUEUE_H
18 #include "llvm/CodeGen/ScheduleDAG.h"
19 #include "llvm/Config/llvm-config.h"
22 class LatencyPriorityQueue
;
24 /// Sorting functions for the Available queue.
26 LatencyPriorityQueue
*PQ
;
27 explicit latency_sort(LatencyPriorityQueue
*pq
) : PQ(pq
) {}
29 bool operator()(const SUnit
* LHS
, const SUnit
* RHS
) const;
32 class LatencyPriorityQueue
: public SchedulingPriorityQueue
{
33 // SUnits - The SUnits for the current graph.
34 std::vector
<SUnit
> *SUnits
;
36 /// NumNodesSolelyBlocking - This vector contains, for every node in the
37 /// Queue, the number of nodes that the node is the sole unscheduled
38 /// predecessor for. This is used as a tie-breaker heuristic for better
40 std::vector
<unsigned> NumNodesSolelyBlocking
;
42 /// Queue - The queue.
43 std::vector
<SUnit
*> Queue
;
47 LatencyPriorityQueue() : Picker(this) {
50 bool isBottomUp() const override
{ return false; }
52 void initNodes(std::vector
<SUnit
> &sunits
) override
{
54 NumNodesSolelyBlocking
.resize(SUnits
->size(), 0);
57 void addNode(const SUnit
*SU
) override
{
58 NumNodesSolelyBlocking
.resize(SUnits
->size(), 0);
61 void updateNode(const SUnit
*SU
) override
{
64 void releaseState() override
{
68 unsigned getLatency(unsigned NodeNum
) const {
69 assert(NodeNum
< (*SUnits
).size());
70 return (*SUnits
)[NodeNum
].getHeight();
73 unsigned getNumSolelyBlockNodes(unsigned NodeNum
) const {
74 assert(NodeNum
< NumNodesSolelyBlocking
.size());
75 return NumNodesSolelyBlocking
[NodeNum
];
78 bool empty() const override
{ return Queue
.empty(); }
80 void push(SUnit
*U
) override
;
82 SUnit
*pop() override
;
84 void remove(SUnit
*SU
) override
;
86 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
87 LLVM_DUMP_METHOD
void dump(ScheduleDAG
*DAG
) const override
;
90 // scheduledNode - As nodes are scheduled, we look to see if there are any
91 // successor nodes that have a single unscheduled predecessor. If so, that
92 // single predecessor has a higher priority, since scheduling it will make
93 // the node available.
94 void scheduledNode(SUnit
*SU
) override
;
97 void AdjustPriorityOfUnscheduledPreds(SUnit
*SU
);
98 SUnit
*getSingleUnscheduledPred(SUnit
*SU
);