68 #define DEBUG_TYPE "sgpr-copies"
89 unsigned SubReg)
const;
93 unsigned SubReg)
const;
102 const char *getPassName()
const {
103 return "SI Fix SGPR copies";
113 return new SIFixSGPRCopies(tm);
136 unsigned SubReg)
const {
140 "Reg cannot be a physical register");
146 switch (
I->getOpcode()) {
148 RC = TRI->getCommonSubClass(RC, inferRegClassFromUses(TRI, MRI,
149 I->getOperand(0).getReg(),
150 I->getOperand(0).getSubReg()));
162 unsigned SubReg)
const {
176 bool SIFixSGPRCopies::isVGPRToSGPRCopy(
const MachineInstr &Copy,
187 DstRC == &AMDGPU::M0RegRegClass)
190 SrcRC = inferRegClassFromDef(TRI, MRI, SrcReg, SrcSubReg);
208 DEBUG(
dbgs() <<
"Fixing VGPR -> SGPR copy:\n");
229 if (TRI->getCommonSubClass(RC, &AMDGPU::VReg_32RegClass)) {
253 DEBUG(
dbgs() <<
"Fixing REG_SEQUENCE:\n");
const MachineFunction * getParent() const
static bool isVirtualRegister(unsigned Reg)
void moveToVALU(MachineInstr &MI) const
Replace this instruction's opcode with the equivalent VALU opcode. This function will also move the u...
bool hasVGPRs(const TargetRegisterClass *RC) const
static bool hasVGPROperands(const MachineInstr &MI, const SIRegisterInfo *TRI)
static use_iterator use_end()
const HexagonInstrInfo * TII
bool isReg() const
isReg - Tests if this is a MO_Register operand.
const TargetRegisterClass * getRegClass(unsigned Reg) const
ID
LLVM Calling Convention Representation.
unsigned getNumOperands() const
const TargetRegisterClass * constrainRegClass(unsigned Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
FunctionPass * createSIFixSGPRCopiesPass(TargetMachine &tm)
const MachineBasicBlock * getParent() const
bundle_iterator< MachineInstr, instr_iterator > iterator
const MachineOperand & getOperand(unsigned i) const
unsigned getSubReg() const
virtual const TargetInstrInfo * getInstrInfo() const
bool isSGPRClass(const TargetRegisterClass *RC) const
void print(raw_ostream &OS, const TargetMachine *TM=0, bool SkipOpers=false) const
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
const TargetRegisterClass * getSubRegClass(const TargetRegisterClass *RC, unsigned SubIdx) const
const TargetRegisterClass * getPhysRegClass(unsigned Reg) const
Return the 'base' register class for this register. e.g. SGPR0 => SReg_32, VGPR => VReg_32 SGPR0_SGPR...
Interface definition for SIInstrInfo.
MachineRegisterInfo & getRegInfo()
use_iterator use_begin(unsigned RegNo) const
const TargetMachine & getTarget() const
virtual const TargetRegisterInfo * getRegisterInfo() const
MachineInstr * getVRegDef(unsigned Reg) const
unsigned getReg() const
getReg - Returns the register number.
BasicBlockListType::iterator iterator
const TargetRegisterClass * getOpRegClass(const MachineInstr &MI, unsigned OpNo) const
Return the correct register class for OpNo. For target-specific instructions, this will return the re...
const MCRegisterInfo & MRI