44#define DEBUG_TYPE "reginfo"
46#define GET_REGINFO_TARGET_DESC
47#include "PPCGenRegisterInfo.inc"
49STATISTIC(InflateGPRC,
"Number of gprc inputs for getLargestLegalClass");
50STATISTIC(InflateGP8RC,
"Number of g8rc inputs for getLargestLegalClass");
54 cl::desc(
"Enable use of a base pointer for complex stack frames"));
58 cl::desc(
"Force the use of a base pointer in every function"));
62 cl::desc(
"Enable spills from gpr to vsr rather than stack"));
66 cl::desc(
"Consider R1 caller preserved so stack saves of "
67 "caller preserved registers can be LICM candidates"),
72 cl::desc(
"Maximum search distance for definition of CR bit "
86 cl::desc(
"Emit information about accumulator register spills "
98 TM.isPPC64() ? 0 : 1),
100 ImmToIdxMap[PPC::LD] = PPC::LDX; ImmToIdxMap[PPC::STD] = PPC::STDX;
101 ImmToIdxMap[PPC::LBZ] = PPC::LBZX; ImmToIdxMap[PPC::STB] = PPC::STBX;
102 ImmToIdxMap[PPC::LHZ] = PPC::LHZX; ImmToIdxMap[PPC::LHA] = PPC::LHAX;
103 ImmToIdxMap[PPC::LWZ] = PPC::LWZX; ImmToIdxMap[PPC::LWA] = PPC::LWAX;
104 ImmToIdxMap[PPC::LFS] = PPC::LFSX; ImmToIdxMap[PPC::LFD] = PPC::LFDX;
105 ImmToIdxMap[PPC::STH] = PPC::STHX; ImmToIdxMap[PPC::STW] = PPC::STWX;
106 ImmToIdxMap[PPC::STFS] = PPC::STFSX; ImmToIdxMap[PPC::STFD] = PPC::STFDX;
107 ImmToIdxMap[PPC::ADDI] = PPC::ADD4;
108 ImmToIdxMap[PPC::LWA_32] = PPC::LWAX_32;
111 ImmToIdxMap[PPC::LHA8] = PPC::LHAX8; ImmToIdxMap[PPC::LBZ8] = PPC::LBZX8;
112 ImmToIdxMap[PPC::LHZ8] = PPC::LHZX8; ImmToIdxMap[PPC::LWZ8] = PPC::LWZX8;
113 ImmToIdxMap[PPC::STB8] = PPC::STBX8; ImmToIdxMap[PPC::STH8] = PPC::STHX8;
114 ImmToIdxMap[PPC::STW8] = PPC::STWX8; ImmToIdxMap[PPC::STDU] = PPC::STDUX;
115 ImmToIdxMap[PPC::ADDI8] = PPC::ADD8;
116 ImmToIdxMap[PPC::LQ] = PPC::LQX_PSEUDO;
117 ImmToIdxMap[PPC::STQ] = PPC::STQX_PSEUDO;
120 ImmToIdxMap[PPC::DFLOADf32] = PPC::LXSSPX;
121 ImmToIdxMap[PPC::DFLOADf64] = PPC::LXSDX;
122 ImmToIdxMap[PPC::SPILLTOVSR_LD] = PPC::SPILLTOVSR_LDX;
123 ImmToIdxMap[PPC::SPILLTOVSR_ST] = PPC::SPILLTOVSR_STX;
124 ImmToIdxMap[PPC::DFSTOREf32] = PPC::STXSSPX;
125 ImmToIdxMap[PPC::DFSTOREf64] = PPC::STXSDX;
126 ImmToIdxMap[PPC::LXV] = PPC::LXVX;
127 ImmToIdxMap[PPC::LXSD] = PPC::LXSDX;
128 ImmToIdxMap[PPC::LXSSP] = PPC::LXSSPX;
129 ImmToIdxMap[PPC::STXV] = PPC::STXVX;
130 ImmToIdxMap[PPC::STXSD] = PPC::STXSDX;
131 ImmToIdxMap[PPC::STXSSP] = PPC::STXSSPX;
134 ImmToIdxMap[PPC::EVLDD] = PPC::EVLDDX;
135 ImmToIdxMap[PPC::EVSTDD] = PPC::EVSTDDX;
136 ImmToIdxMap[PPC::SPESTW] = PPC::SPESTWX;
137 ImmToIdxMap[PPC::SPELWZ] = PPC::SPELWZX;
140 ImmToIdxMap[PPC::PLBZ] = PPC::LBZX; ImmToIdxMap[PPC::PLBZ8] = PPC::LBZX8;
141 ImmToIdxMap[PPC::PLHZ] = PPC::LHZX; ImmToIdxMap[PPC::PLHZ8] = PPC::LHZX8;
142 ImmToIdxMap[PPC::PLHA] = PPC::LHAX; ImmToIdxMap[PPC::PLHA8] = PPC::LHAX8;
143 ImmToIdxMap[PPC::PLWZ] = PPC::LWZX; ImmToIdxMap[PPC::PLWZ8] = PPC::LWZX8;
144 ImmToIdxMap[PPC::PLWA] = PPC::LWAX; ImmToIdxMap[PPC::PLWA8] = PPC::LWAX;
145 ImmToIdxMap[PPC::PLD] = PPC::LDX; ImmToIdxMap[PPC::PSTD] = PPC::STDX;
147 ImmToIdxMap[PPC::PSTB] = PPC::STBX; ImmToIdxMap[PPC::PSTB8] = PPC::STBX8;
148 ImmToIdxMap[PPC::PSTH] = PPC::STHX; ImmToIdxMap[PPC::PSTH8] = PPC::STHX8;
149 ImmToIdxMap[PPC::PSTW] = PPC::STWX; ImmToIdxMap[PPC::PSTW8] = PPC::STWX8;
151 ImmToIdxMap[PPC::PLFS] = PPC::LFSX; ImmToIdxMap[PPC::PSTFS] = PPC::STFSX;
152 ImmToIdxMap[PPC::PLFD] = PPC::LFDX; ImmToIdxMap[PPC::PSTFD] = PPC::STFDX;
153 ImmToIdxMap[PPC::PLXSSP] = PPC::LXSSPX; ImmToIdxMap[PPC::PSTXSSP] = PPC::STXSSPX;
154 ImmToIdxMap[PPC::PLXSD] = PPC::LXSDX; ImmToIdxMap[PPC::PSTXSD] = PPC::STXSDX;
155 ImmToIdxMap[PPC::PLXV] = PPC::LXVX; ImmToIdxMap[PPC::PSTXV] = PPC::STXVX;
157 ImmToIdxMap[PPC::LXVP] = PPC::LXVPX;
158 ImmToIdxMap[PPC::STXVP] = PPC::STXVPX;
159 ImmToIdxMap[PPC::PLXVP] = PPC::LXVPX;
160 ImmToIdxMap[PPC::PSTXVP] = PPC::STXVPX;
171 return &PPC::G8RC_NOX0RegClass;
172 return &PPC::GPRC_NOR0RegClass;
176 return &PPC::G8RCRegClass;
177 return &PPC::GPRCRegClass;
184 if (!TM.isPPC64() && Subtarget.
isAIXABI())
186 if (Subtarget.hasVSX()) {
187 if (Subtarget.pairedVectorMemops())
188 return CSR_64_AllRegs_VSRP_SaveList;
189 if (Subtarget.
isAIXABI() && !TM.getAIXExtendedAltivecABI())
190 return CSR_64_AllRegs_AIX_Dflt_VSX_SaveList;
191 return CSR_64_AllRegs_VSX_SaveList;
193 if (Subtarget.hasAltivec()) {
194 if (Subtarget.
isAIXABI() && !TM.getAIXExtendedAltivecABI())
195 return CSR_64_AllRegs_AIX_Dflt_Altivec_SaveList;
196 return CSR_64_AllRegs_Altivec_SaveList;
198 return CSR_64_AllRegs_SaveList;
216 if (Subtarget.pairedVectorMemops())
217 return SaveR2 ? CSR_SVR64_ColdCC_R2_VSRP_SaveList
218 : CSR_SVR64_ColdCC_VSRP_SaveList;
219 if (Subtarget.hasAltivec())
220 return SaveR2 ? CSR_SVR64_ColdCC_R2_Altivec_SaveList
221 : CSR_SVR64_ColdCC_Altivec_SaveList;
222 return SaveR2 ? CSR_SVR64_ColdCC_R2_SaveList
223 : CSR_SVR64_ColdCC_SaveList;
226 if (Subtarget.pairedVectorMemops())
227 return CSR_SVR32_ColdCC_VSRP_SaveList;
228 else if (Subtarget.hasAltivec())
229 return CSR_SVR32_ColdCC_Altivec_SaveList;
230 else if (Subtarget.hasSPE())
231 return CSR_SVR32_ColdCC_SPE_SaveList;
232 return CSR_SVR32_ColdCC_SaveList;
236 if (Subtarget.pairedVectorMemops()) {
238 if (!TM.getAIXExtendedAltivecABI())
239 return SaveR2 ? CSR_PPC64_R2_SaveList : CSR_PPC64_SaveList;
240 return SaveR2 ? CSR_AIX64_R2_VSRP_SaveList : CSR_AIX64_VSRP_SaveList;
242 return SaveR2 ? CSR_SVR464_R2_VSRP_SaveList : CSR_SVR464_VSRP_SaveList;
244 if (Subtarget.hasAltivec() &&
245 (!Subtarget.
isAIXABI() || TM.getAIXExtendedAltivecABI())) {
246 return SaveR2 ? CSR_PPC64_R2_Altivec_SaveList
247 : CSR_PPC64_Altivec_SaveList;
249 return SaveR2 ? CSR_PPC64_R2_SaveList : CSR_PPC64_SaveList;
253 if (Subtarget.pairedVectorMemops())
254 return TM.getAIXExtendedAltivecABI() ? CSR_AIX32_VSRP_SaveList
255 : CSR_AIX32_SaveList;
256 if (Subtarget.hasAltivec())
257 return TM.getAIXExtendedAltivecABI() ? CSR_AIX32_Altivec_SaveList
258 : CSR_AIX32_SaveList;
259 return CSR_AIX32_SaveList;
261 if (Subtarget.pairedVectorMemops())
262 return CSR_SVR432_VSRP_SaveList;
263 if (Subtarget.hasAltivec())
264 return CSR_SVR432_Altivec_SaveList;
265 else if (Subtarget.hasSPE()) {
266 if (TM.isPositionIndependent() && !TM.isPPC64())
267 return CSR_SVR432_SPE_NO_S30_31_SaveList;
268 return CSR_SVR432_SPE_SaveList;
270 return CSR_SVR432_SaveList;
278 if (Subtarget.hasVSX()) {
279 if (Subtarget.pairedVectorMemops())
280 return CSR_64_AllRegs_VSRP_RegMask;
281 if (Subtarget.
isAIXABI() && !TM.getAIXExtendedAltivecABI())
282 return CSR_64_AllRegs_AIX_Dflt_VSX_RegMask;
283 return CSR_64_AllRegs_VSX_RegMask;
285 if (Subtarget.hasAltivec()) {
286 if (Subtarget.
isAIXABI() && !TM.getAIXExtendedAltivecABI())
287 return CSR_64_AllRegs_AIX_Dflt_Altivec_RegMask;
288 return CSR_64_AllRegs_Altivec_RegMask;
290 return CSR_64_AllRegs_RegMask;
294 if (Subtarget.pairedVectorMemops()) {
295 if (!TM.getAIXExtendedAltivecABI())
296 return TM.isPPC64() ? CSR_PPC64_RegMask : CSR_AIX32_RegMask;
297 return TM.isPPC64() ? CSR_AIX64_VSRP_RegMask : CSR_AIX32_VSRP_RegMask;
300 ? ((Subtarget.hasAltivec() && TM.getAIXExtendedAltivecABI())
301 ? CSR_PPC64_Altivec_RegMask
303 : ((Subtarget.hasAltivec() && TM.getAIXExtendedAltivecABI())
304 ? CSR_AIX32_Altivec_RegMask
305 : CSR_AIX32_RegMask);
310 return Subtarget.pairedVectorMemops()
311 ? CSR_SVR64_ColdCC_VSRP_RegMask
312 : (Subtarget.hasAltivec() ? CSR_SVR64_ColdCC_Altivec_RegMask
313 : CSR_SVR64_ColdCC_RegMask);
315 return Subtarget.pairedVectorMemops()
316 ? CSR_SVR32_ColdCC_VSRP_RegMask
317 : (Subtarget.hasAltivec()
318 ? CSR_SVR32_ColdCC_Altivec_RegMask
319 : (Subtarget.hasSPE() ? CSR_SVR32_ColdCC_SPE_RegMask
320 : CSR_SVR32_ColdCC_RegMask));
324 return Subtarget.pairedVectorMemops()
325 ? CSR_SVR464_VSRP_RegMask
326 : (Subtarget.hasAltivec() ? CSR_PPC64_Altivec_RegMask
327 : CSR_PPC64_RegMask);
329 return Subtarget.pairedVectorMemops()
330 ? CSR_SVR432_VSRP_RegMask
331 : (Subtarget.hasAltivec()
332 ? CSR_SVR432_Altivec_RegMask
333 : (Subtarget.hasSPE()
334 ? (TM.isPositionIndependent()
335 ? CSR_SVR432_SPE_NO_S30_31_RegMask
336 : CSR_SVR432_SPE_RegMask)
337 : CSR_SVR432_RegMask));
342 return CSR_NoRegs_RegMask;
346 for (
unsigned PseudoReg : {PPC::ZERO, PPC::ZERO8, PPC::RM})
347 Mask[PseudoReg / 32] &= ~(1u << (PseudoReg % 32));
377 markSuperRegs(
Reserved, PPC::VRSAVE);
388 if (!TM.isPPC64() || UsesTOCBasePtr || MF.
hasInlineAsm())
399 if (TFI->needsFP(MF))
402 bool IsPositionIndependent = TM.isPositionIndependent();
414 if (!Subtarget.hasAltivec())
418 if (Subtarget.
isAIXABI() && Subtarget.hasAltivec() &&
419 !TM.getAIXExtendedAltivecABI()) {
422 for (
auto Reg : CSR_Altivec_SaveList) {
439 if (PhysReg == PPC::CTR || PhysReg == PPC::CTR8 || PhysReg == PPC::LR ||
465 if (FrameSize & ~0x7FFF) {
466 LLVM_DEBUG(
dbgs() <<
"TRUE - Frame size is too large for D-Form.\n");
475 if (CSI.isSpilledToReg())
478 int FrIdx = CSI.getFrameIdx();
482 unsigned Opcode = InstrInfo->getStoreOpcodeForSpill(RC);
487 LLVM_DEBUG(
dbgs() <<
"Memory Operand: " << InstrInfo->getName(Opcode)
488 <<
" for register " <<
printReg(Reg,
this) <<
".\n");
489 LLVM_DEBUG(
dbgs() <<
"TRUE - Not fixed frame object that requires "
501 if (InstrInfo->isXFormMemOp(Opcode)) {
502 LLVM_DEBUG(
dbgs() <<
"Memory Operand: " << InstrInfo->getName(Opcode)
503 <<
" for register " <<
printReg(Reg,
this) <<
".\n");
509 if ((Opcode == PPC::RESTORE_QUADWORD) || (Opcode == PPC::SPILL_QUADWORD)) {
510 LLVM_DEBUG(
dbgs() <<
"Memory Operand: " << InstrInfo->getName(Opcode)
511 <<
" for register " <<
printReg(Reg,
this) <<
".\n");
527 return !Subtarget.hasROPProtect();
545 !MFI.hasVarSizedObjects() && !MFI.hasOpaqueSPAdjustment())
569 VirtReg, Order, Hints, MF, VRM,
Matrix);
575 return BaseImplRetVal;
586 switch (
Use.getOpcode()) {
587 case TargetOpcode::COPY: {
588 ResultOp = &
Use.getOperand(0);
589 ResultReg = ResultOp->
getReg();
595 if (RegClass->
contains(PPC::VSRp0)) {
596 HintReg = getSubReg(UACCPhys, ResultOp->
getSubReg());
598 if (HintReg >= PPC::VSRp0 && HintReg <= PPC::VSRp31)
600 }
else if (RegClass->
contains(PPC::ACC0)) {
601 HintReg = PPC::ACC0 + (UACCPhys - PPC::UACC0);
602 if (HintReg >= PPC::ACC0 && HintReg <= PPC::ACC7)
608 case PPC::BUILD_UACC: {
609 ResultOp = &
Use.getOperand(0);
610 ResultReg = ResultOp->
getReg();
614 assert((ACCPhys >= PPC::ACC0 && ACCPhys <= PPC::ACC7) &&
615 "Expecting an ACC register for BUILD_UACC.");
616 Register HintReg = PPC::UACC0 + (ACCPhys - PPC::ACC0);
623 return BaseImplRetVal;
628 if (RC == &PPC::CARRYRCRegClass)
629 return TM.isPPC64() ? &PPC::G8RCRegClass : &PPC::GPRCRegClass;
636 const unsigned DefaultSafety = 1;
638 switch (RC->
getID()) {
641 case PPC::G8RC_NOX0RegClassID:
642 case PPC::GPRC_NOR0RegClassID:
643 case PPC::SPERCRegClassID:
644 case PPC::G8RCRegClassID:
645 case PPC::GPRCRegClassID: {
646 unsigned FP = TFI->
hasFP(MF) ? 1 : 0;
647 return 32 -
FP - DefaultSafety;
649 case PPC::F4RCRegClassID:
650 case PPC::F8RCRegClassID:
651 case PPC::VSLRCRegClassID:
652 return 32 - DefaultSafety;
653 case PPC::VFRCRegClassID:
654 case PPC::VRRCRegClassID: {
658 if (!TM.getAIXExtendedAltivecABI() && Subtarget.
isAIXABI())
659 return 20 - DefaultSafety;
661 return 32 - DefaultSafety;
662 case PPC::VSFRCRegClassID:
663 case PPC::VSSRCRegClassID:
664 case PPC::VSRCRegClassID: {
666 if (!TM.getAIXExtendedAltivecABI() && Subtarget.
isAIXABI())
669 return 52 - DefaultSafety;
671 return 64 - DefaultSafety;
672 case PPC::CRRCRegClassID:
673 return 8 - DefaultSafety;
681 const auto *DefaultSuperclass =
683 if (Subtarget.hasVSX()) {
690 if (TM.isELFv2ABI() || Subtarget.
isAIXABI()) {
692 RC == &PPC::G8RCRegClass) {
694 return &PPC::SPILLTOVSRRCRegClass;
701 if (getRegSizeInBits(*
getRegClass(SuperID)) != getRegSizeInBits(*RC))
705 case PPC::VSSRCRegClassID:
706 return Subtarget.hasP8Vector() ?
getRegClass(SuperID)
708 case PPC::VSFRCRegClassID:
709 case PPC::VSRCRegClassID:
711 case PPC::VSRpRCRegClassID:
712 return Subtarget.pairedVectorMemops() ?
getRegClass(SuperID)
714 case PPC::ACCRCRegClassID:
715 case PPC::UACCRCRegClassID:
716 return Subtarget.hasMMA() ?
getRegClass(SuperID) : DefaultSuperclass;
721 return DefaultSuperclass;
748 bool LP64 = TM.isPPC64();
755 "Maximum call-frame size not sufficiently aligned");
761 bool KillNegSizeReg =
MI.getOperand(1).isKill();
762 Register NegSizeReg =
MI.getOperand(1).getReg();
774 .
addImm(maxCallFrameSize);
782 .
addImm(maxCallFrameSize);
794 bool &KillNegSizeReg,
808 bool LP64 = TM.isPPC64();
827 if (MaxAlign < TargetAlign &&
isInt<16>(FrameSize)) {
847 if (MaxAlign > TargetAlign) {
848 unsigned UnalNegSizeReg = NegSizeReg;
856 unsigned NegSizeReg1 = NegSizeReg;
861 KillNegSizeReg =
true;
864 if (MaxAlign > TargetAlign) {
865 unsigned UnalNegSizeReg = NegSizeReg;
873 unsigned NegSizeReg1 = NegSizeReg;
878 KillNegSizeReg =
true;
894 bool LP64 = TM.isPPC64();
896 Register FramePointer =
MI.getOperand(0).getReg();
897 const Register ActualNegSizeReg =
MI.getOperand(1).getReg();
898 bool KillNegSizeReg =
MI.getOperand(2).isKill();
899 Register NegSizeReg =
MI.getOperand(2).getReg();
902 if (FramePointer == NegSizeReg) {
903 assert(KillNegSizeReg &&
"FramePointer is a def and NegSizeReg is an use, "
904 "NegSizeReg should be killed");
911 NegSizeReg = ActualNegSizeReg;
912 KillNegSizeReg =
false;
917 if (NegSizeReg != ActualNegSizeReg)
942 MI.getOperand(0).getReg())
943 .
addImm(maxCallFrameSize);
956 unsigned FrameIndex)
const {
966 bool LP64 = TM.isPPC64();
980 if (SrcReg != PPC::CR0) {
987 .
addImm(getEncodingValue(SrcReg) * 4)
1001 unsigned FrameIndex)
const {
1011 bool LP64 = TM.isPPC64();
1016 Register DestReg =
MI.getOperand(0).getReg();
1017 assert(
MI.definesRegister(DestReg,
nullptr) &&
1018 "RESTORE_CR does not define its destination");
1025 if (DestReg != PPC::CR0) {
1029 unsigned ShiftBits = getEncodingValue(DestReg)*4;
1036 BuildMI(
MBB,
II, dl,
TII.get(LP64 ? PPC::MTOCRF8 : PPC::MTOCRF), DestReg)
1044 unsigned FrameIndex)
const {
1055 bool LP64 = TM.isPPC64();
1066 unsigned CRBitSpillDistance = 0;
1067 bool SeenUse =
false;
1068 for (; Ins != Rend; ++Ins) {
1070 if (Ins->modifiesRegister(SrcReg,
TRI))
1073 if (Ins->readsRegister(SrcReg,
TRI))
1081 if (!Ins->isDebugInstr())
1082 CRBitSpillDistance++;
1086 if (Ins ==
MBB.rend())
1089 bool SpillsKnownBit =
false;
1091 switch (Ins->getOpcode()) {
1095 SpillsKnownBit =
true;
1100 SpillsKnownBit =
true;
1112 if (Subtarget.isISA3_1()) {
1124 if (Subtarget.isISA3_0()) {
1125 if (SrcReg == PPC::CR0LT || SrcReg == PPC::CR1LT ||
1126 SrcReg == PPC::CR2LT || SrcReg == PPC::CR3LT ||
1127 SrcReg == PPC::CR4LT || SrcReg == PPC::CR5LT ||
1128 SrcReg == PPC::CR6LT || SrcReg == PPC::CR7LT) {
1151 .
addImm(getEncodingValue(SrcReg))
1158 bool KillsCRBit =
MI.killsRegister(SrcReg,
TRI);
1161 if (SpillsKnownBit && KillsCRBit && !SeenUse) {
1162 Ins->setDesc(
TII.get(PPC::UNENCODED_NOP));
1163 Ins->removeOperand(0);
1168 unsigned FrameIndex)
const {
1178 bool LP64 = TM.isPPC64();
1183 Register DestReg =
MI.getOperand(0).getReg();
1184 assert(
MI.definesRegister(DestReg,
nullptr) &&
1185 "RESTORE_CRBIT does not define its destination");
1193 BuildMI(
MBB,
II, dl,
TII.get(LP64 ? PPC::MFOCRF8 : PPC::MFOCRF), RegO)
1196 unsigned ShiftBits = getEncodingValue(DestReg);
1198 BuildMI(
MBB,
II, dl,
TII.get(LP64 ? PPC::RLWIMI8 : PPC::RLWIMI), RegO)
1201 .
addImm(ShiftBits ? 32 - ShiftBits : 0)
1223 std::string Dest = PPC::ACCRCRegClass.contains(DestReg) ?
"acc" :
"uacc";
1224 std::string Src = PPC::ACCRCRegClass.contains(SrcReg) ?
"acc" :
"uacc";
1225 dbgs() <<
"Emitting copy from " << Src <<
" to " << Dest <<
":\n";
1237 dbgs() <<
"Emitting " << (IsPrimed ?
"acc" :
"uacc") <<
" register "
1238 << (IsRestore ?
"restore" :
"spill") <<
":\n";
1247 unsigned FrameIndex,
bool IsLittleEndian,
1253 "Spilling register pairs does not support virtual registers.");
1265 FrameIndex, IsLittleEndian ?
Offset - 16 :
Offset + 16);
1272 unsigned FrameIndex)
const {
1274 "Expecting to do this only if paired vector stores are disabled.");
1283 bool IsKilled =
MI.getOperand(0).isKill();
1285 spillRegPair(
MBB,
II,
DL,
TII, FrameIndex, IsLittleEndian, IsKilled, SrcReg,
1286 IsLittleEndian ? 16 : 0);
1297 dbgs() <<
"Emitting wacc register " << (IsRestore ?
"restore" :
"spill")
1310 unsigned FrameIndex)
const {
1318 bool IsKilled =
MI.getOperand(0).isKill();
1320 bool IsPrimed = PPC::ACCRCRegClass.contains(SrcReg);
1332 spillRegPair(
MBB,
II,
DL,
TII, FrameIndex, IsLittleEndian, IsKilled,
1334 IsLittleEndian ? 48 : 0);
1335 spillRegPair(
MBB,
II,
DL,
TII, FrameIndex, IsLittleEndian, IsKilled,
1337 IsLittleEndian ? 16 : 32);
1343 FrameIndex, IsLittleEndian ? 32 : 0);
1348 FrameIndex, IsLittleEndian ? 0 : 32);
1350 if (IsPrimed && !IsKilled)
1359 unsigned FrameIndex)
const {
1367 Register DestReg =
MI.getOperand(0).getReg();
1368 assert(
MI.definesRegister(DestReg,
nullptr) &&
1369 "RESTORE_ACC does not define its destination");
1371 bool IsPrimed = PPC::ACCRCRegClass.contains(DestReg);
1373 PPC::VSRp0 + (DestReg - (IsPrimed ? PPC::ACC0 : PPC::UACC0)) * 2;
1381 FrameIndex, IsLittleEndian ? 32 : 0);
1383 FrameIndex, IsLittleEndian ? 0 : 32);
1394 unsigned FrameIndex)
const {
1416 FrameIndex, IsLittleEndian ? 32 : 0);
1419 FrameIndex, IsLittleEndian ? 0 : 32);
1428 unsigned FrameIndex)
const {
1442 Register DestReg =
MI.getOperand(0).getReg();
1445 FrameIndex, IsLittleEndian ? 32 : 0);
1447 FrameIndex, IsLittleEndian ? 0 : 32);
1460 unsigned FrameIndex)
const {
1469 bool IsKilled =
MI.getOperand(0).isKill();
1471 Register Reg = PPC::X0 + (SrcReg - PPC::G8p0) * 2;
1476 FrameIndex, IsLittleEndian ? 8 : 0);
1479 FrameIndex, IsLittleEndian ? 0 : 8);
1487 unsigned FrameIndex)
const {
1495 Register DestReg =
MI.getOperand(0).getReg();
1496 assert(
MI.definesRegister(DestReg,
nullptr) &&
1497 "RESTORE_QUADWORD does not define its destination");
1499 Register Reg = PPC::X0 + (DestReg - PPC::G8p0) * 2;
1503 IsLittleEndian ? 8 : 0);
1505 IsLittleEndian ? 0 : 8);
1513 unsigned FrameIndex)
const {
1525 auto spillDMR = [&](
Register SrcReg,
int BEIdx,
int LEIdx) {
1526 auto spillWACC = [&](
unsigned Opc,
unsigned RegIdx,
int IdxBE,
int IdxLE) {
1536 FrameIndex, IsLittleEndian ? IdxLE : IdxBE);
1539 FrameIndex, IsLittleEndian ? IdxLE - 32 : IdxBE + 32);
1541 spillWACC(PPC::DMXXEXTFDMR512, PPC::sub_wacc_lo, BEIdx, LEIdx);
1542 spillWACC(PPC::DMXXEXTFDMR512_HI, PPC::sub_wacc_hi, BEIdx + 64, LEIdx - 64);
1546 if (
MI.getOpcode() == PPC::SPILL_DMRP) {
1550 spillDMR(SrcReg, 0, 96);
1558 unsigned FrameIndex)
const {
1568 auto restoreDMR = [&](
Register DestReg,
int BEIdx,
int LEIdx) {
1569 auto restoreWACC = [&](
unsigned Opc,
unsigned RegIdx,
int IdxBE,
1575 FrameIndex, IsLittleEndian ? IdxLE : IdxBE);
1577 FrameIndex, IsLittleEndian ? IdxLE - 32 : IdxBE + 32);
1585 restoreWACC(PPC::DMXXINSTDMR512, PPC::sub_wacc_lo, BEIdx, LEIdx);
1586 restoreWACC(PPC::DMXXINSTDMR512_HI, PPC::sub_wacc_hi, BEIdx + 64,
1590 Register DestReg =
MI.getOperand(0).getReg();
1591 if (
MI.getOpcode() == PPC::RESTORE_DMRP) {
1595 restoreDMR(DestReg, 0, 96);
1602 Register Reg,
int &FrameIdx)
const {
1611 if (PPC::CR2 <= Reg && Reg <= PPC::CR4) {
1629 case PPC::DFLOADf32:
1630 case PPC::DFLOADf64:
1631 case PPC::DFSTOREf32:
1632 case PPC::DFSTOREf64:
1653 unsigned OpC =
MI.getOpcode();
1659 unsigned FIOperandNum) {
1661 unsigned OffsetOperandNo = (FIOperandNum == 2) ? 1 : 2;
1662 if (
MI.isInlineAsm())
1663 OffsetOperandNo = FIOperandNum - 1;
1664 else if (
MI.getOpcode() == TargetOpcode::STACKMAP ||
1665 MI.getOpcode() == TargetOpcode::PATCHPOINT)
1666 OffsetOperandNo = FIOperandNum + 1;
1668 return OffsetOperandNo;
1673 int SPAdj,
unsigned FIOperandNum,
1675 assert(SPAdj == 0 &&
"Unexpected");
1693 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
1700 unsigned OpC =
MI.getOpcode();
1705 case PPC::DYNAREAOFFSET:
1706 case PPC::DYNAREAOFFSET8:
1711 case PPC::DYNALLOC8: {
1713 if (FPSI && FrameIndex == FPSI) {
1719 case PPC::PREPARE_PROBED_ALLOCA_64:
1720 case PPC::PREPARE_PROBED_ALLOCA_32:
1721 case PPC::PREPARE_PROBED_ALLOCA_NEGSIZE_SAME_REG_64:
1722 case PPC::PREPARE_PROBED_ALLOCA_NEGSIZE_SAME_REG_32: {
1723 if (FPSI && FrameIndex == FPSI) {
1733 case PPC::RESTORE_CR:
1736 case PPC::SPILL_CRBIT:
1739 case PPC::RESTORE_CRBIT:
1742 case PPC::SPILL_ACC:
1743 case PPC::SPILL_UACC:
1746 case PPC::RESTORE_ACC:
1747 case PPC::RESTORE_UACC:
1757 case PPC::SPILL_WACC:
1760 case PPC::RESTORE_WACC:
1763 case PPC::SPILL_DMRP:
1764 case PPC::SPILL_DMR:
1767 case PPC::RESTORE_DMRP:
1768 case PPC::RESTORE_DMR:
1771 case PPC::SPILL_QUADWORD:
1774 case PPC::RESTORE_QUADWORD:
1780 MI.getOperand(FIOperandNum).ChangeToRegister(
1785 bool noImmForm = !
MI.isInlineAsm() && OpC != TargetOpcode::STACKMAP &&
1786 OpC != TargetOpcode::PATCHPOINT && !ImmToIdxMap.count(OpC);
1790 Offset +=
MI.getOperand(OffsetOperandNo).getImm();
1805 if ((OpC == PPC::LXVP || OpC == PPC::STXVP) &&
1807 Subtarget.hasPrefixInstrs() && Subtarget.hasP10Vector()) {
1808 unsigned NewOpc = OpC == PPC::LXVP ? PPC::PLXVP : PPC::PSTXVP;
1809 MI.setDesc(
TII.get(NewOpc));
1819 assert(OpC != PPC::DBG_VALUE &&
1820 "This should be handled in a target-independent way");
1823 bool OffsetFitsMnemonic = (OpC == PPC::EVSTDD || OpC == PPC::EVLDD) ?
1826 if (
TII.isPrefixed(
MI.getOpcode()))
1828 if (!noImmForm && ((OffsetFitsMnemonic &&
1830 OpC == TargetOpcode::STACKMAP ||
1831 OpC == TargetOpcode::PATCHPOINT)) {
1832 MI.getOperand(OffsetOperandNo).ChangeToImmediate(
Offset);
1843 unsigned NewOpcode = 0u;
1844 bool ScavengingFailed = RS && RS->getRegsAvailable(RC).none() &&
1845 RS->getRegsAvailable(&PPC::VSFRCRegClass).any();
1850 if (ScavengingFailed && Subtarget.hasDirectMove()) {
1853 SRegHi = SReg =
is64Bit ? PPC::X4 : PPC::R4;
1854 if (
MI.getOperand(0).getReg() == SReg)
1855 SRegHi = SReg = SReg + 1;
1883 unsigned OperandBase;
1887 else if (OpC != TargetOpcode::INLINEASM &&
1888 OpC != TargetOpcode::INLINEASM_BR) {
1889 assert(ImmToIdxMap.count(OpC) &&
1890 "No indexed form of load or store available!");
1891 NewOpcode = ImmToIdxMap.find(OpC)->second;
1892 MI.setDesc(
TII.get(NewOpcode));
1895 OperandBase = OffsetOperandNo;
1898 Register StackReg =
MI.getOperand(FIOperandNum).getReg();
1899 MI.getOperand(OperandBase).ChangeToRegister(StackReg,
false);
1900 MI.getOperand(OperandBase + 1).ChangeToRegister(SReg,
false,
false,
true);
1904 if (ScavengingFailed && Subtarget.hasDirectMove())
1911 if (NewOpcode == PPC::LQX_PSEUDO || NewOpcode == PPC::STQX_PSEUDO) {
1912 assert(
is64Bit &&
"Quadword loads/stores only supported in 64-bit mode");
1917 MI.setDesc(
TII.get(NewOpcode == PPC::LQX_PSEUDO ? PPC::LQ : PPC::STQ));
1918 MI.getOperand(OperandBase + 1).ChangeToRegister(NewReg,
false);
1919 MI.getOperand(OperandBase).ChangeToImmediate(0);
1928 return TFI->
hasFP(MF) ? PPC::R31 : PPC::R1;
1930 return TFI->
hasFP(MF) ? PPC::X31 : PPC::X1;
1941 if (Subtarget.
isSVR4ABI() && TM.isPositionIndependent())
1956 return hasStackRealignment(MF);
1976 unsigned OpC =
MI->getOpcode();
1977 if (!ImmToIdxMap.count(OpC))
1981 if ((OpC == PPC::ADDI || OpC == PPC::ADDI8) &&
1982 MI->getOperand(2).getImm() == 0)
2011 unsigned ADDriOpc = TM.isPPC64() ? PPC::ADDI8 : PPC::ADDI;
2015 if (Ins !=
MBB->end())
2016 DL = Ins->getDebugLoc();
2035 unsigned FIOperandNum = 0;
2036 while (!
MI.getOperand(FIOperandNum).isFI()) {
2038 assert(FIOperandNum <
MI.getNumOperands() &&
2039 "Instr doesn't have FrameIndex operand!");
2042 MI.getOperand(FIOperandNum).ChangeToRegister(BaseReg,
false);
2044 Offset +=
MI.getOperand(OffsetOperandNo).getImm();
2045 MI.getOperand(OffsetOperandNo).ChangeToImmediate(
Offset);
2059 unsigned FIOperandNum = 0;
2060 while (!
MI->getOperand(FIOperandNum).isFI()) {
2062 assert(FIOperandNum < MI->getNumOperands() &&
2063 "Instr doesn't have FrameIndex operand!");
2067 Offset +=
MI->getOperand(OffsetOperandNo).getImm();
2069 return MI->getOpcode() == PPC::DBG_VALUE ||
2070 MI->getOpcode() == TargetOpcode::STACKMAP ||
2071 MI->getOpcode() == TargetOpcode::PATCHPOINT ||
static const TargetRegisterClass * getRegClass(const MachineInstr &MI, Register Reg)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file implements the BitVector class.
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"))
Register const TargetRegisterInfo * TRI
uint64_t IntrinsicInst * II
cl::opt< bool > DisableAutoPairedVecSt("disable-auto-paired-vec-st", cl::desc("disable automatically generated 32byte paired vector stores"), cl::init(true), cl::Hidden)
static cl::opt< unsigned > MaxCRBitSpillDist("ppc-max-crbit-spill-dist", cl::desc("Maximum search distance for definition of CR bit " "spill on ppc"), cl::Hidden, cl::init(100))
static cl::opt< bool > EnableBasePointer("ppc-use-base-pointer", cl::Hidden, cl::init(true), cl::desc("Enable use of a base pointer for complex stack frames"))
static cl::opt< bool > EnableGPRToVecSpills("ppc-enable-gpr-to-vsr-spills", cl::Hidden, cl::init(false), cl::desc("Enable spills from gpr to vsr rather than stack"))
static cl::opt< bool > ReportAccMoves("ppc-report-acc-moves", cl::desc("Emit information about accumulator register spills " "and copies"), cl::Hidden, cl::init(false))
static void emitWAccSpillRestoreInfo(MachineBasicBlock &MBB, bool IsRestore)
static unsigned getOffsetONFromFION(const MachineInstr &MI, unsigned FIOperandNum)
static unsigned offsetMinAlignForOpcode(unsigned OpC)
static void emitAccSpillRestoreInfo(MachineBasicBlock &MBB, bool IsPrimed, bool IsRestore)
static unsigned offsetMinAlign(const MachineInstr &MI)
static cl::opt< bool > StackPtrConst("ppc-stack-ptr-caller-preserved", cl::desc("Consider R1 caller preserved so stack saves of " "caller preserved registers can be LICM candidates"), cl::init(true), cl::Hidden)
static cl::opt< bool > AlwaysBasePointer("ppc-always-use-base-pointer", cl::Hidden, cl::init(false), cl::desc("Force the use of a base pointer in every function"))
This file declares the machine register scavenger class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
static bool is64Bit(const char *name)
Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool test(unsigned Idx) const
Returns true if bit Idx is set.
The CalleeSavedInfo class tracks the information need to locate where a callee saved register is in t...
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.
Describe properties that are true of each instruction in the target description file.
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.
MCRegister getSubReg(MCRegister Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo.
Wrapper class representing physical registers. Should be passed by value.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
MachineInstrBundleIterator< MachineInstr, true > reverse_iterator
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
Align getMaxAlign() const
Return alignment of this function's frame.
uint64_t getMaxCallFrameSize() const
Return the maximum size of a call frame that must be allocated for an outgoing function call.
bool isCalleeSavedInfoValid() const
Has the callee saved info been calculated yet?
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
Returns a reference to call saved info vector for the current function.
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
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 hasInlineAsm() const
Returns true if the function contains any inline assembly.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
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.
const MachineInstrBuilder & addFrameIndex(int Idx) const
const MachineInstrBuilder & addDef(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a virtual register definition operand.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
Register getReg() const
getReg - Returns the register number.
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.
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
bool isAllocatable(MCRegister PhysReg) const
isAllocatable - Returns true when PhysReg belongs to an allocatable register class and it hasn't been...
LLVM_ABI const TargetRegisterClass * constrainRegClass(Register Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
constrainRegClass - Constrain the register class of the specified virtual register to be a common sub...
iterator_range< reg_instr_nodbg_iterator > reg_nodbg_instructions(Register Reg) const
uint64_t determineFrameLayout(const MachineFunction &MF, bool UseEstimate=false, unsigned *NewMaxCallFrameSize=nullptr) const
Determine the frame layout but do not update the machine function.
PPCFunctionInfo - This class is derived from MachineFunction private PowerPC target-specific informat...
int getFramePointerSaveIndex() const
bool usesTOCBasePtr() const
void resolveFrameIndex(MachineInstr &MI, Register BaseReg, int64_t Offset) const override
bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM, const LiveRegMatrix *Matrix) const override
Register getFrameRegister(const MachineFunction &MF) const override
bool hasBasePointer(const MachineFunction &MF) const
Register getBaseRegister(const MachineFunction &MF) const
void lowerDMRRestore(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerDMRRestore - Generate the code to restore the DMR register.
void prepareDynamicAlloca(MachineBasicBlock::iterator II, Register &NegSizeReg, bool &KillNegSizeReg, Register &FramePointer) const
To accomplish dynamic stack allocation, we have to calculate exact size subtracted from the stack poi...
void lowerCRBitSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex) const
void lowerACCSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerACCSpilling - Generate the code for spilling the accumulator register.
bool requiresFrameIndexScavenging(const MachineFunction &MF) const override
void lowerCRSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerCRSpilling - Generate the code for spilling a CR register.
const TargetRegisterClass * getPointerRegClass(unsigned Kind=0) const override
getPointerRegClass - Return the register class to use to hold pointers.
void lowerDynamicAreaOffset(MachineBasicBlock::iterator II) const
void lowerDynamicAlloc(MachineBasicBlock::iterator II) const
lowerDynamicAlloc - Generate the code for allocating an object in the current frame.
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID CC) const override
void adjustStackMapLiveOutMask(uint32_t *Mask) const override
bool hasReservedSpillSlot(const MachineFunction &MF, Register Reg, int &FrameIdx) const override
bool isCallerPreservedPhysReg(MCRegister PhysReg, const MachineFunction &MF) const override
bool needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const override
Returns true if the instruction's frame index reference would be better served by a base register oth...
const TargetRegisterClass * getCrossCopyRegClass(const TargetRegisterClass *RC) const override
const uint32_t * getNoPreservedMask() const override
void lowerDMRSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerDMRSpilling - Generate the code for spilling the DMR register.
void lowerCRRestore(MachineBasicBlock::iterator II, unsigned FrameIndex) const
bool eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override
void lowerQuadwordRestore(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerQuadwordRestore - Generate code to restore paired general register.
static void emitAccCopyInfo(MachineBasicBlock &MBB, MCRegister DestReg, MCRegister SrcReg)
bool requiresVirtualBaseRegisters(const MachineFunction &MF) const override
void lowerCRBitRestore(MachineBasicBlock::iterator II, unsigned FrameIndex) const
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
Code Generation virtual methods...
Register materializeFrameBaseRegister(MachineBasicBlock *MBB, int FrameIdx, int64_t Offset) const override
Insert defining instruction(s) for BaseReg to be a pointer to FrameIdx at the beginning of the basic ...
unsigned getRegPressureLimit(const TargetRegisterClass *RC, MachineFunction &MF) const override
void lowerWACCRestore(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerWACCRestore - Generate the code to restore the wide accumulator register.
void lowerPrepareProbedAlloca(MachineBasicBlock::iterator II) const
void lowerQuadwordSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerQuadwordSpilling - Generate code to spill paired general register.
PPCRegisterInfo(const PPCTargetMachine &TM)
bool isFrameOffsetLegal(const MachineInstr *MI, Register BaseReg, int64_t Offset) const override
void lowerWACCSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerWACCSpilling - Generate the code for spilling the wide accumulator register.
void lowerOctWordSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex) const
Remove any STXVP[X] instructions and split them out into a pair of STXV[X] instructions if –disable-a...
bool isAsmClobberable(const MachineFunction &MF, MCRegister PhysReg) const override
BitVector getReservedRegs(const MachineFunction &MF) const override
const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC, const MachineFunction &MF) const override
void lowerACCRestore(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerACCRestore - Generate the code to restore the accumulator register.
bool is32BitELFABI() const
bool isUsingPCRelativeCalls() const
const PPCInstrInfo * getInstrInfo() const override
bool isLittleEndian() const
MCRegister getTOCPointerRegister() const
MCRegister getStackPointerRegister() const
bool is64BitELFABI() const
const PPCRegisterInfo * getRegisterInfo() const override
Common code between 32-bit and 64-bit PowerPC targets.
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC, const MachineFunction &) const
Returns the largest super class of RC that is legal to use in the current sub-target and has the same...
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...
A Use represents the edge between a Value definition and its users.
MCRegister getPhys(Register virtReg) const
returns the physical register mapped to the specified virtual register
bool hasPhys(Register virtReg) const
returns true if the specified virtual register is mapped to a physical register
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
Define some predicates that are used for node matching.
initializer< Ty > init(const Ty &Val)
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.
@ Implicit
Not emitted register (e.g. carry, or temporary result).
@ Kill
The last use of a register.
@ Undef
Value of the register doesn't matter.
constexpr RegState getKillRegState(bool B)
bool isAligned(Align Lhs, uint64_t SizeInBytes)
Checks that SizeInBytes is a multiple of the alignment.
static const MachineInstrBuilder & addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset=0, bool mem=true)
addFrameReference - This function is used to add a reference to the base of an abstract object on the...
static unsigned getCRFromCRBit(unsigned SrcReg)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
MCRegisterClass TargetRegisterClass
This struct is a compact representation of a valid (non-zero power of two) alignment.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.