38#define GET_REGINFO_TARGET_DESC
39#include "X86GenRegisterInfo.inc"
45 (TT.isX86_64() ?
X86::RIP :
X86::EIP)) {
49 Is64Bit = TT.isX86_64();
50 IsTarget64BitLP64 = Is64Bit && !TT.isX32();
51 IsWin64 = Is64Bit && TT.isOSWindows();
52 IsUEFI64 = Is64Bit && TT.isUEFI();
62 bool Use64BitReg = !TT.isX32();
63 StackPtr = Use64BitReg ? X86::RSP : X86::ESP;
64 FramePtr = Use64BitReg ? X86::RBP : X86::EBP;
65 BasePtr = Use64BitReg ? X86::RBX : X86::EBX;
79 if (!Is64Bit && Idx == X86::sub_8bit)
80 Idx = X86::sub_8bit_hi;
83 return X86GenRegisterInfo::getSubClassWithSubReg(RC, Idx);
89 unsigned SubIdx)
const {
91 if (!Is64Bit && SubIdx == X86::sub_8bit) {
92 A = X86GenRegisterInfo::getSubClassWithSubReg(
A, X86::sub_8bit_hi);
96 return X86GenRegisterInfo::getMatchingSuperRegClass(
A,
B, SubIdx);
110 if (RC == &X86::GR8_NOREXRegClass)
123 switch (Super->
getID()) {
124 case X86::FR32RegClassID:
125 case X86::FR64RegClassID:
128 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
131 case X86::VR128RegClassID:
132 case X86::VR256RegClassID:
134 if (!Subtarget.hasVLX() &&
135 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
138 case X86::VR128XRegClassID:
139 case X86::VR256XRegClassID:
141 if (Subtarget.hasVLX() &&
142 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
145 case X86::FR32XRegClassID:
146 case X86::FR64XRegClassID:
149 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
152 case X86::GR8RegClassID:
153 case X86::GR16RegClassID:
154 case X86::GR32RegClassID:
155 case X86::GR64RegClassID:
156 case X86::GR8_NOREX2RegClassID:
157 case X86::GR16_NOREX2RegClassID:
158 case X86::GR32_NOREX2RegClassID:
159 case X86::GR64_NOREX2RegClassID:
160 case X86::RFP32RegClassID:
161 case X86::RFP64RegClassID:
162 case X86::RFP80RegClassID:
163 case X86::VR512_0_15RegClassID:
164 case X86::VR512RegClassID:
167 if (getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
182 if (RC == &X86::CCRRegClass) {
184 return &X86::GR64RegClass;
186 return &X86::GR32RegClass;
196 unsigned FPDiff = TFI->
hasFP(MF) ? 1 : 0;
197 switch (RC->
getID()) {
200 case X86::GR32RegClassID:
202 case X86::GR64RegClassID:
204 case X86::VR128RegClassID:
205 return Is64Bit ? 10 : 4;
206 case X86::VR64RegClassID:
213 assert(MF &&
"MachineFunction required");
217 bool HasSSE = Subtarget.
hasSSE1();
218 bool HasAVX = Subtarget.
hasAVX();
220 bool HasEGPR = Subtarget.hasEGPR();
233 return CSR_NoRegs_SaveList;
238 return CSR_NoRegs_SaveList;
241 return CSR_64_AllRegs_AVX_SaveList;
242 return CSR_64_AllRegs_SaveList;
245 return HasEGPR ? CSR_Win64_APX_RT_MostRegs_SaveList
246 : CSR_Win64_RT_MostRegs_SaveList;
247 return CSR_64_RT_MostRegs_SaveList;
250 return CSR_64_RT_AllRegs_AVX_SaveList;
251 return CSR_64_RT_AllRegs_SaveList;
253 return CSR_64_NoneRegs_SaveList;
257 CSR_64_CXX_TLS_Darwin_PE_SaveList : CSR_64_TLS_Darwin_SaveList;
260 if (HasAVX512 && IsWin64)
261 return HasEGPR ? CSR_Win64_APX_Intel_OCL_BI_AVX512_SaveList
262 : CSR_Win64_Intel_OCL_BI_AVX512_SaveList;
263 if (HasAVX512 && Is64Bit)
264 return CSR_64_Intel_OCL_BI_AVX512_SaveList;
265 if (HasAVX && IsWin64)
266 return HasEGPR ? CSR_Win64_APX_Intel_OCL_BI_AVX_SaveList
267 : CSR_Win64_Intel_OCL_BI_AVX_SaveList;
268 if (HasAVX && Is64Bit)
269 return CSR_64_Intel_OCL_BI_AVX_SaveList;
270 if (!HasAVX && !IsWin64 && Is64Bit)
271 return CSR_64_Intel_OCL_BI_SaveList;
278 return HasEGPR ? CSR_Win64_APX_RegCall_SaveList
279 : CSR_Win64_RegCall_SaveList;
280 return CSR_Win64_RegCall_NoSSE_SaveList;
282 return HasSSE ? CSR_SysV64_RegCall_SaveList
283 : CSR_SysV64_RegCall_NoSSE_SaveList;
285 return HasSSE ? CSR_32_RegCall_SaveList : CSR_32_RegCall_NoSSE_SaveList;
287 assert(!Is64Bit &&
"CFGuard check mechanism only used on 32-bit X86");
288 return HasSSE ? CSR_Win32_CFGuard_Check_SaveList
289 : CSR_Win32_CFGuard_Check_NoSSE_SaveList;
292 return CSR_64_MostRegs_SaveList;
296 return HasEGPR ? CSR_Win64_APX_SaveList : CSR_Win64_SaveList;
297 return CSR_Win64_NoSSE_SaveList;
300 return CSR_32_SaveList;
302 return HasEGPR ? CSR_Win64_APX_SwiftTail_SaveList
303 : CSR_Win64_SwiftTail_SaveList;
304 return CSR_64_SwiftTail_SaveList;
307 return CSR_64EHRet_SaveList;
308 return CSR_64_SaveList;
312 return CSR_64_AllRegs_AVX512_SaveList;
314 return CSR_64_AllRegs_AVX_SaveList;
316 return CSR_64_AllRegs_SaveList;
317 return CSR_64_AllRegs_NoSSE_SaveList;
320 return CSR_32_AllRegs_AVX512_SaveList;
322 return CSR_32_AllRegs_AVX_SaveList;
324 return CSR_32_AllRegs_SSE_SaveList;
325 return CSR_32_AllRegs_SaveList;
332 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError);
335 return HasEGPR ? CSR_Win64_APX_SwiftError_SaveList
336 : CSR_Win64_SwiftError_SaveList;
337 return CSR_64_SwiftError_SaveList;
340 if (IsWin64 || IsUEFI64) {
342 return HasEGPR ? CSR_Win64_APX_SaveList : CSR_Win64_SaveList;
343 return CSR_Win64_NoSSE_SaveList;
346 return CSR_64EHRet_SaveList;
347 return CSR_64_SaveList;
350 return CallsEHReturn ? CSR_32EHRet_SaveList : CSR_32_SaveList;
355 return Is64Bit ? CSR_IPRA_64_SaveList : CSR_IPRA_32_SaveList;
360 assert(MF &&
"Invalid MachineFunction pointer.");
363 return CSR_64_CXX_TLS_Darwin_ViaCopy_SaveList;
371 bool HasSSE = Subtarget.
hasSSE1();
372 bool HasAVX = Subtarget.
hasAVX();
374 bool HasEGPR = Subtarget.hasEGPR();
379 return CSR_NoRegs_RegMask;
382 return CSR_64_AllRegs_AVX_RegMask;
383 return CSR_64_AllRegs_RegMask;
386 return HasEGPR ? CSR_Win64_APX_RT_MostRegs_RegMask
387 : CSR_Win64_RT_MostRegs_RegMask;
388 return CSR_64_RT_MostRegs_RegMask;
391 return CSR_64_RT_AllRegs_AVX_RegMask;
392 return CSR_64_RT_AllRegs_RegMask;
394 return CSR_64_NoneRegs_RegMask;
397 return CSR_64_TLS_Darwin_RegMask;
400 if (HasAVX512 && IsWin64)
401 return HasEGPR ? CSR_Win64_APX_Intel_OCL_BI_AVX512_RegMask
402 : CSR_Win64_Intel_OCL_BI_AVX512_RegMask;
403 if (HasAVX512 && Is64Bit)
404 return CSR_64_Intel_OCL_BI_AVX512_RegMask;
405 if (HasAVX && IsWin64)
406 return HasEGPR ? CSR_Win64_APX_Intel_OCL_BI_AVX_RegMask
407 : CSR_Win64_Intel_OCL_BI_AVX_RegMask;
408 if (HasAVX && Is64Bit)
409 return CSR_64_Intel_OCL_BI_AVX_RegMask;
410 if (!HasAVX && !IsWin64 && Is64Bit)
411 return CSR_64_Intel_OCL_BI_RegMask;
418 return HasEGPR ? CSR_Win64_APX_RegCall_RegMask
419 : CSR_Win64_RegCall_RegMask;
420 return CSR_Win64_RegCall_NoSSE_RegMask;
422 return HasSSE ? CSR_SysV64_RegCall_RegMask
423 : CSR_SysV64_RegCall_NoSSE_RegMask;
425 return HasSSE ? CSR_32_RegCall_RegMask : CSR_32_RegCall_NoSSE_RegMask;
429 return HasEGPR ? CSR_Win64_APX_CFGuard_Check_RegMask
430 : CSR_Win64_CFGuard_Check_RegMask;
431 return CSR_Win64_CFGuard_Check_NoSSE_RegMask;
433 return HasSSE ? CSR_Win32_CFGuard_Check_RegMask
434 : CSR_Win32_CFGuard_Check_NoSSE_RegMask;
437 return CSR_64_MostRegs_RegMask;
440 return HasEGPR ? CSR_Win64_APX_RegMask : CSR_Win64_RegMask;
443 return CSR_32_RegMask;
445 return HasEGPR ? CSR_Win64_APX_SwiftTail_RegMask
446 : CSR_Win64_SwiftTail_RegMask;
447 return CSR_64_SwiftTail_RegMask;
449 return CSR_64_RegMask;
453 return CSR_64_AllRegs_AVX512_RegMask;
455 return CSR_64_AllRegs_AVX_RegMask;
457 return CSR_64_AllRegs_RegMask;
458 return CSR_64_AllRegs_NoSSE_RegMask;
461 return CSR_32_AllRegs_AVX512_RegMask;
463 return CSR_32_AllRegs_AVX_RegMask;
465 return CSR_32_AllRegs_SSE_RegMask;
466 return CSR_32_AllRegs_RegMask;
476 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError);
479 return HasEGPR ? CSR_Win64_APX_SwiftError_RegMask
480 : CSR_Win64_SwiftError_RegMask;
481 return CSR_64_SwiftError_RegMask;
484 if (IsWin64 || IsUEFI64)
485 return HasEGPR ? CSR_Win64_APX_RegMask : CSR_Win64_RegMask;
486 return CSR_64_RegMask;
489 return CSR_32_RegMask;
494 return CSR_NoRegs_RegMask;
498 return CSR_64_TLS_Darwin_RegMask;
515 for (
const MCPhysReg &SubReg : subregs_inclusive(X86::RSP))
522 if (ST.hasUserReservedRegisters()) {
525 for (
unsigned Reg = X86::R8; Reg <= X86::R15; ++Reg)
526 if (ST.isRegisterReservedByUser(Reg))
527 for (
const MCPhysReg &SubReg : subregs_inclusive(Reg))
530 for (
unsigned Reg = X86::R16; Reg <= X86::R31; ++Reg)
531 if (ST.isRegisterReservedByUser(Reg))
532 for (
const MCPhysReg &SubReg : subregs_inclusive(Reg))
535 if (ST.isRegisterReservedByUser(X86::EDI))
536 for (
const MCPhysReg &SubReg : sub_and_superregs_inclusive(X86::EDI))
542 for (
const MCPhysReg &SubReg : subregs_inclusive(X86::RIP))
550 "Frame pointer clobbered by function invoke is not supported.");
552 for (
const MCPhysReg &SubReg : subregs_inclusive(X86::RBP))
560 "Stack realignment in presence of dynamic "
561 "allocas is not supported with "
562 "this calling convention.");
565 for (
const MCPhysReg &SubReg : subregs_inclusive(BasePtr))
578 for (
unsigned n = 0; n != 8; ++n)
583 if (ST.useSoftFloat() || !ST.hasX87())
584 for (
unsigned n = 0; n != 7; ++n)
600 for (
unsigned n = 0; n != 8; ++n) {
611 for (
unsigned n = 0; n != 16; ++n) {
620 Reserved.set(X86::R16, X86::R31WH + 1);
626 unsigned NumReservedCSRs = 0;
627 for (
unsigned Reg = X86::R16; Reg <= X86::R31; ++Reg)
628 if (isCalleeSavedPhysReg(Reg, MF)) {
630 for (
const MCPhysReg &SubReg : subregs_inclusive(Reg))
633 if (NumReservedCSRs &&
634 MF.
size() > ST.getCLOpts().setjmp_csr_warning_threshold &&
638 " callee-saved register(s) reserved due to setjmp in '" +
640 "'; this may impact performance in large functions");
662 {X86::SIL, X86::DIL, X86::BPL, X86::SPL,
663 X86::SIH, X86::DIH, X86::BPH, X86::SPH}));
679 static_assert((X86::R15WH + 1 == X86::YMM0) && (X86::YMM15 + 1 == X86::K0) &&
680 (X86::K6_K7 + 1 == X86::TMMCFG) &&
681 (X86::TMM7 + 1 == X86::R16) &&
682 (X86::R31WH + 1 == X86::NUM_TARGET_REGS),
683 "Register number may be incorrect");
687 return X86::NUM_TARGET_REGS;
689 return X86::TMM7 + 1;
691 return X86::K6_K7 + 1;
693 return X86::YMM15 + 1;
694 return X86::R15WH + 1;
702 return TRI.isSuperOrSubRegisterEq(RegA, RegB);
708 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }) ||
709 (ST.hasMMX() && X86::VR64RegClass.contains(Reg));
718 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
723 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
728 X86::XMM3, X86::XMM4, X86::XMM5,
729 X86::XMM6, X86::XMM7},
730 [&](
MCRegister &RegA) { return IsSubReg(RegA, Reg); }))
733 return X86GenRegisterInfo::isArgumentRegister(MF, Reg);
742 if (
TRI.isSuperOrSubRegisterEq(X86::RSP, PhysReg))
747 if (TFI.
hasFP(MF) &&
TRI.isSuperOrSubRegisterEq(X86::RBP, PhysReg))
750 return X86GenRegisterInfo::isFixedRegister(MF, PhysReg);
754 return RC->
getID() == X86::TILERegClassID;
765 assert(!(Mask[X86::EFLAGS / 32] & (1U << (X86::EFLAGS % 32))) &&
766 "EFLAGS are not live-out from a patchpoint.");
769 for (
auto Reg : {X86::EFLAGS, X86::RIP, X86::EIP, X86::IP})
770 Mask[Reg / 32] &= ~(1U << (Reg % 32));
801 bool CantUseFP = hasStackRealignment(MF);
837 unsigned Opc =
II->getOpcode();
839 if ((
Opc != X86::LEA32r &&
Opc != X86::LEA64r &&
Opc != X86::LEA64_32r) ||
840 MI.getOperand(2).getImm() != 1 ||
841 MI.getOperand(3).getReg() != X86::NoRegister ||
842 MI.getOperand(4).getImm() != 0 ||
843 MI.getOperand(5).getReg() != X86::NoRegister)
849 if (
Opc == X86::LEA64_32r)
851 Register NewDestReg =
MI.getOperand(0).getReg();
853 MI.getParent()->getParent()->getSubtarget<
X86Subtarget>().getInstrInfo();
854 TII->copyPhysReg(*
MI.getParent(),
II,
MI.getDebugLoc(), NewDestReg, BasePtr,
855 MI.getOperand(1).isKill());
856 MI.eraseFromParent();
861 switch (
MI.getOpcode()) {
863 case X86::CLEANUPRET:
872 unsigned FIOperandNum,
874 int FIOffset)
const {
876 unsigned Opc =
MI.getOpcode();
877 if (
Opc == TargetOpcode::LOCAL_ESCAPE) {
883 MI.getOperand(FIOperandNum).ChangeToRegister(BaseReg,
false);
887 if (
Opc == TargetOpcode::STACKMAP ||
Opc == TargetOpcode::PATCHPOINT) {
888 assert(BasePtr == FramePtr &&
"Expected the FP as base register");
889 int64_t
Offset =
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
890 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
894 if (
MI.getOperand(FIOperandNum + 3).isImm()) {
896 int Imm = (int)(
MI.getOperand(FIOperandNum + 3).getImm());
899 "Requesting 64-bit offset in 32-bit immediate!");
901 MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
905 FIOffset + (uint64_t)
MI.getOperand(FIOperandNum + 3).getOffset();
906 MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
912 int SPAdj,
unsigned FIOperandNum,
921 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
927 assert((!hasStackRealignment(MF) ||
929 "Return instruction can only reference SP relative frame objects");
932 }
else if (TFI->
Is64Bit && (
MBB.isEHFuncletEntry() || IsEHFuncletEpilogue)) {
943 unsigned Opc =
MI.getOpcode();
944 if (
Opc == TargetOpcode::LOCAL_ESCAPE) {
955 if (
Opc == X86::LEA64_32r && X86::GR32RegClass.
contains(BasePtr))
960 MI.getOperand(FIOperandNum).ChangeToRegister(MachineBasePtr,
false);
962 if (BasePtr == StackPtr)
967 if (
Opc == TargetOpcode::STACKMAP ||
Opc == TargetOpcode::PATCHPOINT) {
968 assert(BasePtr == FramePtr &&
"Expected the FP as base register");
969 int64_t
Offset =
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
970 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
974 if (
MI.getOperand(FIOperandNum+3).isImm()) {
977 int64_t
Imm =
MI.getOperand(FIOperandNum + 3).getImm();
982 if (Is64Bit && !FitsIn32Bits) {
983 assert(RS &&
"RegisterScavenger was NULL");
985 RS->enterBasicBlockEnd(
MBB);
986 RS->backward(std::next(
II));
988 Register ScratchReg = RS->scavengeRegisterBackwards(
989 X86::GR64RegClass,
II,
false, 0,
991 assert(ScratchReg != 0 &&
"scratch reg was 0");
992 RS->setRegUsed(ScratchReg);
996 MI.getOperand(FIOperandNum + 3).setImm(0);
997 if (
MI.getOperand(FIOperandNum + 2).getReg() == X86::NoRegister) {
998 MI.getOperand(FIOperandNum + 2).setReg(ScratchReg);
1007 .
addReg(X86::NoRegister);
1008 MI.getOperand(FIOperandNum).setReg(ScratchReg);
1015 if (!Is64Bit && !FitsIn32Bits) {
1016 MI.emitGenericError(
"64-bit offset calculated but target is 32-bit");
1023 MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
1026 uint64_t
Offset = FIOffset +
1027 (uint64_t)
MI.getOperand(FIOperandNum+3).getOffset();
1028 MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
1043 switch (
MBBI->getOpcode()) {
1046 case TargetOpcode::PATCHABLE_RET:
1052 case X86::TCRETURNdi:
1053 case X86::TCRETURNri:
1054 case X86::TCRETURN_WIN64ri:
1055 case X86::TCRETURN_HIPE32ri:
1056 case X86::TCRETURNmi:
1057 case X86::TCRETURNdi64:
1058 case X86::TCRETURNri64:
1059 case X86::TCRETURNri64_ImpCall:
1060 case X86::TCRETURNmi64:
1061 case X86::TCRETURN_WINmi64:
1062 case X86::EH_RETURN:
1063 case X86::EH_RETURN64: {
1069 Is64Bit ? X86::GR64_NOSPRegClass : X86::GR32_NOSPRegClass;
1082 return TFI->
hasFP(MF) ? FramePtr : StackPtr;
1110 unsigned OpCode =
MI->getOpcode();
1116 Register SrcReg =
MI->getOperand(1).getReg();
1122 case X86::PTILELOADDV:
1123 case X86::PTILELOADDT1V:
1124 case X86::PTDPBSSDV:
1125 case X86::PTDPBSUDV:
1126 case X86::PTDPBUSDV:
1127 case X86::PTDPBUUDV:
1128 case X86::PTILEZEROV:
1129 case X86::PTDPBF16PSV:
1130 case X86::PTDPFP16PSV:
1131 case X86::PTCMMIMFP16PSV:
1132 case X86::PTCMMRLFP16PSV:
1133 case X86::PTILELOADDRSV:
1134 case X86::PTILELOADDRST1V:
1135 case X86::PTDPBF8PSV:
1136 case X86::PTDPBHF8PSV:
1137 case X86::PTDPHBF8PSV:
1138 case X86::PTDPHF8PSV: {
1141 ShapeT Shape(&MO1, &MO2, MRI);
1155 VirtReg, Order, Hints, MF, VRM,
Matrix);
1159 unsigned ID = RC.
getID();
1162 return BaseImplRetVal;
1164 if (ID != X86::TILERegClassID) {
1165 if (ST.getCLOpts().disable_regalloc_hints_for_ndd || !ST.hasNDD() ||
1166 !
TRI.isGeneralPurposeRegisterClass(&RC))
1167 return BaseImplRetVal;
1176 TwoAddrHints.
insert(PhysReg);
1185 unsigned OpIdx =
MI.getOperandNo(&MO);
1188 TryAddNDDHint(
MI.getOperand(1));
1189 if (
MI.isCommutable()) {
1191 TryAddNDDHint(
MI.getOperand(2));
1193 }
else if (OpIdx == 1) {
1194 TryAddNDDHint(
MI.getOperand(0));
1195 }
else if (
MI.isCommutable() && OpIdx == 2) {
1196 TryAddNDDHint(
MI.getOperand(0));
1201 if (TwoAddrHints.
count(OrderReg))
1204 return BaseImplRetVal;
1215 if (PhysShape == VirtShape)
1221 for (
auto Hint : CopyHints) {
1231#define DEBUG_TYPE "tile-hint"
1233 dbgs() <<
"Hints for virtual register " <<
format_hex(VirtReg, 8) <<
"\n";
1234 for (
auto Hint : Hints) {
1235 dbgs() <<
"tmm" << Hint <<
",";
1246 switch (RC->
getID()) {
1249 case X86::GR8RegClassID:
1250 return &X86::GR8_NOREX2RegClass;
1251 case X86::GR16RegClassID:
1252 return &X86::GR16_NOREX2RegClass;
1253 case X86::GR32RegClassID:
1254 return &X86::GR32_NOREX2RegClass;
1255 case X86::GR64RegClassID:
1256 return &X86::GR64_NOREX2RegClass;
1257 case X86::GR32_NOSPRegClassID:
1258 return &X86::GR32_NOREX2_NOSPRegClass;
1259 case X86::GR64_NOSPRegClassID:
1260 return &X86::GR64_NOREX2_NOSPRegClass;
1265 switch (RC->
getID()) {
1268 case X86::GR8_NOREX2RegClassID:
1269 case X86::GR16_NOREX2RegClassID:
1270 case X86::GR32_NOREX2RegClassID:
1271 case X86::GR64_NOREX2RegClassID:
1272 case X86::GR32_NOREX2_NOSPRegClassID:
1273 case X86::GR64_NOREX2_NOSPRegClassID:
1274 case X86::GR64_with_sub_16bit_in_GR16_NOREX2RegClassID:
1282 if (ST.is64Bit() && ST.hasPPX())
static const TargetRegisterClass * getRegClass(const MachineInstr &MI, Register Reg)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
const HexagonInstrInfo * TII
static bool CantUseSP(const MachineFrameInfo &MFI)
Register const TargetRegisterInfo * TRI
Promote Memory to Register
uint64_t IntrinsicInst * II
This file declares the machine register scavenger class.
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
This file defines the SmallSet class.
static bool tryOptimizeLEAtoMOV(MachineBasicBlock::iterator II)
static ShapeT getTileShape(Register VirtReg, VirtRegMap *VRM, const MachineRegisterInfo *MRI)
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.
A set of register units used to track register liveness.
bool available(MCRegister Reg) const
Returns true if no part of physical register Reg is live.
LLVM_ABI void stepBackward(const MachineInstr &MI)
Updates liveness when stepping backwards over the instruction MI.
LLVM_ABI void addLiveOuts(const MachineBasicBlock &MBB)
Adds registers living out of block MBB.
LLVM_ABI void reportWarning(SMLoc L, const Twine &Msg)
LLVM_ABI void reportError(SMLoc L, const Twine &Msg)
MCRegAliasIterator enumerates all registers aliasing Reg.
ArrayRef< unsigned > superclasses() const
Returns a list of super-classes.
unsigned getID() const
getID() - Return the register class ID number.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
Wrapper class representing physical registers. Should be passed by value.
static constexpr unsigned NoRegister
MachineInstrBundleIterator< MachineInstr > iterator
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.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
bool exposesReturnsTwice() const
exposesReturnsTwice - Returns true if the function calls setjmp or any other similar functions with a...
bool framePointerIsReserved() const
Returns true if the frame pointer must always either point to a new frame record or be un-modified in...
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MCContext & getContext() const
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...
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
LLVM_ABI void ChangeToImmediate(int64_t ImmVal, unsigned TargetFlags=0)
ChangeToImmediate - Replace this operand with a new immediate operand of the specified value.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
bool isReserved(MCRegister PhysReg) const
isReserved - Returns true when PhysReg is a reserved register.
def_iterator def_begin(Register RegNo) const
bool reservedRegsFrozen() const
reservedRegsFrozen - Returns true after freezeReservedRegs() was called to ensure the set of reserved...
bool canReserveReg(MCRegister PhysReg) const
canReserveReg - Returns true if PhysReg can be used as a reserved register.
iterator_range< reg_nodbg_iterator > reg_nodbg_operands(Register Reg) const
Wrapper class representing virtual and physical registers.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Represents a location in source code.
bool contains(const_arg_type key) const
Check if the SetVector contains the given key.
void clear()
Completely clear the SetVector.
bool insert(const value_type &X)
Insert a new element into the SetVector.
A SetVector that performs no allocations if smaller than a certain size.
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 is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
static StackOffset getFixed(int64_t Fixed)
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
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 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, SmallSetVector< MCPhysReg, 16 > &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.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
bool hasShape(Register virtReg) const
ShapeT getShape(Register virtReg) const
MCRegister getPhys(Register virtReg) const
returns the physical register mapped to the specified virtual register
void assignVirt2Shape(Register virtReg, ShapeT shape)
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.
int getWin64EHFrameIndexRef(const MachineFunction &MF, int FI, Register &SPReg) const
X86MachineFunctionInfo - This class is derived from MachineFunction and contains private X86 target-s...
bool getBPClobberedByInvoke() const
bool hasPreallocatedCall() const
MachineInstr * getStackPtrSaveMI() const
bool getFPClobberedByInvoke() const
bool hasBasePointer(const MachineFunction &MF) const
const MCPhysReg * getCalleeSavedRegsViaCopy(const MachineFunction *MF) const
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 ...
Register getPtrSizedFrameRegister(const MachineFunction &MF) const
bool shouldRealignStack(const MachineFunction &MF) const override
unsigned getNumSupportedRegs(const MachineFunction &MF) const override
Return the number of registers for the function.
const MCPhysReg * getIPRACSRegs(const MachineFunction *MF) const override
getIPRACSRegs - This API can be removed when rbp is safe to optimized out when IPRA is on.
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.
bool isNonRex2RegClass(const TargetRegisterClass *RC) const
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID) const override
Register getPtrSizedStackRegister(const MachineFunction &MF) const
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
unsigned getCSRFirstUseCost(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
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)
const TargetRegisterClass * constrainRegClassToNonRex2(const TargetRegisterClass *RC) const
Register getBaseRegister() const
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.
bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallSetVector< MCPhysReg, 16 > &Hints, const MachineFunction &MF, const VirtRegMap *VRM, const LiveRegMatrix *Matrix) const override
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)?
const X86Options & getCLOpts() const
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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ 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
OBSOLETED - Used for stack based JavaScript calls.
@ 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.
@ PreserveNone
Used for runtime calls that preserves none general registers.
@ 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 ...
@ GRAAL
Used by GraalVM. Two additional registers are reserved.
@ X86_RegCall
Register calling convention used for parameters transfer optimization.
void initLLVMToSEHAndCVRegMapping(MCRegisterInfo *MRI)
Define some predicates that are used for node matching.
unsigned getNonNDVariant(unsigned Opc)
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
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.
static bool isFuncletReturnInstr(const MachineInstr &MI)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
FormattedNumber format_hex(uint64_t N, unsigned Width, bool Upper=false)
format_hex - Output N as a fixed width hexadecimal.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
MCRegisterClass TargetRegisterClass