29#define DEBUG_TYPE "si-pre-allocate-wwm-regs"
37class SIPreAllocateWWMRegs {
47 std::vector<unsigned> RegsToRewrite;
81 "SI Pre-allocate WWM Registers",
false,
false)
88char SIPreAllocateWWMRegsLegacy::
ID = 0;
93 return new SIPreAllocateWWMRegsLegacy();
101 if (!
TRI->isVGPR(*
MRI, Reg))
104 if (VRM->hasPhys(Reg))
109 for (
MCRegister PhysReg : RegClassInfo.getOrder(
MRI->getRegClass(Reg))) {
110 if (!
MRI->isPhysRegUsed(PhysReg,
true) &&
112 Matrix->assign(LI, PhysReg);
114 RegsToRewrite.push_back(Reg);
133 if (!VRM->hasPhys(VirtReg))
136 Register PhysReg = VRM->getPhys(VirtReg);
139 PhysReg =
TRI->getSubReg(PhysReg,
SubReg);
151 for (
unsigned Reg : RegsToRewrite) {
152 LIS->removeInterval(Reg);
154 const Register PhysReg = VRM->getPhys(Reg);
160 RegsToRewrite.clear();
163 MRI->freezeReservedRegs();
170 unsigned Opc =
MI.getOpcode();
172 if (Opc == AMDGPU::ENTER_STRICT_WWM || Opc == AMDGPU::ENTER_STRICT_WQM) {
173 dbgs() <<
"Entering ";
175 assert(Opc == AMDGPU::EXIT_STRICT_WWM || Opc == AMDGPU::EXIT_STRICT_WQM);
176 dbgs() <<
"Exiting ";
179 if (Opc == AMDGPU::ENTER_STRICT_WWM || Opc == AMDGPU::EXIT_STRICT_WWM) {
180 dbgs() <<
"Strict WWM ";
182 assert(Opc == AMDGPU::ENTER_STRICT_WQM || Opc == AMDGPU::EXIT_STRICT_WQM);
183 dbgs() <<
"Strict WQM ";
186 dbgs() <<
"region: " <<
MI;
191bool SIPreAllocateWWMRegsLegacy::runOnMachineFunction(
MachineFunction &MF) {
192 auto *LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS();
193 auto *
Matrix = &getAnalysis<LiveRegMatrixWrapperLegacy>().getLRM();
194 auto *VRM = &getAnalysis<VirtRegMapWrapperLegacy>().getVRM();
195 return SIPreAllocateWWMRegs(LIS,
Matrix, VRM).run(MF);
203 TII =
ST.getInstrInfo();
204 TRI = &
TII->getRegisterInfo();
207 RegClassInfo.runOnMachineFunction(MF);
209 bool PreallocateSGPRSpillVGPRs =
213 bool RegsAssigned =
false;
225 if (
MI.getOpcode() == AMDGPU::SI_SPILL_S32_TO_VGPR) {
226 if (PreallocateSGPRSpillVGPRs)
227 RegsAssigned |= processDef(
MI.getOperand(0));
231 if (
MI.getOpcode() == AMDGPU::ENTER_STRICT_WWM ||
232 MI.getOpcode() == AMDGPU::ENTER_STRICT_WQM) {
238 if (
MI.getOpcode() == AMDGPU::EXIT_STRICT_WWM ||
239 MI.getOpcode() == AMDGPU::EXIT_STRICT_WQM) {
250 RegsAssigned |= processDef(DefOpnd);
268 SIPreAllocateWWMRegs(LIS,
Matrix, VRM).
run(MF);
unsigned const MachineRegisterInfo * MRI
Provides AMDGPU specific target descriptions.
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
AMD GCN specific subclass of TargetSubtarget.
const HexagonInstrInfo * TII
unsigned const TargetRegisterInfo * TRI
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
SI Pre allocate WWM Registers
static cl::opt< bool > EnablePreallocateSGPRSpillVGPRs("amdgpu-prealloc-sgpr-spill-vgprs", cl::init(false), cl::Hidden)
A container for analyses that lazily runs them and caches their results.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
FunctionPass class - This class is used to implement most global optimizations.
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
LiveInterval - This class represents the liveness of a register, or stack slot.
@ IK_Free
No interference, go ahead and assign.
Wrapper class representing physical registers. Should be passed by value.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
void setSubReg(unsigned subReg)
unsigned getSubReg() const
void setIsRenamable(bool Val=true)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
void setReg(Register Reg)
Change the register this operand corresponds to.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Wrapper class representing virtual and physical registers.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
This class keeps track of the SPI_SP_INPUT_ADDR config register, which tells the hardware which inter...
void reserveWWMRegister(Register Reg)
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
VirtRegMap run(MachineFunction &MF, MachineFunctionAnalysisManager &MAM)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
This is an optimization pass for GlobalISel generic memory operations.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
FunctionPass * createSIPreAllocateWWMRegsLegacyPass()
char & SIPreAllocateWWMRegsLegacyID