27#define GET_REGINFO_TARGET_DESC
28#include "RISCVGenRegisterInfo.inc"
37 cl::desc(
"Disable two address hints for register "
40static_assert(RISCV::X1 == RISCV::X0 + 1,
"Register list not consecutive");
41static_assert(RISCV::X31 == RISCV::X0 + 31,
"Register list not consecutive");
42static_assert(RISCV::F1_H == RISCV::F0_H + 1,
"Register list not consecutive");
43static_assert(RISCV::F31_H == RISCV::F0_H + 31,
44 "Register list not consecutive");
45static_assert(RISCV::F1_F == RISCV::F0_F + 1,
"Register list not consecutive");
46static_assert(RISCV::F31_F == RISCV::F0_F + 31,
47 "Register list not consecutive");
48static_assert(RISCV::F1_D == RISCV::F0_D + 1,
"Register list not consecutive");
49static_assert(RISCV::F31_D == RISCV::F0_D + 31,
50 "Register list not consecutive");
51static_assert(RISCV::F1_Q == RISCV::F0_Q + 1,
"Register list not consecutive");
52static_assert(RISCV::F31_Q == RISCV::F0_Q + 31,
53 "Register list not consecutive");
54static_assert(RISCV::V1 == RISCV::V0 + 1,
"Register list not consecutive");
55static_assert(RISCV::V31 == RISCV::V0 + 31,
"Register list not consecutive");
63 return CSR_IPRA_SaveList;
70 return CSR_NoRegs_SaveList;
72 return Subtarget.hasStdExtE() ? CSR_RT_MostRegs_RVE_SaveList
73 : CSR_RT_MostRegs_SaveList;
75 if (Subtarget.hasVInstructions()) {
76 if (Subtarget.hasStdExtD())
77 return Subtarget.hasStdExtE() ? CSR_XLEN_F64_V_Interrupt_RVE_SaveList
78 : CSR_XLEN_F64_V_Interrupt_SaveList;
79 if (Subtarget.hasStdExtF())
80 return Subtarget.hasStdExtE() ? CSR_XLEN_F32_V_Interrupt_RVE_SaveList
81 : CSR_XLEN_F32_V_Interrupt_SaveList;
82 return Subtarget.hasStdExtE() ? CSR_XLEN_V_Interrupt_RVE_SaveList
83 : CSR_XLEN_V_Interrupt_SaveList;
85 if (Subtarget.hasStdExtD())
86 return Subtarget.hasStdExtE() ? CSR_XLEN_F64_Interrupt_RVE_SaveList
87 : CSR_XLEN_F64_Interrupt_SaveList;
88 if (Subtarget.hasStdExtF())
89 return Subtarget.hasStdExtE() ? CSR_XLEN_F32_Interrupt_RVE_SaveList
90 : CSR_XLEN_F32_Interrupt_SaveList;
91 return Subtarget.hasStdExtE() ? CSR_Interrupt_RVE_SaveList
92 : CSR_Interrupt_SaveList;
97 Subtarget.hasVInstructions();
99 switch (Subtarget.getTargetABI()) {
104 return CSR_ILP32E_LP64E_SaveList;
108 return CSR_ILP32_LP64_V_SaveList;
109 return CSR_ILP32_LP64_SaveList;
113 return CSR_ILP32F_LP64F_V_SaveList;
114 return CSR_ILP32F_LP64F_SaveList;
118 return CSR_ILP32D_LP64D_V_SaveList;
119 return CSR_ILP32D_LP64D_SaveList;
132 return getAllocatableClass(RC);
140 bool Is64Bit)
const {
141 if (RB.
getID() == RISCV::GPRBRegBankID) {
142 if (Ty.getSizeInBits() <= 32 || (Is64Bit && Ty.getSizeInBits() == 64))
143 return &RISCV::GPRRegClass;
146 if (RB.
getID() == RISCV::FPRBRegBankID) {
147 if (Ty.getSizeInBits() == 16)
148 return &RISCV::FPR16RegClass;
149 if (Ty.getSizeInBits() == 32)
150 return &RISCV::FPR32RegClass;
151 if (Ty.getSizeInBits() == 64)
152 return &RISCV::FPR64RegClass;
155 if (RB.
getID() == RISCV::VRBRegBankID) {
156 if (Ty.getSizeInBits().getKnownMinValue() <= 64)
157 return &RISCV::VRRegClass;
159 if (Ty.getSizeInBits().getKnownMinValue() == 128)
160 return &RISCV::VRM2RegClass;
162 if (Ty.getSizeInBits().getKnownMinValue() == 256)
163 return &RISCV::VRM4RegClass;
165 if (Ty.getSizeInBits().getKnownMinValue() == 512)
166 return &RISCV::VRM8RegClass;
177 for (
size_t Reg = 0; Reg < getNumRegs(); Reg++) {
179 if (Subtarget.isRegisterReservedByUser(Reg)) {
185 if (isConstantPhysReg(Reg)) {
192 markSuperRegs(
Reserved, RISCV::X2_H);
193 markSuperRegs(
Reserved, RISCV::X3_H);
194 markSuperRegs(
Reserved, RISCV::X4_H);
196 markSuperRegs(
Reserved, RISCV::X8_H);
204 markSuperRegs(
Reserved, RISCV::DUMMY_REG_PAIR_WITH_X0);
207 if (Subtarget.hasStdExtE())
208 for (
MCPhysReg Reg = RISCV::X16_H; Reg <= RISCV::X31_H; Reg++)
213 markSuperRegs(
Reserved, RISCV::VTYPE);
214 markSuperRegs(
Reserved, RISCV::VXSAT);
215 markSuperRegs(
Reserved, RISCV::VXRM);
218 markSuperRegs(
Reserved, RISCV::FRM);
219 markSuperRegs(
Reserved, RISCV::FFLAGS);
222 markSuperRegs(
Reserved, RISCV::SF_VCIX_STATE);
225 if (Subtarget.hasStdExtE())
227 markSuperRegs(
Reserved, RISCV::X23_H);
228 markSuperRegs(
Reserved, RISCV::X27_H);
232 markSuperRegs(
Reserved, RISCV::SSP);
235 for (
MCPhysReg Reg = RISCV::T0; Reg <= RISCV::T15; Reg++)
248 return CSR_NoRegs_RegMask;
258 if (DestReg == SrcReg && !
Offset.getFixed() && !
Offset.getScalable())
267 if (
Offset.getScalable()) {
268 if (
auto VLEN = ST.getRealVLen()) {
270 const int64_t VLENB = *VLEN / 8;
272 "Reserve the stack by the multiple of one vector size.");
273 const int64_t NumOfVReg =
Offset.getScalable() / 8;
274 const int64_t FixedOffset = NumOfVReg * VLENB;
281 "32-bit range not supported");
287 bool KillSrcReg =
false;
289 if (
Offset.getScalable()) {
290 unsigned ScalableAdjOpc = RISCV::ADD;
291 int64_t ScalableValue =
Offset.getScalable();
292 if (ScalableValue < 0) {
293 ScalableValue = -ScalableValue;
294 ScalableAdjOpc = RISCV::SUB;
298 if (DestReg == SrcReg)
301 assert(ScalableValue > 0 &&
"There is no need to get VLEN scaled value.");
303 "Reserve the stack by the multiple of one vector size.");
305 "Expect the number of vector registers within 32-bits.");
309 bool IsPrologueOrEpilogue =
311 bool UseVsetvliRatherThanVlenb =
312 IsPrologueOrEpilogue && ST.preferVsetvliOverReadVLENB();
313 if (UseVsetvliRatherThanVlenb && (NumOfVReg == 1 || NumOfVReg == 2 ||
314 NumOfVReg == 4 || NumOfVReg == 8)) {
324 if (UseVsetvliRatherThanVlenb)
333 if (ScalableAdjOpc == RISCV::ADD && ST.hasStdExtZba() &&
334 (NumOfVReg == 2 || NumOfVReg == 4 || NumOfVReg == 8)) {
335 unsigned Opc = NumOfVReg == 2
337 : (NumOfVReg == 4 ? RISCV::SH2ADD : RISCV::SH3ADD);
343 TII->mulImm(MF,
MBB,
II,
DL, ScratchReg, NumOfVReg, Flag);
354 int64_t Val =
Offset.getFixed();
355 if (DestReg == SrcReg && Val == 0)
370 if (ST.hasVendorXqcilia() &&
isInt<26>(Val)) {
374 int Hi20 = (Val & 0xFFFFF000) >> 12;
376 ((Val & 0xFFF) == 0) && (Hi20 != 0) &&
377 (
isUInt<5>(Hi20) || (Hi20 >= 0xfffe0 && Hi20 <= 0xfffff));
378 bool IsCompressAddSub =
379 (SrcReg == DestReg) &&
380 ((Val > 0 && RISCV::GPRNoX0RegClass.
contains(SrcReg)) ||
381 (Val < 0 && RISCV::GPRCRegClass.
contains(SrcReg)));
383 if (!(IsCompressLUI && IsCompressAddSub)) {
398 assert(
Align < 2048 &&
"Required alignment too large");
399 int64_t MaxPosAdjStep = 2048 -
Align;
400 if (Val > -4096 && Val <= (2 * MaxPosAdjStep)) {
401 int64_t FirstAdj = Val < 0 ? -2048 : MaxPosAdjStep;
419 if (ST.hasStdExtZba() && (Val & 0xFFF) != 0) {
430 TII->movImm(
MBB,
II,
DL, ScratchReg, Val, Flag);
451 unsigned Opc = RISCV::ADD;
458 TII->movImm(
MBB,
II,
DL, ScratchReg, Val, Flag);
465static std::tuple<RISCVVType::VLMUL, const TargetRegisterClass &, unsigned>
467 if (NumRemaining >= 8 && RegEncoding % 8 == 0)
469 IsSpill ? RISCV::VS8R_V : RISCV::VL8RE8_V};
470 if (NumRemaining >= 4 && RegEncoding % 4 == 0)
472 IsSpill ? RISCV::VS4R_V : RISCV::VL4RE8_V};
473 if (NumRemaining >= 2 && RegEncoding % 2 == 0)
475 IsSpill ? RISCV::VS2R_V : RISCV::VL2RE8_V};
477 IsSpill ? RISCV::VS1R_V : RISCV::VL1RE8_V};
483 bool IsSpill)
const {
493 unsigned NF = ZvlssegInfo->first;
494 unsigned LMUL = ZvlssegInfo->second;
495 unsigned NumRegs = NF * LMUL;
496 assert(NumRegs <= 8 &&
"Invalid NF/LMUL combinations.");
499 uint16_t RegEncoding =
TRI->getEncodingValue(Reg);
501 bool IsBaseKill =
II->getOperand(1).isKill();
504 auto *OldMMO = *(
II->memoperands_begin());
510 unsigned VLENBShift = 0;
511 unsigned PrevHandledNum = 0;
513 while (
I != NumRegs) {
514 auto [LMulHandled, RegClass, Opcode] =
517 bool IsLast =
I + RegNumHandled == NumRegs;
518 if (PrevHandledNum) {
522 int64_t
Offset = *VLEN / 8 * PrevHandledNum;
534 if (VLENBShift > ShiftAmount) {
537 .
addImm(VLENBShift - ShiftAmount);
538 }
else if (VLENBShift < ShiftAmount) {
541 .
addImm(ShiftAmount - VLENBShift);
543 VLENBShift = ShiftAmount;
559 VRegSize * RegNumHandled));
568 PrevHandledNum = RegNumHandled;
569 RegEncoding += RegNumHandled;
572 II->eraseFromParent();
578 return RISCV::QC_E_LW;
580 return RISCV::QC_E_SW;
582 return RISCV::QC_E_LB;
584 return RISCV::QC_E_LBU;
586 return RISCV::QC_E_LH;
588 return RISCV::QC_E_LHU;
590 return RISCV::QC_E_SB;
592 return RISCV::QC_E_SH;
599 int SPAdj,
unsigned FIOperandNum,
601 assert(SPAdj == 0 &&
"Unexpected non-zero SPAdj value");
608 bool Is64Bit = ST.is64Bit();
611 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
614 getFrameLowering(MF)->getFrameIndexReference(MF, FrameIndex, FrameReg);
621 "not supported on RV32");
625 int64_t Val =
Offset.getFixed();
628 unsigned Opc =
MI.getOpcode();
636 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
637 }
else if ((
Opc == RISCV::PREFETCH_I ||
Opc == RISCV::PREFETCH_R ||
638 Opc == RISCV::PREFETCH_W) &&
639 (Lo12 & 0b11111) != 0) {
641 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
642 }
else if (
Opc == RISCV::MIPS_PREF && !
isUInt<9>(Val)) {
644 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
645 }
else if ((
Opc == RISCV::PseudoRV32ZdinxLD ||
646 Opc == RISCV::PseudoRV32ZdinxSD ||
647 Opc == RISCV::PseudoLD_RV32_OPT ||
648 Opc == RISCV::PseudoSD_RV32_OPT) &&
653 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
655 !
isInt<12>(Val) && ST.hasVendorXqcilo() && WideOpc) {
661 MI.setDesc(
TII->get(WideOpc));
662 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Lo26);
665 }
else if (
Opc == RISCV::QC_E_ADDI || RISCVInstrInfo::isBaseQCLoad(
MI) ||
666 RISCVInstrInfo::isBaseQCStore(
MI)) {
667 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Lo26);
674 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Lo12);
682 if (
MI.getOpcode() == RISCV::ADDI)
683 DestReg =
MI.getOperand(0).getReg();
688 MI.getOperand(FIOperandNum).ChangeToRegister(DestReg,
false,
692 MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg,
false,
698 if (
MI.getOpcode() == RISCV::ADDI &&
699 MI.getOperand(0).getReg() ==
MI.getOperand(1).getReg() &&
700 MI.getOperand(2).getImm() == 0) {
701 MI.eraseFromParent();
707 switch (
MI.getOpcode()) {
708 case RISCV::PseudoVSPILL2_M1:
709 case RISCV::PseudoVSPILL2_M2:
710 case RISCV::PseudoVSPILL2_M4:
711 case RISCV::PseudoVSPILL3_M1:
712 case RISCV::PseudoVSPILL3_M2:
713 case RISCV::PseudoVSPILL4_M1:
714 case RISCV::PseudoVSPILL4_M2:
715 case RISCV::PseudoVSPILL5_M1:
716 case RISCV::PseudoVSPILL6_M1:
717 case RISCV::PseudoVSPILL7_M1:
718 case RISCV::PseudoVSPILL8_M1:
721 case RISCV::PseudoVRELOAD2_M1:
722 case RISCV::PseudoVRELOAD2_M2:
723 case RISCV::PseudoVRELOAD2_M4:
724 case RISCV::PseudoVRELOAD3_M1:
725 case RISCV::PseudoVRELOAD3_M2:
726 case RISCV::PseudoVRELOAD4_M1:
727 case RISCV::PseudoVRELOAD4_M2:
728 case RISCV::PseudoVRELOAD5_M1:
729 case RISCV::PseudoVRELOAD6_M1:
730 case RISCV::PseudoVRELOAD7_M1:
731 case RISCV::PseudoVRELOAD8_M1:
750 unsigned FIOperandNum = 0;
751 for (; !
MI->getOperand(FIOperandNum).isFI(); FIOperandNum++)
752 assert(FIOperandNum < MI->getNumOperands() &&
753 "Instr doesn't have FrameIndex operand");
762 if (!
MI->mayLoad() && !
MI->mayStore())
770 if (TFI->
hasFP(MF) && !shouldRealignStack(MF)) {
774 unsigned CalleeSavedSize = 0;
777 if (Subtarget.isRegisterReservedByUser(Reg))
780 if (RISCV::GPRRegClass.
contains(Reg))
781 CalleeSavedSize += getSpillSize(RISCV::GPRRegClass);
782 else if (RISCV::FPR64RegClass.
contains(Reg))
783 CalleeSavedSize += getSpillSize(RISCV::FPR64RegClass);
784 else if (RISCV::FPR32RegClass.
contains(Reg))
785 CalleeSavedSize += getSpillSize(RISCV::FPR32RegClass);
789 int64_t MaxFPOffset =
Offset - CalleeSavedSize;
803 int64_t MaxSPOffset =
Offset + 128;
813 unsigned FIOperandNum = 0;
814 while (!
MI->getOperand(FIOperandNum).isFI()) {
816 assert(FIOperandNum < MI->getNumOperands() &&
817 "Instr does not have a FrameIndex operand!");
849 unsigned FIOperandNum = 0;
850 while (!
MI.getOperand(FIOperandNum).isFI()) {
852 assert(FIOperandNum <
MI.getNumOperands() &&
853 "Instr does not have a FrameIndex operand!");
859 MI.getOperand(FIOperandNum).ChangeToRegister(BaseReg,
false);
860 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
869 "The MI must be I or S format.");
870 assert(
MI->getOperand(Idx).isFI() &&
"The Idx'th operand of MI is not a "
871 "FrameIndex operand");
872 return MI->getOperand(Idx + 1).getImm();
877 return TFI->
hasFP(MF) ? RISCV::X8 : RISCV::X2;
885 if (
TRI->isGeneralPurposeRegister(MF, Reg))
888 if (
TRI->isFPRegister(Reg))
891 if (RISCV::VRRegClass.
contains(Reg))
898 if (Reg == RISCV::SF_VCIX_STATE)
899 return "sf.vcix_state";
909 return CSR_NoRegs_RegMask;
913 return CSR_RT_MostRegs_RVE_RegMask;
914 return CSR_RT_MostRegs_RegMask;
921 return CSR_ILP32E_LP64E_RegMask;
925 return CSR_ILP32_LP64_V_RegMask;
926 return CSR_ILP32_LP64_RegMask;
930 return CSR_ILP32F_LP64F_V_RegMask;
931 return CSR_ILP32F_LP64F_RegMask;
935 return CSR_ILP32D_LP64D_V_RegMask;
936 return CSR_ILP32D_LP64D_RegMask;
943 if (RC == &RISCV::VMV0RegClass)
944 return &RISCV::VRRegClass;
945 if (RC == &RISCV::VRNoV0RegClass)
946 return &RISCV::VRRegClass;
947 if (RC == &RISCV::VRM2NoV0RegClass)
948 return &RISCV::VRM2RegClass;
949 if (RC == &RISCV::VRM4NoV0RegClass)
950 return &RISCV::VRM4RegClass;
951 if (RC == &RISCV::VRM8NoV0RegClass)
952 return &RISCV::VRM8RegClass;
961 assert(
Offset.getScalable() % 8 == 0 &&
"Invalid frame offset");
967 int64_t VLENBSized =
Offset.getScalable() / 8;
968 if (VLENBSized > 0) {
969 Ops.push_back(dwarf::DW_OP_constu);
970 Ops.push_back(VLENBSized);
971 Ops.append({dwarf::DW_OP_bregx, VLENB, 0ULL});
972 Ops.push_back(dwarf::DW_OP_mul);
973 Ops.push_back(dwarf::DW_OP_plus);
974 }
else if (VLENBSized < 0) {
975 Ops.push_back(dwarf::DW_OP_constu);
976 Ops.push_back(-VLENBSized);
977 Ops.append({dwarf::DW_OP_bregx, VLENB, 0ULL});
978 Ops.push_back(dwarf::DW_OP_mul);
979 Ops.push_back(dwarf::DW_OP_minus);
995 return getRegClassWeight(RC).RegWeight;
1009 unsigned HintType = Hint.first;
1021 TargetReg = PartnerPhys.
id() + (WantOdd ? 1 : -1);
1024 if (RISCV::GPRRegClass.
contains(TargetReg) &&
1033 if (TargetReg == PhysReg)
1036 unsigned RegNum = getEncodingValue(PhysReg);
1038 bool IsOdd = (RegNum % 2 != 0);
1041 MCRegister Paired = PhysReg + (IsOdd ? -1 : 1);
1042 if (WantOdd == IsOdd && !MRI->
isReserved(Paired))
1048 VirtReg, Order, Hints, MF, VRM,
Matrix);
1051 return BaseImplRetVal;
1057 bool NeedGPRC) ->
void {
1063 if (PhysReg && (!NeedGPRC || RISCV::GPRCRegClass.
contains(PhysReg)) &&
1064 !MO.getSubReg() && !VRRegMO.
getSubReg()) {
1066 TwoAddrHints.
insert(PhysReg);
1072 auto isCompressible = [&Subtarget](
const MachineInstr &
MI,
bool &NeedGPRC) {
1074 switch (
MI.getOpcode()) {
1087 if (!
MI.getOperand(2).isImm())
1089 int64_t
Imm =
MI.getOperand(2).getImm();
1093 return Subtarget.hasStdExtZcb() &&
Imm == 255;
1104 return MI.getOperand(2).isImm() &&
isInt<6>(
MI.getOperand(2).getImm());
1108 return Subtarget.hasStdExtZcb();
1111 case RISCV::ZEXT_H_RV32:
1112 case RISCV::ZEXT_H_RV64:
1115 return Subtarget.hasStdExtZcb() && Subtarget.hasStdExtZbb();
1119 return Subtarget.hasStdExtZcb() &&
MI.getOperand(2).isReg() &&
1120 MI.getOperand(2).getReg() == RISCV::X0;
1124 return Subtarget.hasStdExtZcb() &&
MI.getOperand(2).isImm() &&
1125 MI.getOperand(2).getImm() == -1;
1126 case RISCV::QC_EXTU:
1127 return MI.getOperand(2).getImm() >= 6 &&
MI.getOperand(3).getImm() == 0;
1132 return Subtarget.hasVendorXqcibm() &&
MI.getOperand(2).getImm() != 0;
1145 return PhysReg && RISCV::GPRCRegClass.contains(PhysReg);
1150 unsigned OpIdx = MO.getOperandNo();
1152 if (isCompressible(
MI, NeedGPRC)) {
1153 if (OpIdx == 0 &&
MI.getOperand(1).isReg()) {
1154 if (!NeedGPRC ||
MI.getNumExplicitOperands() < 3 ||
1155 MI.getOpcode() == RISCV::ADD_UW ||
1156 isCompressibleOpnd(
MI.getOperand(2)))
1157 tryAddHint(MO,
MI.getOperand(1), NeedGPRC);
1158 if (
MI.isCommutable() &&
MI.getOperand(2).isReg() &&
1159 (!NeedGPRC || isCompressibleOpnd(
MI.getOperand(1))))
1160 tryAddHint(MO,
MI.getOperand(2), NeedGPRC);
1161 }
else if (OpIdx == 1 && (!NeedGPRC ||
MI.getNumExplicitOperands() < 3 ||
1162 isCompressibleOpnd(
MI.getOperand(2)))) {
1163 tryAddHint(MO,
MI.getOperand(0), NeedGPRC);
1164 }
else if (
MI.isCommutable() && OpIdx == 2 &&
1165 (!NeedGPRC || isCompressibleOpnd(
MI.getOperand(1)))) {
1166 tryAddHint(MO,
MI.getOperand(0), NeedGPRC);
1173 if ((
MI.getOpcode() == RISCV::ADDIW ||
MI.getOpcode() == RISCV::ADDI) &&
1174 MI.getOperand(1).isReg()) {
1178 if (
I !=
MBB.begin()) {
1180 if ((
I->getOpcode() == RISCV::LUI ||
I->getOpcode() == RISCV::AUIPC) &&
1181 I->getOperand(0).getReg() ==
MI.getOperand(1).getReg()) {
1183 tryAddHint(MO,
MI.getOperand(1),
false);
1185 tryAddHint(MO,
MI.getOperand(0),
false);
1192 if (TwoAddrHints.
count(OrderReg))
1195 return BaseImplRetVal;
1206 Hint.second.isVirtual()) {
1211 std::pair<unsigned, Register> PartnerHint =
1215 if (PartnerHint.second == Reg) {
1229 uint16_t Encoding)
const {
1233 return getMatchingSuperReg(Reg, RISCV::sub_vrm1_0, &RegClass);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file contains constants used for implementing Dwarf debug support.
const HexagonInstrInfo * TII
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Register const TargetRegisterInfo * TRI
Promote Memory to Register
uint64_t IntrinsicInst * II
static unsigned getXqciloWideOpcode(unsigned Opc)
static cl::opt< bool > DisableRegAllocHints("riscv-disable-regalloc-hints", cl::Hidden, cl::init(false), cl::desc("Disable two address hints for register " "allocation"))
static cl::opt< bool > DisableCostPerUse("riscv-disable-cost-per-use", cl::init(false), cl::Hidden)
static std::tuple< RISCVVType::VLMUL, const TargetRegisterClass &, unsigned > getSpillReloadInfo(unsigned NumRemaining, uint16_t RegEncoding, bool IsSpill)
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 unsigned getDwarfRegNum(MCRegister Reg, const TargetRegisterInfo *TRI)
Go up the super-register chain until we hit a valid dwarf register number.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
bool hasOptSize() const
Optimize this function for size (-Os) or minimum size (-Oz).
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.
TypeSize getValue() const
const uint8_t TSFlags
Configurable target specific flags.
Wrapper class representing physical registers. Should be passed by value.
constexpr unsigned id() const
MachineInstrBundleIterator< const MachineInstr > const_iterator
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
int64_t getLocalFrameSize() const
Get the size of the local object blob.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags F, LLT MemTy, Align BaseAlignment, const MMOMetadata &Metadata=MMOMetadata(), SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & setMIFlag(MachineInstr::MIFlag Flag) const
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addFrameIndex(int Idx) const
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const RegClassOrRegBank & getRegClassOrRegBank(Register Reg) const
Return the register bank or register class of Reg.
bool isReserved(MCRegister PhysReg) const
isReserved - Returns true when PhysReg is a reserved 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...
LLT getType(Register Reg) const
Get the low-level type of Reg or LLT{} if Reg is not a generic (target independent) virtual register.
LLVM_ABI const MCPhysReg * getCalleeSavedRegs() const
Returns list of callee saved registers.
std::pair< unsigned, Register > getRegAllocationHint(Register VReg) const
getRegAllocationHint - Return the register allocation hint for the specified virtual register.
void setRegAllocationHint(Register VReg, unsigned Type, Register PrefReg)
setRegAllocationHint - Specify a register allocation hint for the specified virtual register.
const MachineFunction & getMF() const
iterator_range< reg_nodbg_iterator > reg_nodbg_operands(Register Reg) const
bool hasBP(const MachineFunction &MF) const
void movImm(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, Register DstReg, uint64_t Val, MachineInstr::MIFlag Flag=MachineInstr::NoFlags, bool DstRenamable=false, bool DstIsDead=false) const
std::optional< unsigned > getRealVLen() const
const RISCVRegisterInfo * getRegisterInfo() const override
const RISCVInstrInfo * getInstrInfo() const override
This class implements the register bank concept.
unsigned getID() const
Get the identifier of this register bank.
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
StackOffset holds a fixed and a scalable offset in bytes.
int64_t getFixed() const
Returns the fixed component of the stack.
static StackOffset get(int64_t Fixed, int64_t Scalable)
Represent a constant reference to a string, i.e.
Information about stack frame layout on the target.
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual StringRef getRegAsmName(MCRegister Reg) const
Return the assembly name for Reg.
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...
virtual bool isRegisterReservedByUser(Register R) const
virtual const TargetInstrInfo * getInstrInfo() const
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
constexpr bool isKnownMultipleOf(ScalarTy RHS) const
This function tells the caller whether the element count is known at compile time to be a multiple of...
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
#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.
@ RISCV_VectorCall
Calling convention used for RISC-V V-extension.
@ PreserveMost
Used for runtime calls that preserves most registers.
@ GHC
Used by the Glasgow Haskell Compiler (GHC).
@ GRAAL
Used by GraalVM. Two additional registers are reserved.
static unsigned getFormat(uint64_t TSFlags)
static RISCVVType::VLMUL getLMul(uint8_t TSFlags)
LLVM_ABI std::pair< unsigned, bool > decodeVLMUL(VLMUL VLMul)
ArrayRef< MCPhysReg > getArgFPRs(const RISCVSubtarget &STI)
ArrayRef< MCPhysReg > getArgGPRs(const RISCVSubtarget &STI)
ArrayRef< MCPhysReg > getArgVRs(const RISCVSubtarget &STI)
std::optional< std::pair< unsigned, unsigned > > isRVVSpillForZvlsseg(unsigned Opcode)
bool isRVVSpill(const MachineInstr &MI)
static constexpr unsigned RVVBytesPerBlock
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
PointerUnion< const TargetRegisterClass *, const RegisterBank * > RegClassOrRegBank
Convenient type to represent either a register class or a register bank.
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.
constexpr RegState getKillRegState(bool B)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
constexpr RegState getDefRegState(bool B)
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
IterT skipDebugInstructionsBackward(IterT It, IterT Begin, bool SkipPseudoOp=true)
Decrement It until it points to a non-debug instruction or to Begin and return the resulting iterator...
@ Sub
Subtraction of integers.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
constexpr bool isShiftedInt(int64_t x)
Checks if a signed integer is an N bit number shifted left by S.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
MCRegisterClass TargetRegisterClass
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
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.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
bool needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const override
bool requiresVirtualBaseRegisters(const MachineFunction &MF) const override
Register findVRegWithEncoding(const TargetRegisterClass &RegClass, uint16_t Encoding) const
const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC, const MachineFunction &) const override
bool isArgumentRegister(const MachineFunction &MF, MCRegister Reg) const override
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
BitVector getReservedRegs(const MachineFunction &MF) const override
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID) const override
Register materializeFrameBaseRegister(MachineBasicBlock *MBB, int FrameIdx, int64_t Offset) const override
RISCVRegisterInfo(unsigned HwMode)
void getOffsetOpcodes(const StackOffset &Offset, SmallVectorImpl< uint64_t > &Ops) const override
bool isFrameOffsetLegal(const MachineInstr *MI, Register BaseReg, int64_t Offset) const override
Register getFrameRegister(const MachineFunction &MF) const override
const MCPhysReg * getIPRACSRegs(const MachineFunction *MF) const override
void lowerSegmentSpillReload(MachineBasicBlock::iterator II, bool IsSpill) const
const TargetRegisterClass * getRegClassForTypeOnBank(LLT Ty, const RegisterBank &RB, bool Is64Bit) const
void adjustReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator II, const DebugLoc &DL, Register DestReg, Register SrcReg, StackOffset Offset, MachineInstr::MIFlag Flag, MaybeAlign RequiredAlign) const
void updateRegAllocHint(Register Reg, Register NewReg, MachineFunction &MF) const override
bool isAsmClobberable(const MachineFunction &MF, MCRegister PhysReg) const override
const uint32_t * getNoPreservedMask() const override
float getSpillWeightScaleFactor(const TargetRegisterClass *RC) const override
const TargetRegisterClass * getConstrainedRegClassForReg(Register Reg, const MachineRegisterInfo &MRI) const override
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
int64_t getFrameIndexInstrOffset(const MachineInstr *MI, int Idx) const override
unsigned getRegisterCostTableIndex(const MachineFunction &MF) const override
StringRef getRegAsmName(MCRegister Reg) const override
bool eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override