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:
135 getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
138 case X86::VR128XRegClassID:
139 case X86::VR256XRegClassID:
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");
233 return CSR_NoRegs_SaveList;
238 return CSR_NoRegs_SaveList;
241 return HasEGPR ? CSR_64_APX_AllRegs_AVX_SaveList
242 : CSR_64_AllRegs_AVX_SaveList;
243 return HasEGPR ? CSR_64_APX_AllRegs_SaveList : CSR_64_AllRegs_SaveList;
246 return HasEGPR ? CSR_Win64_APX_RT_MostRegs_SaveList
247 : CSR_Win64_RT_MostRegs_SaveList;
248 return CSR_64_RT_MostRegs_SaveList;
251 return CSR_64_RT_AllRegs_AVX_SaveList;
252 return CSR_64_RT_AllRegs_SaveList;
254 return CSR_64_NoneRegs_SaveList;
258 CSR_64_CXX_TLS_Darwin_PE_SaveList : CSR_64_TLS_Darwin_SaveList;
261 if (HasAVX512 && IsWin64)
262 return HasEGPR ? CSR_Win64_APX_Intel_OCL_BI_AVX512_SaveList
263 : CSR_Win64_Intel_OCL_BI_AVX512_SaveList;
264 if (HasAVX512 && Is64Bit)
265 return CSR_64_Intel_OCL_BI_AVX512_SaveList;
266 if (HasAVX && IsWin64)
267 return HasEGPR ? CSR_Win64_APX_Intel_OCL_BI_AVX_SaveList
268 : CSR_Win64_Intel_OCL_BI_AVX_SaveList;
269 if (HasAVX && Is64Bit)
270 return CSR_64_Intel_OCL_BI_AVX_SaveList;
271 if (!HasAVX && !IsWin64 && Is64Bit)
272 return CSR_64_Intel_OCL_BI_SaveList;
279 return HasEGPR ? CSR_Win64_APX_RegCall_SaveList
280 : CSR_Win64_RegCall_SaveList;
281 return CSR_Win64_RegCall_NoSSE_SaveList;
283 return HasSSE ? CSR_SysV64_RegCall_SaveList
284 : CSR_SysV64_RegCall_NoSSE_SaveList;
286 return HasSSE ? CSR_32_RegCall_SaveList : CSR_32_RegCall_NoSSE_SaveList;
288 assert(!Is64Bit &&
"CFGuard check mechanism only used on 32-bit X86");
289 return HasSSE ? CSR_Win32_CFGuard_Check_SaveList
290 : CSR_Win32_CFGuard_Check_NoSSE_SaveList;
293 return CSR_64_MostRegs_SaveList;
297 return HasEGPR ? CSR_Win64_APX_SaveList : CSR_Win64_SaveList;
298 return CSR_Win64_NoSSE_SaveList;
301 return CSR_32_SaveList;
303 return HasEGPR ? CSR_Win64_APX_SwiftTail_SaveList
304 : CSR_Win64_SwiftTail_SaveList;
305 return CSR_64_SwiftTail_SaveList;
308 return CSR_64EHRet_SaveList;
309 return CSR_64_SaveList;
313 return HasEGPR ? CSR_64_APX_AllRegs_AVX512_SaveList
314 : CSR_64_AllRegs_AVX512_SaveList;
316 return HasEGPR ? CSR_64_APX_AllRegs_AVX_SaveList
317 : CSR_64_AllRegs_AVX_SaveList;
319 return HasEGPR ? CSR_64_APX_AllRegs_SaveList : CSR_64_AllRegs_SaveList;
320 return HasEGPR ? CSR_64_APX_AllRegs_NoSSE_SaveList
321 : CSR_64_AllRegs_NoSSE_SaveList;
324 return CSR_32_AllRegs_AVX512_SaveList;
326 return CSR_32_AllRegs_AVX_SaveList;
328 return CSR_32_AllRegs_SSE_SaveList;
329 return CSR_32_AllRegs_SaveList;
335 bool IsSwiftCC =
Subtarget.getTargetLowering()->supportSwiftError() &&
336 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError);
339 return HasEGPR ? CSR_Win64_APX_SwiftError_SaveList
340 : CSR_Win64_SwiftError_SaveList;
341 return CSR_64_SwiftError_SaveList;
344 if (IsWin64 || IsUEFI64) {
346 return HasEGPR ? CSR_Win64_APX_SaveList : CSR_Win64_SaveList;
347 return CSR_Win64_NoSSE_SaveList;
350 return CSR_64EHRet_SaveList;
351 return CSR_64_SaveList;
354 return CallsEHReturn ? CSR_32EHRet_SaveList : CSR_32_SaveList;
359 return Is64Bit ? CSR_IPRA_64_SaveList : CSR_IPRA_32_SaveList;
364 assert(MF &&
"Invalid MachineFunction pointer.");
367 return CSR_64_CXX_TLS_Darwin_ViaCopy_SaveList;
383 return CSR_NoRegs_RegMask;
388 return CSR_64_AllRegs_AVX_RegMask;
389 return CSR_64_AllRegs_RegMask;
392 return HasEGPR ? CSR_Win64_APX_RT_MostRegs_RegMask
393 : CSR_Win64_RT_MostRegs_RegMask;
394 return CSR_64_RT_MostRegs_RegMask;
397 return CSR_64_RT_AllRegs_AVX_RegMask;
398 return CSR_64_RT_AllRegs_RegMask;
400 return CSR_64_NoneRegs_RegMask;
403 return CSR_64_TLS_Darwin_RegMask;
406 if (HasAVX512 && IsWin64)
407 return HasEGPR ? CSR_Win64_APX_Intel_OCL_BI_AVX512_RegMask
408 : CSR_Win64_Intel_OCL_BI_AVX512_RegMask;
409 if (HasAVX512 && Is64Bit)
410 return CSR_64_Intel_OCL_BI_AVX512_RegMask;
411 if (HasAVX && IsWin64)
412 return HasEGPR ? CSR_Win64_APX_Intel_OCL_BI_AVX_RegMask
413 : CSR_Win64_Intel_OCL_BI_AVX_RegMask;
414 if (HasAVX && Is64Bit)
415 return CSR_64_Intel_OCL_BI_AVX_RegMask;
416 if (!HasAVX && !IsWin64 && Is64Bit)
417 return CSR_64_Intel_OCL_BI_RegMask;
424 return HasEGPR ? CSR_Win64_APX_RegCall_RegMask
425 : CSR_Win64_RegCall_RegMask;
426 return CSR_Win64_RegCall_NoSSE_RegMask;
428 return HasSSE ? CSR_SysV64_RegCall_RegMask
429 : CSR_SysV64_RegCall_NoSSE_RegMask;
431 return HasSSE ? CSR_32_RegCall_RegMask : CSR_32_RegCall_NoSSE_RegMask;
435 return HasEGPR ? CSR_Win64_APX_CFGuard_Check_RegMask
436 : CSR_Win64_CFGuard_Check_RegMask;
437 return CSR_Win64_CFGuard_Check_NoSSE_RegMask;
439 return HasSSE ? CSR_Win32_CFGuard_Check_RegMask
440 : CSR_Win32_CFGuard_Check_NoSSE_RegMask;
443 return CSR_64_MostRegs_RegMask;
446 return HasEGPR ? CSR_Win64_APX_RegMask : CSR_Win64_RegMask;
449 return CSR_32_RegMask;
451 return HasEGPR ? CSR_Win64_APX_SwiftTail_RegMask
452 : CSR_Win64_SwiftTail_RegMask;
453 return CSR_64_SwiftTail_RegMask;
455 return CSR_64_RegMask;
461 return CSR_64_AllRegs_AVX512_RegMask;
463 return CSR_64_AllRegs_AVX_RegMask;
465 return CSR_64_AllRegs_RegMask;
466 return CSR_64_AllRegs_NoSSE_RegMask;
469 return CSR_32_AllRegs_AVX512_RegMask;
471 return CSR_32_AllRegs_AVX_RegMask;
473 return CSR_32_AllRegs_SSE_RegMask;
474 return CSR_32_AllRegs_RegMask;
483 bool IsSwiftCC =
Subtarget.getTargetLowering()->supportSwiftError() &&
484 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError);
487 return HasEGPR ? CSR_Win64_APX_SwiftError_RegMask
488 : CSR_Win64_SwiftError_RegMask;
489 return CSR_64_SwiftError_RegMask;
492 if (IsWin64 || IsUEFI64)
493 return HasEGPR ? CSR_Win64_APX_RegMask : CSR_Win64_RegMask;
494 return CSR_64_RegMask;
497 return CSR_32_RegMask;
502 return CSR_NoRegs_RegMask;
506 return CSR_64_TLS_Darwin_RegMask;
523 for (
const MCPhysReg &SubReg : subregs_inclusive(X86::RSP))
530 if (ST.hasUserReservedRegisters()) {
533 for (
unsigned Reg = X86::R8; Reg <= X86::R15; ++Reg)
534 if (ST.isRegisterReservedByUser(Reg))
535 for (
const MCPhysReg &SubReg : subregs_inclusive(Reg))
538 for (
unsigned Reg = X86::R16; Reg <= X86::R31; ++Reg)
539 if (ST.isRegisterReservedByUser(Reg))
540 for (
const MCPhysReg &SubReg : subregs_inclusive(Reg))
543 if (ST.isRegisterReservedByUser(X86::EDI))
544 for (
const MCPhysReg &SubReg : sub_and_superregs_inclusive(X86::EDI))
550 for (
const MCPhysReg &SubReg : subregs_inclusive(X86::RIP))
558 "Frame pointer clobbered by function invoke is not supported.");
560 for (
const MCPhysReg &SubReg : subregs_inclusive(X86::RBP))
568 "Stack realignment in presence of dynamic "
569 "allocas is not supported with "
570 "this calling convention.");
573 for (
const MCPhysReg &SubReg : subregs_inclusive(BasePtr))
586 for (
unsigned n = 0; n != 8; ++n)
591 if (ST.useSoftFloat() || !ST.hasX87())
592 for (
unsigned n = 0; n != 7; ++n)
608 for (
unsigned n = 0; n != 8; ++n) {
619 for (
unsigned n = 0; n != 16; ++n) {
628 Reserved.set(X86::R16, X86::R31WH + 1);
634 unsigned NumReservedCSRs = 0;
635 for (
unsigned Reg = X86::R16; Reg <= X86::R31; ++Reg)
636 if (isCalleeSavedPhysReg(Reg, MF)) {
638 for (
const MCPhysReg &SubReg : subregs_inclusive(Reg))
641 if (NumReservedCSRs &&
642 MF.
size() > ST.getCLOpts().setjmp_csr_warning_threshold &&
646 " callee-saved register(s) reserved due to setjmp in '" +
648 "'; this may impact performance in large functions");
670 {X86::SIL, X86::DIL, X86::BPL, X86::SPL,
671 X86::SIH, X86::DIH, X86::BPH, X86::SPH}));
687 static_assert((X86::R15WH + 1 == X86::YMM0) && (X86::YMM15 + 1 == X86::K0) &&
688 (X86::K6_K7 + 1 == X86::TMMCFG) &&
689 (X86::TMM7 + 1 == X86::R16) &&
690 (X86::R31WH + 1 == X86::NUM_TARGET_REGS),
691 "Register number may be incorrect");
695 return X86::NUM_TARGET_REGS;
697 return X86::TMM7 + 1;
699 return X86::K6_K7 + 1;
701 return X86::YMM15 + 1;
702 return X86::R15WH + 1;
710 return TRI.isSuperOrSubRegisterEq(RegA, RegB);
716 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }) ||
717 (ST.hasMMX() && X86::VR64RegClass.contains(Reg));
726 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
731 [&](
MCRegister &RegA) {
return IsSubReg(RegA, Reg); }))
736 X86::XMM3, X86::XMM4, X86::XMM5,
737 X86::XMM6, X86::XMM7},
738 [&](
MCRegister &RegA) { return IsSubReg(RegA, Reg); }))
741 return X86GenRegisterInfo::isArgumentRegister(MF, Reg);
750 if (
TRI.isSuperOrSubRegisterEq(X86::RSP, PhysReg))
755 if (TFI.
hasFP(MF) &&
TRI.isSuperOrSubRegisterEq(X86::RBP, PhysReg))
758 return X86GenRegisterInfo::isFixedRegister(MF, PhysReg);
762 return RC->
getID() == X86::TILERegClassID;
773 assert(!(Mask[X86::EFLAGS / 32] & (1U << (X86::EFLAGS % 32))) &&
774 "EFLAGS are not live-out from a patchpoint.");
777 for (
auto Reg : {X86::EFLAGS, X86::RIP, X86::EIP, X86::IP})
778 Mask[Reg / 32] &= ~(1U << (Reg % 32));
809 bool CantUseFP = hasStackRealignment(MF);
822 if (!
MRI->canReserveReg(FramePtr))
828 return MRI->canReserveReg(BasePtr);
845 unsigned Opc =
II->getOpcode();
847 if ((
Opc != X86::LEA32r &&
Opc != X86::LEA64r &&
Opc != X86::LEA64_32r) ||
848 MI.getOperand(2).getImm() != 1 ||
849 MI.getOperand(3).getReg() != X86::NoRegister ||
850 MI.getOperand(4).getImm() != 0 ||
851 MI.getOperand(5).getReg() != X86::NoRegister)
857 if (
Opc == X86::LEA64_32r)
859 Register NewDestReg =
MI.getOperand(0).getReg();
861 MI.getParent()->getParent()->getSubtarget<
X86Subtarget>().getInstrInfo();
862 TII->copyPhysReg(*
MI.getParent(),
II,
MI.getDebugLoc(), NewDestReg, BasePtr,
863 MI.getOperand(1).isKill());
864 MI.eraseFromParent();
869 switch (
MI.getOpcode()) {
871 case X86::CLEANUPRET:
880 unsigned FIOperandNum,
882 int FIOffset)
const {
884 unsigned Opc =
MI.getOpcode();
885 if (
Opc == TargetOpcode::LOCAL_ESCAPE) {
891 MI.getOperand(FIOperandNum).ChangeToRegister(BaseReg,
false);
895 if (
Opc == TargetOpcode::STACKMAP ||
Opc == TargetOpcode::PATCHPOINT) {
896 assert(BasePtr == FramePtr &&
"Expected the FP as base register");
897 int64_t
Offset =
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
898 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
902 if (
MI.getOperand(FIOperandNum + 3).isImm()) {
904 int Imm = (int)(
MI.getOperand(FIOperandNum + 3).getImm());
907 "Requesting 64-bit offset in 32-bit immediate!");
909 MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
913 FIOffset + (uint64_t)
MI.getOperand(FIOperandNum + 3).getOffset();
914 MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
920 int SPAdj,
unsigned FIOperandNum,
929 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
935 assert((!hasStackRealignment(MF) ||
937 "Return instruction can only reference SP relative frame objects");
940 }
else if (TFI->
Is64Bit && (
MBB.isEHFuncletEntry() || IsEHFuncletEpilogue)) {
951 unsigned Opc =
MI.getOpcode();
952 if (
Opc == TargetOpcode::LOCAL_ESCAPE) {
963 if (
Opc == X86::LEA64_32r && X86::GR32RegClass.
contains(BasePtr))
968 MI.getOperand(FIOperandNum).ChangeToRegister(MachineBasePtr,
false);
970 if (BasePtr == StackPtr)
975 if (
Opc == TargetOpcode::STACKMAP ||
Opc == TargetOpcode::PATCHPOINT) {
976 assert(BasePtr == FramePtr &&
"Expected the FP as base register");
977 int64_t
Offset =
MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
978 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
982 if (
MI.getOperand(FIOperandNum+3).isImm()) {
985 int64_t
Imm =
MI.getOperand(FIOperandNum + 3).getImm();
990 if (Is64Bit && !FitsIn32Bits) {
991 assert(RS &&
"RegisterScavenger was NULL");
993 RS->enterBasicBlockEnd(
MBB);
994 RS->backward(std::next(
II));
996 Register ScratchReg = RS->scavengeRegisterBackwards(
997 X86::GR64RegClass,
II,
false, 0,
999 assert(ScratchReg != 0 &&
"scratch reg was 0");
1000 RS->setRegUsed(ScratchReg);
1004 MI.getOperand(FIOperandNum + 3).setImm(0);
1005 if (
MI.getOperand(FIOperandNum + 2).getReg() == X86::NoRegister) {
1006 MI.getOperand(FIOperandNum + 2).setReg(ScratchReg);
1015 .
addReg(X86::NoRegister);
1016 MI.getOperand(FIOperandNum).setReg(ScratchReg);
1023 if (!Is64Bit && !FitsIn32Bits) {
1024 MI.emitGenericError(
"64-bit offset calculated but target is 32-bit");
1031 MI.getOperand(FIOperandNum + 3).ChangeToImmediate(
Offset);
1034 uint64_t
Offset = FIOffset +
1035 (uint64_t)
MI.getOperand(FIOperandNum+3).getOffset();
1036 MI.getOperand(FIOperandNum + 3).setOffset(
Offset);
1051 switch (
MBBI->getOpcode()) {
1054 case TargetOpcode::PATCHABLE_RET:
1060 case X86::TCRETURNdi:
1061 case X86::TCRETURNri:
1062 case X86::TCRETURN_WIN64ri:
1063 case X86::TCRETURN_HIPE32ri:
1064 case X86::TCRETURNmi:
1065 case X86::TCRETURNdi64:
1066 case X86::TCRETURNri64:
1067 case X86::TCRETURNri64_ImpCall:
1068 case X86::TCRETURNmi64:
1069 case X86::TCRETURN_WINmi64:
1070 case X86::EH_RETURN:
1071 case X86::EH_RETURN64: {
1077 Is64Bit ? X86::GR64_NOSPRegClass : X86::GR32_NOSPRegClass;
1090 return TFI->
hasFP(MF) ? FramePtr : StackPtr;
1118 unsigned OpCode =
MI->getOpcode();
1124 Register SrcReg =
MI->getOperand(1).getReg();
1130 case X86::PTILELOADDV:
1131 case X86::PTILELOADDT1V:
1132 case X86::PTDPBSSDV:
1133 case X86::PTDPBSUDV:
1134 case X86::PTDPBUSDV:
1135 case X86::PTDPBUUDV:
1136 case X86::PTILEZEROV:
1137 case X86::PTDPBF16PSV:
1138 case X86::PTDPFP16PSV:
1139 case X86::PTCMMIMFP16PSV:
1140 case X86::PTCMMRLFP16PSV:
1141 case X86::PTILELOADDRSV:
1142 case X86::PTILELOADDRST1V:
1143 case X86::PTDPBF8PSV:
1144 case X86::PTDPBHF8PSV:
1145 case X86::PTDPHBF8PSV:
1146 case X86::PTDPHF8PSV: {
1163 VirtReg, Order, Hints, MF, VRM,
Matrix);
1167 unsigned ID = RC.
getID();
1170 return BaseImplRetVal;
1172 if (ID != X86::TILERegClassID) {
1173 if (ST.getCLOpts().disable_regalloc_hints_for_ndd || !ST.hasNDD() ||
1174 !
TRI.isGeneralPurposeRegisterClass(&RC))
1175 return BaseImplRetVal;
1183 if (PhysReg && !
MRI->isReserved(PhysReg) && !Hints.
contains(PhysReg))
1184 TwoAddrHints.
insert(PhysReg);
1189 for (
auto &MO :
MRI->reg_nodbg_operands(VirtReg)) {
1193 unsigned OpIdx =
MI.getOperandNo(&MO);
1196 TryAddNDDHint(
MI.getOperand(1));
1197 if (
MI.isCommutable()) {
1199 TryAddNDDHint(
MI.getOperand(2));
1201 }
else if (OpIdx == 1) {
1202 TryAddNDDHint(
MI.getOperand(0));
1203 }
else if (
MI.isCommutable() && OpIdx == 2) {
1204 TryAddNDDHint(
MI.getOperand(0));
1209 if (TwoAddrHints.
count(OrderReg))
1212 return BaseImplRetVal;
1223 if (PhysShape == VirtShape)
1229 for (
auto Hint : CopyHints) {
1235 !
MRI->isReserved(PhysReg))
1239#define DEBUG_TYPE "tile-hint"
1241 dbgs() <<
"Hints for virtual register " <<
format_hex(VirtReg, 8) <<
"\n";
1242 for (
auto Hint : Hints) {
1243 dbgs() <<
"tmm" << Hint <<
",";
1254 switch (RC->
getID()) {
1257 case X86::GR8RegClassID:
1258 return &X86::GR8_NOREX2RegClass;
1259 case X86::GR16RegClassID:
1260 return &X86::GR16_NOREX2RegClass;
1261 case X86::GR32RegClassID:
1262 return &X86::GR32_NOREX2RegClass;
1263 case X86::GR64RegClassID:
1264 return &X86::GR64_NOREX2RegClass;
1265 case X86::GR32_NOSPRegClassID:
1266 return &X86::GR32_NOREX2_NOSPRegClass;
1267 case X86::GR64_NOSPRegClassID:
1268 return &X86::GR64_NOREX2_NOSPRegClass;
1273 switch (RC->
getID()) {
1276 case X86::GR8_NOREX2RegClassID:
1277 case X86::GR16_NOREX2RegClassID:
1278 case X86::GR32_NOREX2RegClassID:
1279 case X86::GR64_NOREX2RegClassID:
1280 case X86::GR32_NOREX2_NOSPRegClassID:
1281 case X86::GR64_NOREX2_NOSPRegClassID:
1282 case X86::GR64_with_sub_16bit_in_GR16_NOREX2RegClassID:
1291 if (ST.is64Bit() && ST.hasPPX())
const AArch64Subtarget & Subtarget
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
MachineRegisterInfo & MRI
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,...
bool reservedRegsFrozen() const
reservedRegsFrozen - Returns true after freezeReservedRegs() was called to ensure the set of reserved...
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 X86Options & getCLOpts() const
#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