41#define GET_REGINFO_TARGET_DESC
42#include "X86GenRegisterInfo.inc"
46 cl::desc(
"Enable use of a base pointer for complex stack frames"));
50 X86_MC::getDwarfRegFlavour(TT,
false),
51 X86_MC::getDwarfRegFlavour(TT,
true),
52 (TT.isArch64Bit() ? X86::RIP : X86::EIP)) {
56 Is64Bit = TT.isArch64Bit();
57 IsWin64 = Is64Bit && TT.isOSWindows();
67 bool Use64BitReg = !TT.isX32();
68 StackPtr = Use64BitReg ? X86::RSP : X86::ESP;
69 FramePtr = Use64BitReg ? X86::RBP : X86::EBP;
70 BasePtr = Use64BitReg ? X86::RBX : X86::EBX;
81 return getEncodingValue(i);
89 if (!Is64Bit &&
Idx == X86::sub_8bit)
90 Idx = X86::sub_8bit_hi;
93 return X86GenRegisterInfo::getSubClassWithSubReg(RC,
Idx);
99 unsigned SubIdx)
const {
101 if (!Is64Bit && SubIdx == X86::sub_8bit) {
102 A = X86GenRegisterInfo::getSubClassWithSubReg(
A, X86::sub_8bit_hi);
106 return X86GenRegisterInfo::getMatchingSuperRegClass(
A,
B, SubIdx);
120 if (RC == &X86::GR8_NOREXRegClass)
128 switch (Super->getID()) {
129 case X86::FR32RegClassID:
130 case X86::FR64RegClassID:
133 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
136 case X86::VR128RegClassID:
137 case X86::VR256RegClassID:
139 if (!Subtarget.hasVLX() &&
140 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
143 case X86::VR128XRegClassID:
144 case X86::VR256XRegClassID:
146 if (Subtarget.hasVLX() &&
147 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
150 case X86::FR32XRegClassID:
151 case X86::FR64XRegClassID:
154 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
157 case X86::GR8RegClassID:
158 case X86::GR16RegClassID:
159 case X86::GR32RegClassID:
160 case X86::GR64RegClassID:
161 case X86::RFP32RegClassID:
162 case X86::RFP64RegClassID:
163 case X86::RFP80RegClassID:
164 case X86::VR512_0_15RegClassID:
165 case X86::VR512RegClassID:
168 if (getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
178 unsigned Kind)
const {
184 return &X86::GR64RegClass;
194 ? &X86::LOW32_ADDR_ACCESS_RBPRegClass
195 : &X86::LOW32_ADDR_ACCESSRegClass;
197 return &X86::GR32RegClass;
200 return &X86::GR64_NOSPRegClass;
202 return &X86::GR32_NOSPRegClass;
205 return &X86::GR64_NOREXRegClass;
206 return &X86::GR32_NOREXRegClass;
209 return &X86::GR64_NOREX_NOSPRegClass;
211 return &X86::GR32_NOREX_NOSPRegClass;
220 unsigned SrcSubReg)
const {
225 SrcRC->
hasSuperClassEq(&X86::GR64RegClass) && SrcSubReg == X86::sub_32bit)
236 return &X86::GR64_TCW64RegClass;
238 return &X86::GR64_TCRegClass;
242 return &X86::GR32RegClass;
243 return &X86::GR32_TCRegClass;
248 if (RC == &X86::CCRRegClass) {
250 return &X86::GR64RegClass;
252 return &X86::GR32RegClass;
262 unsigned FPDiff = TFI->
hasFP(MF) ? 1 : 0;
263 switch (RC->
getID()) {
266 case X86::GR32RegClassID:
268 case X86::GR64RegClassID:
270 case X86::VR128RegClassID:
271 return Is64Bit ? 10 : 4;
272 case X86::VR64RegClassID:
279 assert(MF &&
"MachineFunction required");
283 bool HasSSE = Subtarget.
hasSSE1();
284 bool HasAVX = Subtarget.
hasAVX();
298 return CSR_NoRegs_SaveList;
303 return CSR_NoRegs_SaveList;
306 return CSR_64_AllRegs_AVX_SaveList;
307 return CSR_64_AllRegs_SaveList;
309 return CSR_64_RT_MostRegs_SaveList;
312 return CSR_64_RT_AllRegs_AVX_SaveList;
313 return CSR_64_RT_AllRegs_SaveList;
317 CSR_64_CXX_TLS_Darwin_PE_SaveList : CSR_64_TLS_Darwin_SaveList;
320 if (HasAVX512 && IsWin64)
321 return CSR_Win64_Intel_OCL_BI_AVX512_SaveList;
322 if (HasAVX512 && Is64Bit)
323 return CSR_64_Intel_OCL_BI_AVX512_SaveList;
324 if (HasAVX && IsWin64)
325 return CSR_Win64_Intel_OCL_BI_AVX_SaveList;
326 if (HasAVX && Is64Bit)
327 return CSR_64_Intel_OCL_BI_AVX_SaveList;
328 if (!HasAVX && !IsWin64 && Is64Bit)
329 return CSR_64_Intel_OCL_BI_SaveList;
335 return (HasSSE ? CSR_Win64_RegCall_SaveList :
336 CSR_Win64_RegCall_NoSSE_SaveList);
338 return (HasSSE ? CSR_SysV64_RegCall_SaveList :
339 CSR_SysV64_RegCall_NoSSE_SaveList);
342 return (HasSSE ? CSR_32_RegCall_SaveList :
343 CSR_32_RegCall_NoSSE_SaveList);
346 assert(!Is64Bit &&
"CFGuard check mechanism only used on 32-bit X86");
347 return (HasSSE ? CSR_Win32_CFGuard_Check_SaveList
348 : CSR_Win32_CFGuard_Check_NoSSE_SaveList);
351 return CSR_64_MostRegs_SaveList;
355 return CSR_Win64_NoSSE_SaveList;
356 return CSR_Win64_SaveList;
359 return CSR_32_SaveList;
360 return IsWin64 ? CSR_Win64_SwiftTail_SaveList : CSR_64_SwiftTail_SaveList;
363 return CSR_64EHRet_SaveList;
364 return CSR_64_SaveList;
368 return CSR_64_AllRegs_AVX512_SaveList;
370 return CSR_64_AllRegs_AVX_SaveList;
372 return CSR_64_AllRegs_SaveList;
373 return CSR_64_AllRegs_NoSSE_SaveList;
376 return CSR_32_AllRegs_AVX512_SaveList;
378 return CSR_32_AllRegs_AVX_SaveList;
380 return CSR_32_AllRegs_SSE_SaveList;
381 return CSR_32_AllRegs_SaveList;
389 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError);
391 return IsWin64 ? CSR_Win64_SwiftError_SaveList
392 : CSR_64_SwiftError_SaveList;
395 return HasSSE ? CSR_Win64_SaveList : CSR_Win64_NoSSE_SaveList;
397 return CSR_64EHRet_SaveList;
398 return CSR_64_SaveList;
401 return CallsEHReturn ? CSR_32EHRet_SaveList : CSR_32_SaveList;
406 assert(MF &&
"Invalid MachineFunction pointer.");
409 return CSR_64_CXX_TLS_Darwin_ViaCopy_SaveList;
417 bool HasSSE = Subtarget.
hasSSE1();
418 bool HasAVX = Subtarget.
hasAVX();
424 return CSR_NoRegs_RegMask;
427 return CSR_64_AllRegs_AVX_RegMask;
428 return CSR_64_AllRegs_RegMask;
430 return CSR_64_RT_MostRegs_RegMask;
433 return CSR_64_RT_AllRegs_AVX_RegMask;
434 return CSR_64_RT_AllRegs_RegMask;
437 return CSR_64_TLS_Darwin_RegMask;
440 if (HasAVX512 && IsWin64)
441 return CSR_Win64_Intel_OCL_BI_AVX512_RegMask;
442 if (HasAVX512 && Is64Bit)
443 return CSR_64_Intel_OCL_BI_AVX512_RegMask;
444 if (HasAVX && IsWin64)
445 return CSR_Win64_Intel_OCL_BI_AVX_RegMask;
446 if (HasAVX && Is64Bit)
447 return CSR_64_Intel_OCL_BI_AVX_RegMask;
448 if (!HasAVX && !IsWin64 && Is64Bit)
449 return CSR_64_Intel_OCL_BI_RegMask;
455 return (HasSSE ? CSR_Win64_RegCall_RegMask :
456 CSR_Win64_RegCall_NoSSE_RegMask);
458 return (HasSSE ? CSR_SysV64_RegCall_RegMask :
459 CSR_SysV64_RegCall_NoSSE_RegMask);
462 return (HasSSE ? CSR_32_RegCall_RegMask :
463 CSR_32_RegCall_NoSSE_RegMask);
466 assert(!Is64Bit &&
"CFGuard check mechanism only used on 32-bit X86");
467 return (HasSSE ? CSR_Win32_CFGuard_Check_RegMask
468 : CSR_Win32_CFGuard_Check_NoSSE_RegMask);
471 return CSR_64_MostRegs_RegMask;
474 return CSR_Win64_RegMask;
477 return CSR_32_RegMask;
478 return IsWin64 ? CSR_Win64_SwiftTail_RegMask : CSR_64_SwiftTail_RegMask;
480 return CSR_64_RegMask;
484 return CSR_64_AllRegs_AVX512_RegMask;
486 return CSR_64_AllRegs_AVX_RegMask;
488 return CSR_64_AllRegs_RegMask;
489 return CSR_64_AllRegs_NoSSE_RegMask;
492 return CSR_32_AllRegs_AVX512_RegMask;
494 return CSR_32_AllRegs_AVX_RegMask;
496 return CSR_32_AllRegs_SSE_RegMask;
497 return CSR_32_AllRegs_RegMask;
508 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError);
510 return IsWin64 ? CSR_Win64_SwiftError_RegMask : CSR_64_SwiftError_RegMask;
512 return IsWin64 ? CSR_Win64_RegMask : CSR_64_RegMask;
515 return CSR_32_RegMask;
520 return CSR_NoRegs_RegMask;
524 return CSR_64_TLS_Darwin_RegMask;
552 if (TFI->
hasFP(MF)) {
563 "Stack realignment in presence of dynamic allocas is not supported with"
564 "this calling convention.");
580 for (
unsigned n = 0; n != 8; ++n)
596 for (
unsigned n = 0; n != 8; ++n) {
607 for (
unsigned n = 16; n != 32; ++n) {
614 {X86::SIL, X86::DIL, X86::BPL, X86::SPL,
615 X86::SIH, X86::DIH, X86::BPH, X86::SPH}));
624 return TRI.isSuperOrSubRegisterEq(RegA, RegB);
630 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }) ||
631 (ST.hasMMX() && X86::VR64RegClass.contains(Reg));
640 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
645 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
650 X86::XMM3, X86::XMM4, X86::XMM5,
651 X86::XMM6, X86::XMM7},
652 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
655 return X86GenRegisterInfo::isArgumentRegister(MF, Reg);
664 if (
TRI.isSuperOrSubRegisterEq(X86::RSP, PhysReg))
669 if (TFI.
hasFP(MF) &&
TRI.isSuperOrSubRegisterEq(X86::RBP, PhysReg))
672 return X86GenRegisterInfo::isFixedRegister(MF, PhysReg);
676 return RC->
getID() == X86::TILERegClassID;
687 assert(!(Mask[X86::EFLAGS / 32] & (1U << (X86::EFLAGS % 32))) &&
688 "EFLAGS are not live-out from a patchpoint.");
691 for (
auto Reg : {X86::EFLAGS, X86::RIP, X86::EIP, X86::IP})
692 Mask[Reg / 32] &= ~(1U << (Reg % 32));
723 bool CantUseFP = hasStackRealignment(MF);
736 if (!
MRI->canReserveReg(FramePtr))
742 return MRI->canReserveReg(BasePtr);
759 unsigned Opc = II->getOpcode();
761 if ((Opc != X86::LEA32r && Opc != X86::LEA64r && Opc != X86::LEA64_32r) ||
762 MI.getOperand(2).getImm() != 1 ||
763 MI.getOperand(3).getReg() != X86::NoRegister ||
764 MI.getOperand(4).getImm() != 0 ||
765 MI.getOperand(5).getReg() != X86::NoRegister)
771 if (Opc == X86::LEA64_32r)
773 Register NewDestReg =
MI.getOperand(0).getReg();
775 MI.getParent()->getParent()->getSubtarget<
X86Subtarget>().getInstrInfo();
777 MI.getOperand(1).isKill());
778 MI.eraseFromParent();
783 switch (
MI.getOpcode()) {
785 case X86::CLEANUPRET:
794 unsigned FIOperandNum,
796 int FIOffset)
const {
798 unsigned Opc =
MI.getOpcode();
799 if (Opc == TargetOpcode::LOCAL_ESCAPE) {
805 MI.getOperand(FIOperandNum).ChangeToRegister(BaseReg,
false);
809 if (Opc == TargetOpcode::STACKMAP || Opc == TargetOpcode::PATCHPOINT) {
810 assert(BasePtr == FramePtr &&
"Expected the FP as base register");
811 int64_t
Offset =
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
812 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
816 if (
MI.getOperand(FIOperandNum + 3).isImm()) {
818 int Imm = (int)(
MI.getOperand(FIOperandNum + 3).getImm());
819 int Offset = FIOffset + Imm;
820 assert((!Is64Bit || isInt<32>((
long long)FIOffset + Imm)) &&
821 "Requesting 64-bit offset in 32-bit immediate!");
823 MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
827 FIOffset + (
uint64_t)
MI.getOperand(FIOperandNum + 3).getOffset();
828 MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
834 int SPAdj,
unsigned FIOperandNum,
843 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
849 assert((!hasStackRealignment(MF) ||
851 "Return instruction can only reference SP relative frame objects");
865 unsigned Opc =
MI.getOpcode();
866 if (Opc == TargetOpcode::LOCAL_ESCAPE) {
877 if (Opc == X86::LEA64_32r && X86::GR32RegClass.
contains(BasePtr))
882 MI.getOperand(FIOperandNum).ChangeToRegister(MachineBasePtr,
false);
884 if (BasePtr == StackPtr)
889 if (Opc == TargetOpcode::STACKMAP || Opc == TargetOpcode::PATCHPOINT) {
890 assert(BasePtr == FramePtr &&
"Expected the FP as base register");
891 int64_t
Offset =
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
892 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
896 if (
MI.getOperand(FIOperandNum+3).isImm()) {
898 int Imm = (int)(
MI.getOperand(FIOperandNum + 3).getImm());
899 int Offset = FIOffset + Imm;
900 assert((!Is64Bit || isInt<32>((
long long)FIOffset + Imm)) &&
901 "Requesting 64-bit offset in 32-bit immediate!");
903 MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
907 (
uint64_t)
MI.getOperand(FIOperandNum+3).getOffset();
908 MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
924 switch (
MBBI->getOpcode()) {
927 case TargetOpcode::PATCHABLE_RET:
933 case X86::TCRETURNdi:
934 case X86::TCRETURNri:
935 case X86::TCRETURNmi:
936 case X86::TCRETURNdi64:
937 case X86::TCRETURNri64:
938 case X86::TCRETURNmi64:
940 case X86::EH_RETURN64: {
943 if (!MO.isReg() || MO.isDef())
952 for (
auto CS : AvailableRegs)
953 if (!
Uses.count(CS) && CS != X86::RIP && CS != X86::RSP && CS != X86::ESP)
963 return TFI->
hasFP(MF) ? FramePtr : StackPtr;
991 unsigned OpCode =
MI->getOpcode();
1003 case X86::PTILELOADDV:
1004 case X86::PTILELOADDT1V:
1005 case X86::PTDPBSSDV:
1006 case X86::PTDPBSUDV:
1007 case X86::PTDPBUSDV:
1008 case X86::PTDPBUUDV:
1009 case X86::PTILEZEROV:
1010 case X86::PTDPBF16PSV:
1011 case X86::PTDPFP16PSV:
1012 case X86::PTCMMIMFP16PSV:
1013 case X86::PTCMMRLFP16PSV:
1031 VirtReg, Order, Hints, MF, VRM,
Matrix);
1035 if ((
ID == X86::VK64RegClassID ||
ID == X86::VK64WMRegClassID) &&
1036 Subtarget.
hasAVX512() && !Subtarget.hasEVEX512())
1038 "64-bit mask registers are not supported without EVEX512");
1040 if (
ID != X86::TILERegClassID)
1041 return BaseImplRetVal;
1051 if (PhysShape == VirtShape)
1058 for (
auto Hint : CopyHints) {
1064 !
MRI->isReserved(PhysReg))
1068#define DEBUG_TYPE "tile-hint"
1070 dbgs() <<
"Hints for virtual register " <<
format_hex(VirtReg, 8) <<
"\n";
1071 for (
auto Hint : Hints) {
1072 dbgs() <<
"tmm" << Hint <<
",";
unsigned const MachineRegisterInfo * MRI
static bool isFuncletReturnInstr(const MachineInstr &MI)
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file implements the BitVector class.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
Rewrite Partial Register Uses
const HexagonInstrInfo * TII
static cl::opt< bool > EnableBasePointer("m68k-use-base-pointer", cl::Hidden, cl::init(true), cl::desc("Enable use of a base pointer for complex stack frames"))
static bool CantUseSP(const MachineFrameInfo &MFI)
unsigned const TargetRegisterInfo * TRI
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallSet class.
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
static cl::opt< bool > EnableBasePointer("x86-use-base-pointer", cl::Hidden, cl::init(true), cl::desc("Enable use of a base pointer for complex stack frames"))
static bool tryOptimizeLEAtoMOV(MachineBasicBlock::iterator II)
static ShapeT getTileShape(Register VirtReg, VirtRegMap *VRM, const MachineRegisterInfo *MRI)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, const DebugLoc &DL, MCRegister DestReg, MCRegister SrcReg, bool KillSrc) const override
Emit instructions to copy a pair of physical registers.
MCRegAliasIterator enumerates all registers aliasing Reg.
Wrapper class representing physical registers. Should be passed by value.
static constexpr unsigned NoRegister
bool isEHFuncletEntry() const
Returns true if this is the entry block of an EH funclet.
iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
bool hasOpaqueSPAdjustment() const
Returns true if the function contains opaque dynamic stack adjustments.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
bool callsEHReturn() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
void ChangeToImmediate(int64_t ImmVal, unsigned TargetFlags=0)
ChangeToImmediate - Replace this operand with a new immediate operand of the specified value.
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Wrapper class representing virtual and physical registers.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
static StackOffset getFixed(int64_t Fixed)
const TargetRegisterClass *const * sc_iterator
unsigned getID() const
Return the register class ID number.
bool contains(Register Reg) const
Return true if the specified register is included in this register class.
sc_iterator getSuperClasses() const
Returns a NULL-terminated list of super-classes.
bool hasSuperClassEq(const TargetRegisterClass *RC) const
Returns true if RC is a super-class of or equal to this class.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual bool canRealignStack(const MachineFunction &MF) const
True if the stack can be realigned for the target.
virtual bool shouldRewriteCopySrc(const TargetRegisterClass *DefRC, unsigned DefSubReg, const TargetRegisterClass *SrcRC, unsigned SrcSubReg) const
virtual bool shouldRealignStack(const MachineFunction &MF) const
True if storage within the function requires the stack pointer to be aligned more than the normal cal...
virtual bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM=nullptr, const LiveRegMatrix *Matrix=nullptr) const
Get a list of 'hint' registers that the register allocator should try first when allocating a physica...
Triple - Helper class for working with autoconf configuration names.
bool hasShape(Register virtReg) const
ShapeT getShape(Register virtReg) const
void assignVirt2Shape(Register virtReg, ShapeT shape)
bool hasFP(const MachineFunction &MF) const override
hasFP - Return true if the specified function should have a dedicated frame pointer register.
StackOffset getFrameIndexReferenceSP(const MachineFunction &MF, int FI, Register &SPReg, int Adjustment) const
StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const override
getFrameIndexReference - This method should return the base register and offset used to reference a f...
bool Is64Bit
Is64Bit implies that x86_64 instructions are available.
bool Uses64BitFramePtr
True if the 64-bit frame or stack pointer should be used.
int getWin64EHFrameIndexRef(const MachineFunction &MF, int FI, Register &SPReg) const
X86MachineFunctionInfo - This class is derived from MachineFunction and contains private X86 target-s...
bool hasPreallocatedCall() const
MachineInstr * getStackPtrSaveMI() const
const TargetRegisterClass * getPointerRegClass(const MachineFunction &MF, unsigned Kind=0) const override
getPointerRegClass - Returns a TargetRegisterClass used for pointer values.
unsigned getPtrSizedFrameRegister(const MachineFunction &MF) const
bool hasBasePointer(const MachineFunction &MF) const
const MCPhysReg * getCalleeSavedRegsViaCopy(const MachineFunction *MF) const
const TargetRegisterClass * getGPRsForTailCall(const MachineFunction &MF) const
getGPRsForTailCall - Returns a register class with registers that can be used in forming tail calls.
bool canRealignStack(const MachineFunction &MF) const override
BitVector getReservedRegs(const MachineFunction &MF) const override
getReservedRegs - Returns a bitset indexed by physical register number indicating if a register is a ...
bool shouldRealignStack(const MachineFunction &MF) const override
Register getFrameRegister(const MachineFunction &MF) const override
unsigned findDeadCallerSavedReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI) const
findDeadCallerSavedReg - Return a caller-saved register that isn't live when it reaches the "return" ...
const uint32_t * getDarwinTLSCallPreservedMask() const
bool isTileRegisterClass(const TargetRegisterClass *RC) const
Return true if it is tile register class.
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID) const override
bool isArgumentRegister(const MachineFunction &MF, MCRegister Reg) const override
isArgumentReg - Returns true if Reg can be used as an argument to a function.
Register getStackRegister() const
const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC, const MachineFunction &MF) const override
const TargetRegisterClass * getMatchingSuperRegClass(const TargetRegisterClass *A, const TargetRegisterClass *B, unsigned Idx) const override
getMatchingSuperRegClass - Return a subclass of the specified register class A so that each register ...
unsigned getRegPressureLimit(const TargetRegisterClass *RC, MachineFunction &MF) const override
unsigned getPtrSizedStackRegister(const MachineFunction &MF) const
int getSEHRegNum(unsigned i) const
bool shouldRewriteCopySrc(const TargetRegisterClass *DefRC, unsigned DefSubReg, const TargetRegisterClass *SrcRC, unsigned SrcSubReg) const override
const TargetRegisterClass * getCrossCopyRegClass(const TargetRegisterClass *RC) const override
getCrossCopyRegClass - Returns a legal register class to copy a register in the specified class to or...
X86RegisterInfo(const Triple &TT)
Register getBaseRegister() const
bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM, const LiveRegMatrix *Matrix) const override
void eliminateFrameIndex(MachineBasicBlock::iterator II, unsigned FIOperandNum, Register BaseReg, int FIOffset) const
const uint32_t * getNoPreservedMask() const override
bool isFixedRegister(const MachineFunction &MF, MCRegister PhysReg) const override
Returns true if PhysReg is a fixed register.
const TargetRegisterClass * getSubClassWithSubReg(const TargetRegisterClass *RC, unsigned Idx) const override
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
getCalleeSavedRegs - Return a null-terminated list of all of the callee-save registers on this target...
void adjustStackMapLiveOutMask(uint32_t *Mask) const override
const X86TargetLowering * getTargetLowering() const override
bool isTarget64BitILP32() const
Is this x86_64 with the ILP32 programming model (x32 ABI)?
bool isTarget64BitLP64() const
Is this x86_64 with the LP64 programming model (standard AMD64, no x32)?
bool supportSwiftError() const override
Return true if the target supports swifterror attribute.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ X86_64_SysV
The C convention as specified in the x86-64 supplement to the System V ABI, used on most non-Windows ...
@ HiPE
Used by the High-Performance Erlang Compiler (HiPE).
@ CFGuard_Check
Special calling convention on Windows for calling the Control Guard Check ICall funtion.
@ PreserveMost
Used for runtime calls that preserves most registers.
@ AnyReg
Used for dynamic register based calls (e.g.
@ CXX_FAST_TLS
Used for access functions.
@ X86_INTR
x86 hardware interrupt context.
@ GHC
Used by the Glasgow Haskell Compiler (GHC).
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
@ PreserveAll
Used for runtime calls that preserves (almost) all registers.
@ Intel_OCL_BI
Used for Intel OpenCL built-ins.
@ Win64
The C convention as implemented on Windows/x86-64 and AArch64.
@ SwiftTail
This follows the Swift calling convention in how arguments are passed but guarantees tail calls will ...
@ X86_RegCall
Register calling convention used for parameters transfer optimization.
void initLLVMToSEHAndCVRegMapping(MCRegisterInfo *MRI)
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
MCRegister getX86SubSuperRegister(MCRegister Reg, unsigned Size, bool High=false)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
FormattedNumber format_hex(uint64_t N, unsigned Width, bool Upper=false)
format_hex - Output N as a fixed width hexadecimal.