LLVM 22.0.0git
SystemZMachineScheduler.h
Go to the documentation of this file.
1//==- SystemZMachineScheduler.h - SystemZ Scheduler Interface ----*- C++ -*-==//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9// -------------------------- Post RA scheduling ---------------------------- //
10// SystemZPostRASchedStrategy is a scheduling strategy which is plugged into
11// the MachineScheduler. It has a sorted Available set of SUs and a pickNode()
12// implementation that looks to optimize decoder grouping and balance the
13// usage of processor resources. Scheduler states are saved for the end
14// region of each MBB, so that a successor block can learn from it.
15//===----------------------------------------------------------------------===//
16
17#ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINESCHEDULER_H
18#define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINESCHEDULER_H
19
23#include <set>
24
25namespace llvm {
26
27/// A MachineSchedStrategy implementation for SystemZ post RA scheduling.
29
30 const MachineLoopInfo *MLI;
31 const SystemZInstrInfo *TII;
32
33 // A SchedModel is needed before any DAG is built while advancing past
34 // non-scheduled instructions, so it would not always be possible to call
35 // DAG->getSchedClass(SU).
36 TargetSchedModel SchedModel;
37
38 /// A candidate during instruction evaluation.
39 struct Candidate {
40 SUnit *SU = nullptr;
41
42 /// The decoding cost.
43 int GroupingCost = 0;
44
45 /// The processor resources cost.
46 int ResourcesCost = 0;
47
48 Candidate() = default;
49 Candidate(SUnit *SU_, SystemZHazardRecognizer &HazardRec);
50
51 // Compare two candidates.
52 bool operator<(const Candidate &other);
53
54 // Check if this node is free of cost ("as good as any").
55 bool noCost() const {
56 return (GroupingCost <= 0 && !ResourcesCost);
57 }
58
59#ifndef NDEBUG
60 void dumpCosts() {
61 if (GroupingCost != 0)
62 dbgs() << " Grouping cost:" << GroupingCost;
63 if (ResourcesCost != 0)
64 dbgs() << " Resource cost:" << ResourcesCost;
65 }
66#endif
67 };
68
69 // A sorter for the Available set that makes sure that SUs are considered
70 // in the best order.
71 struct SUSorter {
72 bool operator() (SUnit *lhs, SUnit *rhs) const {
73 if (lhs->isScheduleHigh && !rhs->isScheduleHigh)
74 return true;
75 if (!lhs->isScheduleHigh && rhs->isScheduleHigh)
76 return false;
77
78 if (lhs->getHeight() > rhs->getHeight())
79 return true;
80 else if (lhs->getHeight() < rhs->getHeight())
81 return false;
82
83 return (lhs->NodeNum < rhs->NodeNum);
84 }
85 };
86 // A set of SUs with a sorter and dump method.
87 struct SUSet : std::set<SUnit*, SUSorter> {
88 #ifndef NDEBUG
89 void dump(SystemZHazardRecognizer &HazardRec) const;
90 #endif
91 };
92
93 /// The set of available SUs to schedule next.
94 SUSet Available;
95
96 /// Current MBB
98
99 /// Maintain hazard recognizers for all blocks, so that the scheduler state
100 /// can be maintained past BB boundaries when appropariate.
101 typedef std::map<MachineBasicBlock*, SystemZHazardRecognizer*> MBB2HazRec;
102 MBB2HazRec SchedStates;
103
104 /// Pointer to the HazardRecognizer that tracks the scheduler state for
105 /// the current region.
106 SystemZHazardRecognizer *HazardRec;
107
108 /// Update the scheduler state by emitting (non-scheduled) instructions
109 /// up to, but not including, NextBegin.
110 void advanceTo(MachineBasicBlock::iterator NextBegin);
111
112public:
115
116 /// Called for a region before scheduling.
119 unsigned NumRegionInstrs) override;
120
121 /// PostRA scheduling does not track pressure.
122 bool shouldTrackPressure() const override { return false; }
123
124 // Process scheduling regions top-down so that scheduler states can be
125 // transferrred over scheduling boundaries.
126 bool doMBBSchedRegionsTopDown() const override { return true; }
127
128 void initialize(ScheduleDAGMI *dag) override;
129
130 /// Tell the strategy that MBB is about to be processed.
131 void enterMBB(MachineBasicBlock *NextMBB) override;
132
133 /// Tell the strategy that current MBB is done.
134 void leaveMBB() override;
135
136 /// Pick the next node to schedule, or return NULL.
137 SUnit *pickNode(bool &IsTopNode) override;
138
139 /// ScheduleDAGMI has scheduled an instruction - tell HazardRec
140 /// about it.
141 void schedNode(SUnit *SU, bool IsTopNode) override;
142
143 /// SU has had all predecessor dependencies resolved. Put it into
144 /// Available.
145 void releaseTopNode(SUnit *SU) override;
146
147 /// Currently only scheduling top-down, so this method is empty.
148 void releaseBottomNode(SUnit *SU) override {};
149};
150
151} // end namespace llvm
152
153#endif // LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINESCHEDULER_H
MachineInstrBundleIterator< MachineInstr > iterator
MachineSchedStrategy - Interface to the scheduling algorithm used by ScheduleDAGMI.
Scheduling unit. This is a node in the scheduling DAG.
unsigned NodeNum
Entry # of node in the node vector.
unsigned getHeight() const
Returns the height of this node, which is the length of the maximum path down to any node which has n...
bool isScheduleHigh
True if preferable to schedule high.
ScheduleDAGMI is an implementation of ScheduleDAGInstrs that simply schedules machine instructions ac...
SystemZHazardRecognizer maintains the state for one MBB during scheduling.
bool shouldTrackPressure() const override
PostRA scheduling does not track pressure.
SUnit * pickNode(bool &IsTopNode) override
Pick the next node to schedule, or return NULL.
void leaveMBB() override
Tell the strategy that current MBB is done.
void releaseBottomNode(SUnit *SU) override
Currently only scheduling top-down, so this method is empty.
void initPolicy(MachineBasicBlock::iterator Begin, MachineBasicBlock::iterator End, unsigned NumRegionInstrs) override
Called for a region before scheduling.
void schedNode(SUnit *SU, bool IsTopNode) override
ScheduleDAGMI has scheduled an instruction - tell HazardRec about it.
void initialize(ScheduleDAGMI *dag) override
Initialize the strategy after building the DAG for a new region.
void enterMBB(MachineBasicBlock *NextMBB) override
Tell the strategy that MBB is about to be processed.
SystemZPostRASchedStrategy(const MachineSchedContext *C)
void releaseTopNode(SUnit *SU) override
SU has had all predecessor dependencies resolved.
Provide an instruction scheduling machine model to CodeGen passes.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:362
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
MachineSchedContext provides enough context from the MachineScheduler pass for the target to instanti...