27#define DEBUG_TYPE "amdgpu-regbankselect"
43 return "AMDGPU Register Bank Select";
63 "AMDGPU Register Bank Select",
false,
false)
70char AMDGPURegBankSelect::ID = 0;
75 return new AMDGPURegBankSelect();
93 : B(B), MRI(*B.getMRI()), ILMA(ILMA), MUI(MUI), TRI(TRI),
94 SgprRB(&RBI.getRegBank(
AMDGPU::SGPRRegBankID)),
95 VgprRB(&RBI.getRegBank(
AMDGPU::VGPRRegBankID)),
96 VccRB(&RBI.getRegBank(
AMDGPU::VCCRegBankID)) {}
106 if (!
MI->isCopy() ||
MI->getNumImplicitOperands() != 1)
109 return MI->implicit_operands().begin()->getReg() == TRI.getExec();
114 (MUI.isUniformAtDef(Reg) || ILMA.isS32S64LaneMask(Reg)))
136 LLT Ty = MRI.getType(Reg);
137 Register NewReg = MRI.createVirtualRegister({RB, Ty});
140 auto &
MBB = *
MI.getParent();
141 B.setInsertPt(
MBB,
MBB.SkipPHIsAndLabels(std::next(
MI.getIterator())));
142 B.buildCopy(Reg, NewReg);
155 if (
UseMI.isPreISelOpcode()) {
157 if (
Op.isReg() &&
Op.getReg() == Reg)
172 LLT Ty = MRI.getType(Reg);
173 Register NewReg = MRI.createVirtualRegister({RB, Ty});
177 auto DefMI = MRI.getVRegDef(Reg)->getIterator();
184 B.buildCopy(NewReg, Reg);
194 if (!
Reg.isVirtual())
205 const TargetPassConfig &TPC = getAnalysis<TargetPassConfig>();
206 GISelCSEAnalysisWrapper &
Wrapper =
207 getAnalysis<GISelCSEAnalysisWrapperPass>().getCSEWrapper();
209 GISelObserverWrapper Observer;
213 B.setCSEInfo(&CSEInfo);
214 B.setChangeObserver(Observer);
216 RAIIDelegateInstaller DelegateInstaller(MF, &Observer);
217 RAIIMFObserverInstaller MFObserverInstaller(MF, Observer);
219 IntrinsicLaneMaskAnalyzer ILMA(MF);
221 getAnalysis<MachineUniformityAnalysisPass>().getUniformityInfo();
222 MachineRegisterInfo &MRI = *
B.getMRI();
224 RegBankSelectHelper RBSHelper(
B, ILMA, MUI, *
ST.getRegisterInfo(),
225 *
ST.getRegBankInfo());
230 for (MachineBasicBlock &
MBB : MF) {
231 for (MachineInstr &
MI :
MBB) {
240 MRI.
setRegBank(DefReg, *RBSHelper.getRegBankToAssign(DefReg));
244 if (!
MI.isPreISelOpcode())
257 for (MachineOperand &DefOP :
MI.defs()) {
262 const RegisterBank *RB = RBSHelper.getRegBankToAssign(DefReg);
264 RBSHelper.reAssignRegBankOnDef(
MI, DefOP, RB);
273 for (MachineOperand &UseOP :
MI.uses()) {
284 const RegisterBank *RB = RBSHelper.getRegBankToAssign(
UseReg);
285 RBSHelper.constrainRegBankUse(
MI, UseOP, RB);
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
amdgpu aa AMDGPU Address space based Alias Analysis Wrapper
static Register getVReg(MachineOperand &Op)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Provides analysis for continuously CSEing during GISel passes.
This file implements a version of MachineIRBuilder which CSEs insts within a MachineBasicBlock.
AMD GCN specific subclass of TargetSubtarget.
static Register UseReg(const MachineOperand &MO)
Promote Memory to Register
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Target-Independent Code Generator Pass Configuration Options pass.
const RegisterBank * getRegBankToAssign(Register Reg)
void reAssignRegBankOnDef(MachineInstr &MI, MachineOperand &DefOP, const RegisterBank *RB)
RegBankSelectHelper(MachineIRBuilder &B, AMDGPU::IntrinsicLaneMaskAnalyzer &ILMA, const MachineUniformityInfo &MUI, const SIRegisterInfo &TRI, const RegisterBankInfo &RBI)
bool isTemporalDivergenceCopy(Register Reg)
void constrainRegBankUse(MachineInstr &MI, MachineOperand &UseOP, const RegisterBank *RB)
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
FunctionPass class - This class is used to implement most global optimizations.
The actual analysis pass wrapper.
void addObserver(GISelChangeObserver *O)
static constexpr LLT scalar(unsigned SizeInBits)
Get a low-level scalar or aggregate "bag of bits".
LLVM_ABI iterator SkipPHIsAndLabels(iterator I)
Return the first instruction in MBB after I that is not a PHI or a label.
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.
Properties which a MachineFunction may have at a given point in time.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
const MachineFunctionProperties & getProperties() const
Get the function properties.
Helper class to build MachineInstr.
Representation of each machine instruction.
bool isPreISelOpcode(QueryType Type=IgnoreBundle) const
Return true if this is an instruction that should go through the usual legalization steps.
MachineOperand class - Representation of each machine instruction operand.
LLVM_ABI 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,...
LLVM_ABI MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
const RegisterBank * getRegBankOrNull(Register Reg) const
Return the register bank of Reg, or null if Reg has not been assigned a register bank or has been ass...
LLVM_ABI void setRegBank(Register Reg, const RegisterBank &RegBank)
Set the register bank to RegBank for Reg.
const TargetRegisterClass * getRegClassOrNull(Register Reg) const
Return the register class of Reg, or null if Reg has not been assigned a register class yet.
Holds all the information related to register banks.
This class implements the register bank concept.
Wrapper class representing virtual and physical registers.
constexpr bool isValid() const
Represent a constant reference to a string, i.e.
Target-Independent Code Generator Pass Configuration Options.
virtual std::unique_ptr< CSEConfigBase > getCSEConfig() const
Returns the CSEConfig object to use for the current optimization level.
This is an optimization pass for GlobalISel generic memory operations.
GenericUniformityInfo< MachineSSAContext > MachineUniformityInfo
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
char & AMDGPURegBankSelectID
FunctionPass * createAMDGPURegBankSelectPass()
DWARFExpression::Operation Op