LLVM 22.0.0git
GCNIterativeScheduler.h
Go to the documentation of this file.
1//===- GCNIterativeScheduler.h - GCN Scheduler ------------------*- 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/// \file
10/// This file defines the class GCNIterativeScheduler, which uses an iterative
11/// approach to find a best schedule for GCN architecture. It basically makes
12/// use of various lightweight schedules, scores them, chooses best one based on
13/// their scores, and finally implements the chosen one.
14///
15//===----------------------------------------------------------------------===//
16
17#ifndef LLVM_LIB_TARGET_AMDGPU_GCNITERATIVESCHEDULER_H
18#define LLVM_LIB_TARGET_AMDGPU_GCNITERATIVESCHEDULER_H
19
20#include "GCNRegPressure.h"
22
23namespace llvm {
24
25class MachineInstr;
26class SUnit;
27class raw_ostream;
28
31
32public:
38 };
39
41 StrategyKind S);
42
43 void schedule() override;
44
48 unsigned RegionInstrs) override;
49
50 void finalizeSchedule() override;
51
52protected:
54
56 std::vector<MachineInstr *> Schedule;
58 };
59
60 struct Region {
61 // Fields except for BestSchedule are supposed to reflect current IR state
62 // `const` fields are to emphasize they shouldn't change for any schedule.
64 // End is either a boundary instruction or end of basic block
66 const unsigned NumRegionInstrs;
68
69 // best schedule for the region so far (not scheduled yet)
70 std::unique_ptr<TentativeSchedule> BestSchedule;
71 };
72
74 std::vector<Region*> Regions;
75
79
80 std::vector<std::unique_ptr<ScheduleDAGMutation>> SavedMutations;
81
82 class BuildDAG;
84
85 template <typename Range>
87 Range &&Schedule) const;
88
91
93 return getRegionPressure(R.Begin, R.End);
94 }
95
96 void swapIGLPMutations(const Region &R, bool IsReentry);
97 void setBestSchedule(Region &R,
98 ScheduleRef Schedule,
99 const GCNRegPressure &MaxRP = GCNRegPressure());
100
101 void scheduleBest(Region &R);
102
103 std::vector<MachineInstr*> detachSchedule(ScheduleRef Schedule) const;
104
105 void sortRegionsByPressure(unsigned TargetOcc);
106
107 template <typename Range>
108 void scheduleRegion(Region &R, Range &&Schedule,
109 const GCNRegPressure &MaxRP = GCNRegPressure());
110
111 unsigned tryMaximizeOccupancy(unsigned TargetOcc =
112 std::numeric_limits<unsigned>::max());
113
114 void scheduleLegacyMaxOccupancy(bool TryMaximizeOccupancy = true);
115 void scheduleMinReg(bool force = false);
116 void scheduleILP(bool TryMaximizeOccupancy = true);
117
118 void printRegions(raw_ostream &OS) const;
120 const Region *R,
121 const GCNRegPressure &RP) const;
123 const GCNRegPressure &Before,
124 const GCNRegPressure &After) const;
125};
126
127} // end namespace llvm
128
129#endif // LLVM_LIB_TARGET_AMDGPU_GCNITERATIVESCHEDULER_H
bool End
Definition: ELF_riscv.cpp:480
This file defines the GCNRegPressure class, which tracks registry pressure by bookkeeping number of S...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
raw_pwrite_stream & OS
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
SpecificBumpPtrAllocator< Region > Alloc
void printSchedRP(raw_ostream &OS, const GCNRegPressure &Before, const GCNRegPressure &After) const
void enterRegion(MachineBasicBlock *BB, MachineBasicBlock::iterator Begin, MachineBasicBlock::iterator End, unsigned RegionInstrs) override
Implement the ScheduleDAGInstrs interface for handling the next scheduling region.
void sortRegionsByPressure(unsigned TargetOcc)
std::vector< Region * > Regions
void scheduleILP(bool TryMaximizeOccupancy=true)
void swapIGLPMutations(const Region &R, bool IsReentry)
void printSchedResult(raw_ostream &OS, const Region *R, const GCNRegPressure &RP) const
unsigned tryMaximizeOccupancy(unsigned TargetOcc=std::numeric_limits< unsigned >::max())
void printRegions(raw_ostream &OS) const
void setBestSchedule(Region &R, ScheduleRef Schedule, const GCNRegPressure &MaxRP=GCNRegPressure())
void finalizeSchedule() override
Allow targets to perform final scheduling actions at the level of the whole MachineFunction.
void scheduleLegacyMaxOccupancy(bool TryMaximizeOccupancy=true)
std::vector< std::unique_ptr< ScheduleDAGMutation > > SavedMutations
void schedule() override
Implement ScheduleDAGInstrs interface for scheduling a sequence of reorderable instructions.
GCNRegPressure getSchedulePressure(const Region &R, Range &&Schedule) const
void scheduleMinReg(bool force=false)
GCNRegPressure getRegionPressure(MachineBasicBlock::iterator Begin, MachineBasicBlock::iterator End) const
ArrayRef< const SUnit * > ScheduleRef
void scheduleRegion(Region &R, Range &&Schedule, const GCNRegPressure &MaxRP=GCNRegPressure())
GCNRegPressure getRegionPressure(const Region &R) const
std::vector< MachineInstr * > detachSchedule(ScheduleRef Schedule) const
MachineBasicBlock * BB
The block in which to insert instructions.
ScheduleDAGMILive is an implementation of ScheduleDAGInstrs that schedules machine instructions while...
A BumpPtrAllocator that allows only elements of a specific type to be allocated.
Definition: Allocator.h:390
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
const MachineBasicBlock::iterator End
std::unique_ptr< TentativeSchedule > BestSchedule
MachineSchedContext provides enough context from the MachineScheduler pass for the target to instanti...