16 #ifndef LLVM_TARGET_TARGETREGISTERINFO_H
17 #define LLVM_TARGET_TARGETREGISTERINFO_H
30 class MachineFunction;
32 template<
class T>
class SmallVectorImpl;
81 bool contains(
unsigned Reg1,
unsigned Reg2)
const {
224 const char *
const *SubRegIndexNames;
226 const unsigned *SubRegIndexLaneMasks;
229 unsigned CoveringLanes;
235 const char *
const *SRINames,
236 const unsigned *SRILaneMasks,
237 unsigned CoveringLanes);
261 return int(Reg) >= (1 << 30);
268 return int(Reg - (1u << 30));
274 assert(FI >= 0 &&
"Cannot hold a negative frame index.");
275 return FI + (1u << 30);
281 assert(!
isStackSlot(Reg) &&
"Not a register! Check isStackSlot() first.");
288 assert(!
isStackSlot(Reg) &&
"Not a register! Check isStackSlot() first.");
296 return Reg & ~(1u << 31);
302 return Index | (1u << 31);
338 "This is not a subregister index");
339 return SubRegIndexNames[SubIdx-1];
364 return SubRegIndexLaneMasks[SubIdx];
395 if (regA == regB)
return true;
403 if (*RUA == *RUB)
return true;
404 if (*RUA < *RUB) ++RUA;
413 if (*Units == RegUnit)
485 assert(Idx == 0 &&
"Target has no sub-registers");
542 unsigned &PreA,
unsigned &PreB)
const;
561 return RegClassBegin[i];
708 int &FrameIdx)
const {
743 unsigned BaseReg,
int FrameIdx,
744 int64_t Offset)
const {
752 unsigned BaseReg, int64_t Offset)
const {
759 int64_t Offset)
const {
773 unsigned Reg)
const {
785 int SPAdj,
unsigned FIOperandNum,
820 const unsigned RCMaskWords;
823 const uint32_t *Mask;
830 bool IncludeSelf =
false)
831 : RCMaskWords((TRI->getNumRegClasses() + 31) / 32),
833 Idx(RC->getSuperRegIndices()),
834 Mask(RC->getSubClassMask()) {
847 const uint32_t *
getMask()
const {
return Mask; }
851 assert(
isValid() &&
"Cannot move iterator past end.");
885 : TRI(tri),
Reg(reg), SubIdx(subidx) {}
virtual void UpdateRegAllocHint(unsigned Reg, unsigned NewReg, MachineFunction &MF) const
const MCPhysReg * const_iterator
virtual bool hasReservedSpillSlot(const MachineFunction &MF, unsigned Reg, int &FrameIdx) const
vt_iterator vt_end() const
TargetRegisterInfo(const TargetRegisterInfoDesc *ID, regclass_iterator RegClassBegin, regclass_iterator RegClassEnd, const char *const *SRINames, const unsigned *SRILaneMasks, unsigned CoveringLanes)
virtual unsigned getNumRegPressureSets() const =0
Get the number of dimensions of register pressure.
const TargetRegisterClass * getMinimalPhysRegClass(unsigned Reg, EVT VT=MVT::Other) const
void print(raw_ostream &) const
static unsigned virtReg2Index(unsigned Reg)
virtual bool saveScavengerRegister(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, MachineBasicBlock::iterator &UseMI, const TargetRegisterClass *RC, unsigned Reg) const
bool isValid() const
isValid - returns true if this iterator is not yet at the end.
unsigned getRegister(unsigned i) const
unsigned operator()(unsigned Reg) const
PrintReg(unsigned reg, const TargetRegisterInfo *tri=0, unsigned subidx=0)
static unsigned index2VirtReg(unsigned Index)
const uint16_t * getSuperRegIndices() const
virtual ~TargetRegisterInfo()
bool hasSubClassEq(const TargetRegisterClass *RC) const
virtual const uint32_t * getCallPreservedMask(CallingConv::ID) const
static bool isVirtualRegister(unsigned Reg)
virtual unsigned getRegPressureSetLimit(unsigned Idx) const =0
void print(raw_ostream &) const
regclass_iterator regclass_end() const
virtual const int * getRegClassPressureSets(const TargetRegisterClass *RC) const =0
bool hasSuperClassEq(const TargetRegisterClass *RC) const
const TargetRegisterClass * getCommonSubClass(const TargetRegisterClass *A, const TargetRegisterClass *B) const
virtual const TargetRegisterClass * getCrossCopyRegClass(const TargetRegisterClass *RC) const
virtual bool requiresFrameIndexScavenging(const MachineFunction &MF) const
const uint32_t * SubClassMask
const MCPhysReg * iterator
virtual unsigned getRegUnitWeight(unsigned RegUnit) const =0
Get the weight in units of pressure for this register unit.
virtual const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF=0) const =0
static int stackSlot2Index(unsigned Reg)
bool isAllocatable() const
virtual int64_t getFrameIndexInstrOffset(const MachineInstr *MI, int Idx) const
const uint16_t * SuperRegIndices
unsigned getNumRegClasses() const
unsigned getNumRegs() const
const char * getName() const
ArrayRef< T > makeArrayRef(const T &OneElt)
Construct an ArrayRef from a single element.
unsigned getSubReg() const
Returns the current sub-register index.
#define llvm_unreachable(msg)
virtual const char * getRegPressureSetName(unsigned Idx) const =0
Get the name of this register unit pressure set.
const TargetRegisterClass * getRegClass(unsigned i) const
ArrayRef< MCPhysReg > getRawAllocationOrder(const MachineFunction &MF) const
virtual unsigned getFrameRegister(const MachineFunction &MF) const =0
Debug information queries.
ID
LLVM Calling Convention Representation.
virtual void getRegAllocationHints(unsigned VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM=0) const
unsigned getNumSubRegIndices() const
Return the number of sub-register indices understood by the target. Index 0 is reserved for the no-op...
unsigned getMatchingSuperReg(unsigned Reg, unsigned SubIdx, const TargetRegisterClass *RC) const
void operator++()
Advance iterator to the next entry.
virtual const TargetRegisterClass * getMatchingSuperRegClass(const TargetRegisterClass *A, const TargetRegisterClass *B, unsigned Idx) const
virtual bool requiresVirtualBaseRegisters(const MachineFunction &MF) const
virtual bool useFPForScavengingIndex(const MachineFunction &MF) const
virtual void materializeFrameBaseRegister(MachineBasicBlock *MBB, unsigned BaseReg, int FrameIdx, int64_t Offset) const
MCRegisterClass - Base class of TargetRegisterClass.
virtual void resolveFrameIndex(MachineBasicBlock::iterator I, unsigned BaseReg, int64_t Offset) const
bool isInAllocatableClass(unsigned RegNo) const
virtual bool requiresRegisterScavenging(const MachineFunction &MF) const
const TargetRegisterClass * getCommonSuperRegClass(const TargetRegisterClass *RCA, unsigned SubA, const TargetRegisterClass *RCB, unsigned SubB, unsigned &PreA, unsigned &PreB) const
bool hasSuperClass(const TargetRegisterClass *RC) const
bundle_iterator< MachineInstr, instr_iterator > iterator
PrintVRegOrUnit(unsigned VRegOrUnit, const TargetRegisterInfo *tri)
virtual bool avoidWriteAfterWrite(const TargetRegisterClass *RC) const
bool regsOverlap(unsigned regA, unsigned regB) const
regclass_iterator regclass_begin() const
bool contains(unsigned Reg1, unsigned Reg2) const
contains - Return true if both registers are in this class.
const sc_iterator SuperClasses
virtual bool needsStackRealignment(const MachineFunction &MF) const
unsigned getAlignment() const
unsigned getSubRegIndexLaneMask(unsigned SubIdx) const
unsigned getCostPerUse(unsigned RegNo) const
BitVector getAllocatableSet(const MachineFunction &MF, const TargetRegisterClass *RC=NULL) const
unsigned getRegister(unsigned i) const
const TargetRegisterClass *const * sc_iterator
const TargetRegisterClass * getAllocatableClass(const TargetRegisterClass *RC) const
bool hasSubClass(const TargetRegisterClass *RC) const
void print(raw_ostream &) const
const char * getName() const
unsigned getCoveringLanes() const
unsigned getMatchingSuperReg(unsigned Reg, unsigned SubIdx, const MCRegisterClass *RC) const
Return a super-register of the specified register Reg so its sub-register of index SubIdx is Reg...
static bool isStackSlot(unsigned Reg)
bool contains(unsigned Reg) const
virtual const RegClassWeight & getRegClassWeight(const TargetRegisterClass *RC) const =0
Get the weight in units of pressure for this register class.
bool isValid() const
Returns true if this iterator is still pointing at a valid entry.
virtual bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const
const MVT::SimpleValueType * vt_iterator
ArrayRef< MCPhysReg >(* OrderFunc)(const MachineFunction &)
const MCRegisterClass * MC
virtual BitVector getReservedRegs(const MachineFunction &MF) const =0
unsigned getNumRegs() const
const char * getSubRegIndexName(unsigned SubIdx) const
SuperRegClassIterator(const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, bool IncludeSelf=false)
virtual unsigned composeSubRegIndicesImpl(unsigned, unsigned) const
Overridden by TableGen in targets that have sub-registers.
static bool isPhysicalRegister(unsigned Reg)
virtual bool needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const
virtual bool isFrameOffsetLegal(const MachineInstr *MI, int64_t Offset) const
bool isAllocatable() const
unsigned getAlignment() const
virtual const int * getRegUnitPressureSets(unsigned RegUnit) const =0
bool hasType(EVT vt) const
raw_ostream & operator<<(raw_ostream &OS, const APInt &I)
virtual unsigned getRegPressureLimit(const TargetRegisterClass *RC, MachineFunction &MF) const
virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=NULL) const =0
virtual const TargetRegisterClass * getSubClassWithSubReg(const TargetRegisterClass *RC, unsigned Idx) const
virtual const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC) const
virtual int getCompactUnwindRegNum(unsigned, bool) const
PrintRegUnit(unsigned unit, const TargetRegisterInfo *tri)
vt_iterator vt_begin() const
const uint32_t * getMask() const
unsigned composeSubRegIndices(unsigned a, unsigned b) const
const TargetRegisterInfo * TRI
virtual const TargetRegisterClass * getPointerRegClass(const MachineFunction &MF, unsigned Kind=0) const
sc_iterator getSuperClasses() const
static unsigned index2StackSlot(int FI)
const uint32_t * getSubClassMask() const
const TargetRegisterClass *const * regclass_iterator
bool hasRegUnit(unsigned Reg, unsigned RegUnit) const
hasRegUnit - Returns true if Reg contains RegUnit.
bool contains(unsigned Reg) const