LLVM: lib/Target/AMDGPU/SIMachineScheduler.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef LLVM_LIB_TARGET_AMDGPU_SIMACHINESCHEDULER_H
15#define LLVM_LIB_TARGET_AMDGPU_SIMACHINESCHEDULER_H
16
20#include
21#include
22#include
23
24namespace llvm {
25
30
39
52
57
61
62 std::vector<SUnit*> SUnits;
63 std::map<unsigned, unsigned> NodeNum2Index;
64 std::vector<SUnit*> TopReadySUs;
65 std::vector<SUnit*> ScheduledSUnits;
66
67
70
71
72
73
74
75 std::vector InternalAdditionalPressure;
76
77 std::vector LiveInPressure;
78 std::vector LiveOutPressure;
79
80
81
82
83
84 std::set LiveInRegs;
85 std::set LiveOutRegs;
86
87 bool Scheduled = false;
88 bool HighLatencyBlock = false;
89
90 std::vector HasLowLatencyNonWaitedParent;
91
92
93 unsigned ID;
94
95 std::vector<SIScheduleBlock*> Preds;
96
97 std::vector<std::pair<SIScheduleBlock*, SIScheduleBlockLinkKind>> Succs;
98 unsigned NumHighLatencySuccessors = 0;
99
100public:
102 unsigned ID):
103 DAG(DAG), BC(BC), TopRPTracker(TopPressure), ID(ID) {}
104
106
107 unsigned getID() const { return ID; }
108
109
111
112
114
115
118
119 const std::vector<SIScheduleBlock*>& getPreds() const { return Preds; }
122
125
127 return NumHighLatencySuccessors;
128 }
129
131
132
133
134
135 int getCost() { return SUnits.size(); }
136
137
138
139
141
143
144
145
146
147
148
151
153
154
155
157 return InternalAdditionalPressure;
158 }
159
160 std::set &getInRegs() { return LiveInRegs; }
161 std::set &getOutRegs() { return LiveOutRegs; }
162
164
165private:
167
168 SUnit *SU = nullptr;
169
170 unsigned SGPRUsage;
171 unsigned VGPRUsage;
172 bool IsLowLatency;
173 unsigned LowLatencyOffset;
174 bool HasLowLatencyNonWaitedParent;
175
176 SISchedCandidate() = default;
177
178 bool isValid() const { return SU; }
179
180
181 void setBest(SISchedCandidate &Best) {
182 assert(Best.Reason != NoCand && "uninitialized Sched candidate");
183 SU = Best.SU;
184 Reason = Best.Reason;
185 SGPRUsage = Best.SGPRUsage;
186 VGPRUsage = Best.VGPRUsage;
187 IsLowLatency = Best.IsLowLatency;
188 LowLatencyOffset = Best.LowLatencyOffset;
189 HasLowLatencyNonWaitedParent = Best.HasLowLatencyNonWaitedParent;
190 }
191 };
192
193 void undoSchedule();
194
195 void undoReleaseSucc(SUnit *SU, SDep *SuccEdge);
196 void releaseSucc(SUnit *SU, SDep *SuccEdge);
197
198
199 void releaseSuccessors(SUnit *SU, bool InOrOutBlock);
200
201 void nodeScheduled(SUnit *SU);
202 void tryCandidateTopDown(SISchedCandidate &Cand, SISchedCandidate &TryCand);
203 void tryCandidateBottomUp(SISchedCandidate &Cand, SISchedCandidate &TryCand);
204 SUnit* pickNode();
205 void traceCandidate(const SISchedCandidate &Cand);
208};
209
211 std::vector<SIScheduleBlock*> Blocks;
214};
215
221
224
225 std::vector<std::unique_ptr> BlockPtrs;
228 std::vector<SIScheduleBlock*> CurrentBlocks;
229 std::vector Node2CurrentBlock;
230
231
232
233 std::vector TopDownIndex2Block;
234 std::vector TopDownBlock2Index;
235 std::vector BottomUpIndex2Block;
236
237
238
239
240 int NextReservedID;
241 int NextNonReservedID;
242 std::vector CurrentColoring;
243 std::vector CurrentTopDownReservedDependencyColoring;
244 std::vector CurrentBottomUpReservedDependencyColoring;
245
246public:
248
251
253
254private:
255
256 void colorHighLatenciesAlone();
257
258
259 void colorHighLatenciesGroups();
260
261
262
263 void colorComputeReservedDependencies();
264
265
266 void colorAccordingToReservedDependencies();
267
268
269
270
271 void colorEndsAccordingToDependencies();
272
273
274 void colorForceConsecutiveOrderInGroup();
275
276
277
278 void colorMergeConstantLoadsNextGroup();
279
280
281 void colorMergeIfPossibleNextGroup();
282
283
284
285 void colorMergeIfPossibleNextGroupOnlyForReserved();
286
287
288
289 void colorMergeIfPossibleSmallGroupsToNextGroup();
290
291
292
293
294 void cutHugeBlocks();
295
296
297
298 void regroupNoUserInstructions();
299
300
301 void colorExports();
302
304
305 void topologicalSort();
306
307 void scheduleInsideBlocks();
308
309 void fillStats();
310};
311
317
321 std::vector<SIScheduleBlock*> Blocks;
322
323 std::vector<std::map<Register, unsigned>> LiveOutRegsNumUsages;
324 std::set LiveRegs;
325
326 std::map<Register, unsigned> LiveRegsConsumers;
327
328 std::vector LastPosHighLatencyParentScheduled;
329 int LastPosWaitedHighLatency;
330
331 std::vector<SIScheduleBlock*> BlocksScheduled;
332 unsigned NumBlockScheduled;
333 std::vector<SIScheduleBlock*> ReadyBlocks;
334
335 unsigned VregCurrentUsage;
336 unsigned SregCurrentUsage;
337
338
339 unsigned maxVregUsage;
340 unsigned maxSregUsage;
341
342 std::vector BlockNumPredsLeft;
343 std::vector BlockNumSuccsLeft;
344
345public:
350
351 std::vector<SIScheduleBlock*> getBlocks() { return BlocksScheduled; }
352
355
356private:
358
360
361 bool IsHighLatency;
362 int VGPRUsageDiff;
363 unsigned NumSuccessors;
364 unsigned NumHighLatencySuccessors;
365 unsigned LastPosHighLatParentScheduled;
366 unsigned Height;
367
368 SIBlockSchedCandidate() = default;
369
371
372
373 void setBest(SIBlockSchedCandidate &Best) {
374 assert(Best.Reason != NoCand && "uninitialized Sched candidate");
375 Block = Best.Block;
376 Reason = Best.Reason;
377 IsHighLatency = Best.IsHighLatency;
378 VGPRUsageDiff = Best.VGPRUsageDiff;
379 NumSuccessors = Best.NumSuccessors;
380 NumHighLatencySuccessors = Best.NumHighLatencySuccessors;
381 LastPosHighLatParentScheduled = Best.LastPosHighLatParentScheduled;
382 Height = Best.Height;
383 }
384 };
385
386 bool tryCandidateLatency(SIBlockSchedCandidate &Cand,
387 SIBlockSchedCandidate &TryCand);
388 bool tryCandidateRegUsage(SIBlockSchedCandidate &Cand,
389 SIBlockSchedCandidate &TryCand);
390 SIScheduleBlock *pickBlock();
391
392 void addLiveRegs(std::set &Regs);
393 void decreaseLiveRegs(SIScheduleBlock *Block, std::set &Regs);
394 void releaseBlockSuccs(SIScheduleBlock *Parent);
395 void blockScheduled(SIScheduleBlock *Block);
396
397
398
399 std::vector checkRegUsageImpact(std::set &InRegs,
400 std::set &OutRegs);
401
402 void schedule();
403};
404
409};
410
414
415public:
417
419
423};
424
428
429 std::vector SUnitsLinksBackup;
430
431
432 std::vector ScheduledSUnits;
433 std::vector ScheduledSUnitsInv;
434
435public:
437
439
440
442
443
447
457
459
461 _Iterator End,
462 unsigned &VgprUsage,
463 unsigned &SgprUsage);
464
466 std::set InRegs;
467 for (const auto &RegMaskPair : RPTracker.getPressure().LiveInRegs) {
468 InRegs.insert(RegMaskPair.VRegOrUnit);
469 }
470 return InRegs;
471 }
472
474 std::set OutRegs;
475 for (const auto &RegMaskPair : RPTracker.getPressure().LiveOutRegs) {
476 OutRegs.insert(RegMaskPair.VRegOrUnit);
477 }
478 return OutRegs;
479 };
480
481private:
482 void topologicalSort();
483
484 void moveLowLatencies();
485
486public:
487
491
492
495};
496
497}
498
499#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
MachineInstrBundleIterator< MachineInstr > iterator
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Track the current register pressure at some position in the instruction stream, and remember the high...
bool isSUInBlock(SUnit *SU, unsigned ID)
SIScheduleBlockCreator(SIScheduleDAGMI *DAG)
SIScheduleBlocks getBlocks(SISchedulerBlockCreatorVariant BlockVariant)
SIScheduleBlockScheduler(SIScheduleDAGMI *DAG, SISchedulerBlockSchedulerVariant Variant, SIScheduleBlocks BlocksStruct)
unsigned getVGPRUsage()
Definition SIMachineScheduler.h:353
~SIScheduleBlockScheduler()=default
unsigned getSGPRUsage()
Definition SIMachineScheduler.h:354
std::vector< SIScheduleBlock * > getBlocks()
Definition SIMachineScheduler.h:351
unsigned getNumHighLatencySuccessors() const
Definition SIMachineScheduler.h:126
SIScheduleBlock(SIScheduleDAGMI *DAG, SIScheduleBlockCreator *BC, unsigned ID)
Definition SIMachineScheduler.h:101
ArrayRef< std::pair< SIScheduleBlock *, SIScheduleBlockLinkKind > > getSuccs() const
Definition SIMachineScheduler.h:121
int getCost()
Definition SIMachineScheduler.h:135
~SIScheduleBlock()=default
std::vector< unsigned > & getInternalAdditionalRegUsage()
Definition SIMachineScheduler.h:156
const std::vector< SIScheduleBlock * > & getPreds() const
Definition SIMachineScheduler.h:119
void addPred(SIScheduleBlock *Pred)
std::set< Register > & getOutRegs()
Definition SIMachineScheduler.h:161
void printDebug(bool Full)
std::vector< SUnit * > getScheduledUnits()
Definition SIMachineScheduler.h:142
void addSucc(SIScheduleBlock *Succ, SIScheduleBlockLinkKind Kind)
unsigned Depth
Definition SIMachineScheduler.h:124
unsigned getID() const
Definition SIMachineScheduler.h:107
bool isScheduled()
Definition SIMachineScheduler.h:152
void schedule(MachineBasicBlock::iterator BeginBlock, MachineBasicBlock::iterator EndBlock)
void addUnit(SUnit *SU)
Functions for Block construction.
std::set< Register > & getInRegs()
Definition SIMachineScheduler.h:160
unsigned Height
Definition SIMachineScheduler.h:123
bool isHighLatencyBlock()
Definition SIMachineScheduler.h:130
SUnit & getEntrySU()
Definition SIMachineScheduler.h:455
void restoreSULinksLeft()
std::vector< int > BottomUpIndex2SU
Definition SIMachineScheduler.h:494
std::vector< unsigned > IsHighLatencySU
Definition SIMachineScheduler.h:490
std::vector< unsigned > LowLatencyOffset
Definition SIMachineScheduler.h:489
std::vector< int > TopDownIndex2SU
Definition SIMachineScheduler.h:493
void schedule() override
Implement ScheduleDAGInstrs interface for scheduling a sequence of reorderable instructions.
LiveIntervals * getLIS()
Definition SIMachineScheduler.h:451
ScheduleDAGTopologicalSort * GetTopo()
Definition SIMachineScheduler.h:454
void fillVgprSgprCost(_Iterator First, _Iterator End, unsigned &VgprUsage, unsigned &SgprUsage)
MachineRegisterInfo * getMRI()
Definition SIMachineScheduler.h:452
SIScheduleDAGMI(MachineSchedContext *C)
MachineBasicBlock::iterator getCurrentBottom()
Definition SIMachineScheduler.h:450
std::vector< unsigned > IsLowLatencySU
Definition SIMachineScheduler.h:488
MachineBasicBlock::iterator getCurrentTop()
Definition SIMachineScheduler.h:449
SUnit & getExitSU()
Definition SIMachineScheduler.h:456
MachineBasicBlock * getBB()
Definition SIMachineScheduler.h:448
void initRPTracker(RegPressureTracker &RPTracker)
Definition SIMachineScheduler.h:444
std::set< VirtRegOrUnit > getOutRegs()
Definition SIMachineScheduler.h:473
~SIScheduleDAGMI() override
const TargetRegisterInfo * getTRI()
Definition SIMachineScheduler.h:453
std::set< VirtRegOrUnit > getInRegs()
Definition SIMachineScheduler.h:465
struct SIScheduleBlockResult scheduleVariant(SISchedulerBlockCreatorVariant BlockVariant, SISchedulerBlockSchedulerVariant ScheduleVariant)
SIScheduler(SIScheduleDAGMI *DAG)
Definition SIMachineScheduler.h:416
Scheduling unit. This is a node in the scheduling DAG.
MachineBasicBlock * BB
The block in which to insert instructions.
ScheduleDAGTopologicalSort Topo
Topo - A topological ordering for SUnits which permits fast IsReachable and similar queries.
MachineBasicBlock::iterator RegionBegin
The beginning of the range to be scheduled.
ScheduleDAGMILive(MachineSchedContext *C, std::unique_ptr< MachineSchedStrategy > S)
RegisterClassInfo * RegClassInfo
RegPressureTracker RPTracker
MachineBasicBlock::iterator CurrentBottom
The bottom of the unscheduled zone.
MachineBasicBlock::iterator CurrentTop
The top of the unscheduled zone.
This class can compute a topological ordering for SUnits and provides methods for dynamically updatin...
MachineRegisterInfo & MRI
Virtual/real register map.
const TargetRegisterInfo * TRI
Target processor register info.
SUnit EntrySU
Special node for the region entry.
MachineFunction & MF
Machine function.
SUnit ExitSU
Special node for the region exit.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
SIScheduleCandReason
Definition SIMachineScheduler.h:31
@ Latency
Definition SIMachineScheduler.h:34
@ NodeOrder
Definition SIMachineScheduler.h:37
@ Successor
Definition SIMachineScheduler.h:35
@ RegUsage
Definition SIMachineScheduler.h:33
@ NoCand
Definition SIMachineScheduler.h:32
@ Depth
Definition SIMachineScheduler.h:36
SISchedulerBlockSchedulerVariant
Definition SIMachineScheduler.h:312
@ BlockLatencyRegUsage
Definition SIMachineScheduler.h:313
@ BlockRegUsageLatency
Definition SIMachineScheduler.h:314
@ BlockRegUsage
Definition SIMachineScheduler.h:315
SISchedulerBlockCreatorVariant
Definition SIMachineScheduler.h:216
@ LatenciesAlonePlusConsecutive
Definition SIMachineScheduler.h:219
@ LatenciesAlone
Definition SIMachineScheduler.h:217
@ LatenciesGrouped
Definition SIMachineScheduler.h:218
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
SIScheduleBlockLinkKind
Definition SIMachineScheduler.h:53
@ NoData
Definition SIMachineScheduler.h:54
RegisterPressure computed within a region of instructions delimited by TopIdx and BottomIdx.
MachineSchedContext provides enough context from the MachineScheduler pass for the target to instanti...
unsigned MaxVGPRUsage
Definition SIMachineScheduler.h:408
unsigned MaxSGPRUsage
Definition SIMachineScheduler.h:407
std::vector< unsigned > SUs
Definition SIMachineScheduler.h:406
std::vector< int > TopDownIndex2Block
Definition SIMachineScheduler.h:212
std::vector< SIScheduleBlock * > Blocks
Definition SIMachineScheduler.h:211
std::vector< int > TopDownBlock2Index
Definition SIMachineScheduler.h:213
SISchedulerCandidate()=default
SIScheduleCandReason Reason
Definition SIMachineScheduler.h:42
bool isRepeat(SIScheduleCandReason R)
Definition SIMachineScheduler.h:49
uint32_t RepeatReasonSet
Definition SIMachineScheduler.h:45
void setRepeat(SIScheduleCandReason R)
Definition SIMachineScheduler.h:50