29#define DEBUG_TYPE "si-pre-allocate-wwm-regs"
47 std::vector<unsigned> RegsToRewrite;
77 "SI Pre-allocate WWM Registers",
false,
false)
84char SIPreAllocateWWMRegs::
ID = 0;
89 return new SIPreAllocateWWMRegs();
97 if (!
TRI->isVGPR(*
MRI, Reg))
106 if (!
MRI->isPhysRegUsed(PhysReg,
true) &&
108 Matrix->assign(LI, PhysReg);
110 RegsToRewrite.push_back(Reg);
135 PhysReg =
TRI->getSubReg(PhysReg,
SubReg);
147 for (
unsigned Reg : RegsToRewrite) {
156 RegsToRewrite.clear();
159 MRI->freezeReservedRegs(MF);
166 unsigned Opc =
MI.getOpcode();
168 if (Opc == AMDGPU::ENTER_STRICT_WWM || Opc == AMDGPU::ENTER_STRICT_WQM ||
169 Opc == AMDGPU::ENTER_PSEUDO_WM) {
170 dbgs() <<
"Entering ";
172 assert(Opc == AMDGPU::EXIT_STRICT_WWM || Opc == AMDGPU::EXIT_STRICT_WQM ||
173 Opc == AMDGPU::EXIT_PSEUDO_WM);
174 dbgs() <<
"Exiting ";
177 if (Opc == AMDGPU::ENTER_STRICT_WWM || Opc == AMDGPU::EXIT_STRICT_WWM) {
178 dbgs() <<
"Strict WWM ";
179 }
else if (Opc == AMDGPU::ENTER_PSEUDO_WM || Opc == AMDGPU::EXIT_PSEUDO_WM) {
180 dbgs() <<
"Pseudo WWM/WQM ";
182 assert(Opc == AMDGPU::ENTER_STRICT_WQM || Opc == AMDGPU::EXIT_STRICT_WQM);
183 dbgs() <<
"Strict WQM ";
186 dbgs() <<
"region: " <<
MI;
196 TII =
ST.getInstrInfo();
197 TRI = &
TII->getRegisterInfo();
200 LIS = &getAnalysis<LiveIntervals>();
201 Matrix = &getAnalysis<LiveRegMatrix>();
202 VRM = &getAnalysis<VirtRegMap>();
206 bool PreallocateSGPRSpillVGPRs =
210 bool RegsAssigned =
false;
222 if (
MI.getOpcode() == AMDGPU::V_SET_INACTIVE_B32 ||
223 MI.getOpcode() == AMDGPU::V_SET_INACTIVE_B64)
224 RegsAssigned |= processDef(
MI.getOperand(0));
226 if (
MI.getOpcode() == AMDGPU::SI_SPILL_S32_TO_VGPR) {
227 if (!PreallocateSGPRSpillVGPRs)
229 RegsAssigned |= processDef(
MI.getOperand(0));
232 if (
MI.getOpcode() == AMDGPU::ENTER_STRICT_WWM ||
233 MI.getOpcode() == AMDGPU::ENTER_STRICT_WQM ||
234 MI.getOpcode() == AMDGPU::ENTER_PSEUDO_WM) {
240 if (
MI.getOpcode() == AMDGPU::EXIT_STRICT_WWM ||
241 MI.getOpcode() == AMDGPU::EXIT_STRICT_WQM ||
242 MI.getOpcode() == AMDGPU::EXIT_PSEUDO_WM) {
253 RegsAssigned |= processDef(DefOpnd);
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)
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.
LiveInterval & getInterval(Register Reg)
void removeInterval(Register Reg)
Interval removal.
@ 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,...
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
void runOnMachineFunction(const MachineFunction &MF)
runOnFunction - Prepare to answer questions about MF.
ArrayRef< MCPhysReg > getOrder(const TargetRegisterClass *RC) const
getOrder - Returns the preferred allocation order for RC.
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)
MCRegister getPhys(Register virtReg) const
returns the physical register mapped to the specified virtual register
bool hasPhys(Register virtReg) const
returns true if the specified virtual register is mapped to a physical register
#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)
This is an optimization pass for GlobalISel generic memory operations.
char & SIPreAllocateWWMRegsID
FunctionPass * createSIPreAllocateWWMRegsPass()
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void initializeSIPreAllocateWWMRegsPass(PassRegistry &)