27#define GET_REGINFO_TARGET_DESC
28#include "RISCVGenRegisterInfo.inc"
32static_assert(RISCV::X1 == RISCV::X0 + 1,
"Register list not consecutive");
33static_assert(RISCV::X31 == RISCV::X0 + 31,
"Register list not consecutive");
34static_assert(RISCV::F1_H == RISCV::F0_H + 1,
"Register list not consecutive");
35static_assert(RISCV::F31_H == RISCV::F0_H + 31,
36 "Register list not consecutive");
37static_assert(RISCV::F1_F == RISCV::F0_F + 1,
"Register list not consecutive");
38static_assert(RISCV::F31_F == RISCV::F0_F + 31,
39 "Register list not consecutive");
40static_assert(RISCV::F1_D == RISCV::F0_D + 1,
"Register list not consecutive");
41static_assert(RISCV::F31_D == RISCV::F0_D + 31,
42 "Register list not consecutive");
43static_assert(RISCV::F1_Q == RISCV::F0_Q + 1,
"Register list not consecutive");
44static_assert(RISCV::F31_Q == RISCV::F0_Q + 31,
45 "Register list not consecutive");
46static_assert(RISCV::V1 == RISCV::V0 + 1,
"Register list not consecutive");
47static_assert(RISCV::V31 == RISCV::V0 + 31,
"Register list not consecutive");
55 return CSR_IPRA_SaveList;
62 return CSR_NoRegs_SaveList;
64 return Subtarget.hasStdExtE() ? CSR_RT_MostRegs_RVE_SaveList
65 : CSR_RT_MostRegs_SaveList;
67 if (Subtarget.hasVInstructions()) {
68 if (Subtarget.hasStdExtD())
69 return Subtarget.hasStdExtE() ? CSR_XLEN_F64_V_Interrupt_RVE_SaveList
70 : CSR_XLEN_F64_V_Interrupt_SaveList;
71 if (Subtarget.hasStdExtF())
72 return Subtarget.hasStdExtE() ? CSR_XLEN_F32_V_Interrupt_RVE_SaveList
73 : CSR_XLEN_F32_V_Interrupt_SaveList;
74 return Subtarget.hasStdExtE() ? CSR_XLEN_V_Interrupt_RVE_SaveList
75 : CSR_XLEN_V_Interrupt_SaveList;
77 if (Subtarget.hasStdExtD())
78 return Subtarget.hasStdExtE() ? CSR_XLEN_F64_Interrupt_RVE_SaveList
79 : CSR_XLEN_F64_Interrupt_SaveList;
80 if (Subtarget.hasStdExtF())
81 return Subtarget.hasStdExtE() ? CSR_XLEN_F32_Interrupt_RVE_SaveList
82 : CSR_XLEN_F32_Interrupt_SaveList;
83 return Subtarget.hasStdExtE() ? CSR_Interrupt_RVE_SaveList
84 : CSR_Interrupt_SaveList;
89 Subtarget.hasVInstructions();
91 switch (Subtarget.getTargetABI()) {
96 return CSR_ILP32E_LP64E_SaveList;
100 return CSR_ILP32_LP64_V_SaveList;
101 return CSR_ILP32_LP64_SaveList;
105 return CSR_ILP32F_LP64F_V_SaveList;
106 return CSR_ILP32F_LP64F_SaveList;
110 return CSR_ILP32D_LP64D_V_SaveList;
111 return CSR_ILP32D_LP64D_SaveList;
124 return getAllocatableClass(RC);
132 bool Is64Bit)
const {
133 if (RB.
getID() == RISCV::GPRBRegBankID) {
134 if (Ty.getSizeInBits() <= 32 || (Is64Bit && Ty.getSizeInBits() == 64))
135 return &RISCV::GPRRegClass;
138 if (RB.
getID() == RISCV::FPRBRegBankID) {
139 if (Ty.getSizeInBits() == 16)
140 return &RISCV::FPR16RegClass;
141 if (Ty.getSizeInBits() == 32)
142 return &RISCV::FPR32RegClass;
143 if (Ty.getSizeInBits() == 64)
144 return &RISCV::FPR64RegClass;
147 if (RB.
getID() == RISCV::VRBRegBankID) {
148 if (Ty.getSizeInBits().getKnownMinValue() <= 64)
149 return &RISCV::VRRegClass;
151 if (Ty.getSizeInBits().getKnownMinValue() == 128)
152 return &RISCV::VRM2RegClass;
154 if (Ty.getSizeInBits().getKnownMinValue() == 256)
155 return &RISCV::VRM4RegClass;
157 if (Ty.getSizeInBits().getKnownMinValue() == 512)
158 return &RISCV::VRM8RegClass;
169 for (
size_t Reg = 0; Reg < getNumRegs(); Reg++) {
171 if (Subtarget.isRegisterReservedByUser(Reg)) {
177 if (isConstantPhysReg(Reg)) {
184 markSuperRegs(
Reserved, RISCV::X2_H);
185 markSuperRegs(
Reserved, RISCV::X3_H);
186 markSuperRegs(
Reserved, RISCV::X4_H);
188 markSuperRegs(
Reserved, RISCV::X8_H);
195 if (Subtarget.hasStdExtE())
196 for (
MCPhysReg Reg = RISCV::X16_H; Reg <= RISCV::X31_H; Reg++)
201 markSuperRegs(
Reserved, RISCV::VTYPE);
202 markSuperRegs(
Reserved, RISCV::VXSAT);
203 markSuperRegs(
Reserved, RISCV::VXRM);
206 markSuperRegs(
Reserved, RISCV::FRM);
207 markSuperRegs(
Reserved, RISCV::FFLAGS);
210 markSuperRegs(
Reserved, RISCV::SF_VCIX_STATE);
213 if (Subtarget.hasStdExtE())
215 markSuperRegs(
Reserved, RISCV::X23_H);
216 markSuperRegs(
Reserved, RISCV::X27_H);
220 markSuperRegs(
Reserved, RISCV::SSP);
223 for (
MCPhysReg Reg = RISCV::T0; Reg <= RISCV::T15; Reg++)
236 return CSR_NoRegs_RegMask;
246 if (DestReg == SrcReg && !
Offset.getFixed() && !
Offset.getScalable())
255 if (
Offset.getScalable()) {
256 if (
auto VLEN = ST.getRealVLen()) {
258 const int64_t VLENB = *VLEN / 8;
260 "Reserve the stack by the multiple of one vector size.");
261 const int64_t NumOfVReg =
Offset.getScalable() / 8;
262 const int64_t FixedOffset = NumOfVReg * VLENB;
269 "32-bit range not supported");
275 bool KillSrcReg =
false;
277 if (
Offset.getScalable()) {
278 unsigned ScalableAdjOpc = RISCV::ADD;
279 int64_t ScalableValue =
Offset.getScalable();
280 if (ScalableValue < 0) {
281 ScalableValue = -ScalableValue;
282 ScalableAdjOpc = RISCV::SUB;
286 if (DestReg == SrcReg)
289 assert(ScalableValue > 0 &&
"There is no need to get VLEN scaled value.");
291 "Reserve the stack by the multiple of one vector size.");
293 "Expect the number of vector registers within 32-bits.");
297 bool IsPrologueOrEpilogue =
299 bool UseVsetvliRatherThanVlenb =
300 IsPrologueOrEpilogue && ST.preferVsetvliOverReadVLENB();
301 if (UseVsetvliRatherThanVlenb && (NumOfVReg == 1 || NumOfVReg == 2 ||
302 NumOfVReg == 4 || NumOfVReg == 8)) {
312 if (UseVsetvliRatherThanVlenb)
321 if (ScalableAdjOpc == RISCV::ADD && ST.hasStdExtZba() &&
322 (NumOfVReg == 2 || NumOfVReg == 4 || NumOfVReg == 8)) {
323 unsigned Opc = NumOfVReg == 2
325 : (NumOfVReg == 4 ? RISCV::SH2ADD : RISCV::SH3ADD);
331 TII->mulImm(MF,
MBB,
II,
DL, ScratchReg, NumOfVReg, Flag);
342 int64_t Val =
Offset.getFixed();
343 if (DestReg == SrcReg && Val == 0)
358 if (ST.hasVendorXqcilia() &&
isInt<26>(Val)) {
362 int Hi20 = (Val & 0xFFFFF000) >> 12;
364 ((Val & 0xFFF) == 0) && (Hi20 != 0) &&
365 (
isUInt<5>(Hi20) || (Hi20 >= 0xfffe0 && Hi20 <= 0xfffff));
366 bool IsCompressAddSub =
367 (SrcReg == DestReg) &&
368 ((Val > 0 && RISCV::GPRNoX0RegClass.
contains(SrcReg)) ||
369 (Val < 0 && RISCV::GPRCRegClass.
contains(SrcReg)));
371 if (!(IsCompressLUI && IsCompressAddSub)) {
386 assert(
Align < 2048 &&
"Required alignment too large");
387 int64_t MaxPosAdjStep = 2048 -
Align;
388 if (Val > -4096 && Val <= (2 * MaxPosAdjStep)) {
389 int64_t FirstAdj = Val < 0 ? -2048 : MaxPosAdjStep;
407 if (ST.hasStdExtZba() && (Val & 0xFFF) != 0) {
418 TII->movImm(
MBB,
II,
DL, ScratchReg, Val, Flag);
439 unsigned Opc = RISCV::ADD;
446 TII->movImm(
MBB,
II,
DL, ScratchReg, Val, Flag);
453static std::tuple<RISCVVType::VLMUL, const TargetRegisterClass &, unsigned>
455 if (NumRemaining >= 8 && RegEncoding % 8 == 0)
457 IsSpill ? RISCV::VS8R_V : RISCV::VL8RE8_V};
458 if (NumRemaining >= 4 && RegEncoding % 4 == 0)
460 IsSpill ? RISCV::VS4R_V : RISCV::VL4RE8_V};
461 if (NumRemaining >= 2 && RegEncoding % 2 == 0)
463 IsSpill ? RISCV::VS2R_V : RISCV::VL2RE8_V};
465 IsSpill ? RISCV::VS1R_V : RISCV::VL1RE8_V};
471 bool IsSpill)
const {
481 unsigned NF = ZvlssegInfo->first;
482 unsigned LMUL = ZvlssegInfo->second;
483 unsigned NumRegs = NF * LMUL;
484 assert(NumRegs <= 8 &&
"Invalid NF/LMUL combinations.");
487 uint16_t RegEncoding =
TRI->getEncodingValue(Reg);
489 bool IsBaseKill =
II->getOperand(1).isKill();
492 auto *OldMMO = *(
II->memoperands_begin());
498 unsigned VLENBShift = 0;
499 unsigned PrevHandledNum = 0;
501 while (
I != NumRegs) {
502 auto [LMulHandled, RegClass, Opcode] =
505 bool IsLast =
I + RegNumHandled == NumRegs;
506 if (PrevHandledNum) {
510 int64_t
Offset = *VLEN / 8 * PrevHandledNum;
522 if (VLENBShift > ShiftAmount) {
525 .
addImm(VLENBShift - ShiftAmount);
526 }
else if (VLENBShift < ShiftAmount) {
529 .
addImm(ShiftAmount - VLENBShift);
531 VLENBShift = ShiftAmount;
547 VRegSize * RegNumHandled));
556 PrevHandledNum = RegNumHandled;
557 RegEncoding += RegNumHandled;
560 II->eraseFromParent();
566 return RISCV::QC_E_LW;
568 return RISCV::QC_E_SW;
570 return RISCV::QC_E_LB;
572 return RISCV::QC_E_LBU;
574 return RISCV::QC_E_LH;
576 return RISCV::QC_E_LHU;
578 return RISCV::QC_E_SB;
580 return RISCV::QC_E_SH;
587 int SPAdj,
unsigned FIOperandNum,
589 assert(SPAdj == 0 &&
"Unexpected non-zero SPAdj value");
596 bool Is64Bit = ST.is64Bit();
599 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
602 getFrameLowering(MF)->getFrameIndexReference(MF, FrameIndex, FrameReg);
609 "not supported on RV32");
613 int64_t Val =
Offset.getFixed();
616 unsigned Opc =
MI.getOpcode();
624 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
625 }
else if ((
Opc == RISCV::PREFETCH_I ||
Opc == RISCV::PREFETCH_R ||
626 Opc == RISCV::PREFETCH_W) &&
627 (Lo12 & 0b11111) != 0) {
629 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
630 }
else if (
Opc == RISCV::MIPS_PREF && !
isUInt<9>(Val)) {
632 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
633 }
else if ((
Opc == RISCV::PseudoRV32ZdinxLD ||
634 Opc == RISCV::PseudoRV32ZdinxSD ||
635 Opc == RISCV::PseudoLD_RV32_OPT ||
636 Opc == RISCV::PseudoSD_RV32_OPT) &&
641 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
643 !
isInt<12>(Val) && ST.hasVendorXqcilo() && WideOpc) {
649 MI.setDesc(
TII->get(WideOpc));
650 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Lo26);
653 }
else if (
Opc == RISCV::QC_E_ADDI || RISCVInstrInfo::isBaseQCLoad(
MI) ||
654 RISCVInstrInfo::isBaseQCStore(
MI)) {
655 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Lo26);
662 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Lo12);
670 if (
MI.getOpcode() == RISCV::ADDI)
671 DestReg =
MI.getOperand(0).getReg();
676 MI.getOperand(FIOperandNum).ChangeToRegister(DestReg,
false,
680 MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg,
false,
686 if (
MI.getOpcode() == RISCV::ADDI &&
687 MI.getOperand(0).getReg() ==
MI.getOperand(1).getReg() &&
688 MI.getOperand(2).getImm() == 0) {
689 MI.eraseFromParent();
695 switch (
MI.getOpcode()) {
696 case RISCV::PseudoVSPILL2_M1:
697 case RISCV::PseudoVSPILL2_M2:
698 case RISCV::PseudoVSPILL2_M4:
699 case RISCV::PseudoVSPILL3_M1:
700 case RISCV::PseudoVSPILL3_M2:
701 case RISCV::PseudoVSPILL4_M1:
702 case RISCV::PseudoVSPILL4_M2:
703 case RISCV::PseudoVSPILL5_M1:
704 case RISCV::PseudoVSPILL6_M1:
705 case RISCV::PseudoVSPILL7_M1:
706 case RISCV::PseudoVSPILL8_M1:
709 case RISCV::PseudoVRELOAD2_M1:
710 case RISCV::PseudoVRELOAD2_M2:
711 case RISCV::PseudoVRELOAD2_M4:
712 case RISCV::PseudoVRELOAD3_M1:
713 case RISCV::PseudoVRELOAD3_M2:
714 case RISCV::PseudoVRELOAD4_M1:
715 case RISCV::PseudoVRELOAD4_M2:
716 case RISCV::PseudoVRELOAD5_M1:
717 case RISCV::PseudoVRELOAD6_M1:
718 case RISCV::PseudoVRELOAD7_M1:
719 case RISCV::PseudoVRELOAD8_M1:
738 unsigned FIOperandNum = 0;
739 for (; !
MI->getOperand(FIOperandNum).isFI(); FIOperandNum++)
740 assert(FIOperandNum < MI->getNumOperands() &&
741 "Instr doesn't have FrameIndex operand");
750 if (!
MI->mayLoad() && !
MI->mayStore())
758 if (TFI->
hasFP(MF) && !shouldRealignStack(MF)) {
762 unsigned CalleeSavedSize = 0;
765 if (Subtarget.isRegisterReservedByUser(Reg))
768 if (RISCV::GPRRegClass.
contains(Reg))
769 CalleeSavedSize += getSpillSize(RISCV::GPRRegClass);
770 else if (RISCV::FPR64RegClass.
contains(Reg))
771 CalleeSavedSize += getSpillSize(RISCV::FPR64RegClass);
772 else if (RISCV::FPR32RegClass.
contains(Reg))
773 CalleeSavedSize += getSpillSize(RISCV::FPR32RegClass);
777 int64_t MaxFPOffset =
Offset - CalleeSavedSize;
791 int64_t MaxSPOffset =
Offset + 128;
801 unsigned FIOperandNum = 0;
802 while (!
MI->getOperand(FIOperandNum).isFI()) {
804 assert(FIOperandNum < MI->getNumOperands() &&
805 "Instr does not have a FrameIndex operand!");
837 unsigned FIOperandNum = 0;
838 while (!
MI.getOperand(FIOperandNum).isFI()) {
840 assert(FIOperandNum <
MI.getNumOperands() &&
841 "Instr does not have a FrameIndex operand!");
847 MI.getOperand(FIOperandNum).ChangeToRegister(BaseReg,
false);
848 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
857 "The MI must be I or S format.");
858 assert(
MI->getOperand(Idx).isFI() &&
"The Idx'th operand of MI is not a "
859 "FrameIndex operand");
860 return MI->getOperand(Idx + 1).getImm();
865 return TFI->
hasFP(MF) ? RISCV::X8 : RISCV::X2;
873 if (
TRI->isGeneralPurposeRegister(MF, Reg))
876 if (
TRI->isFPRegister(Reg))
879 if (RISCV::VRRegClass.
contains(Reg))
886 if (Reg == RISCV::SF_VCIX_STATE)
887 return "sf.vcix_state";
897 return CSR_NoRegs_RegMask;
901 return CSR_RT_MostRegs_RVE_RegMask;
902 return CSR_RT_MostRegs_RegMask;
909 return CSR_ILP32E_LP64E_RegMask;
913 return CSR_ILP32_LP64_V_RegMask;
914 return CSR_ILP32_LP64_RegMask;
918 return CSR_ILP32F_LP64F_V_RegMask;
919 return CSR_ILP32F_LP64F_RegMask;
923 return CSR_ILP32D_LP64D_V_RegMask;
924 return CSR_ILP32D_LP64D_RegMask;
931 if (RC == &RISCV::VMV0RegClass)
932 return &RISCV::VRRegClass;
933 if (RC == &RISCV::VRNoV0RegClass)
934 return &RISCV::VRRegClass;
935 if (RC == &RISCV::VRM2NoV0RegClass)
936 return &RISCV::VRM2RegClass;
937 if (RC == &RISCV::VRM4NoV0RegClass)
938 return &RISCV::VRM4RegClass;
939 if (RC == &RISCV::VRM8NoV0RegClass)
940 return &RISCV::VRM8RegClass;
949 assert(
Offset.getScalable() % 8 == 0 &&
"Invalid frame offset");
955 int64_t VLENBSized =
Offset.getScalable() / 8;
956 if (VLENBSized > 0) {
957 Ops.push_back(dwarf::DW_OP_constu);
958 Ops.push_back(VLENBSized);
959 Ops.append({dwarf::DW_OP_bregx, VLENB, 0ULL});
960 Ops.push_back(dwarf::DW_OP_mul);
961 Ops.push_back(dwarf::DW_OP_plus);
962 }
else if (VLENBSized < 0) {
963 Ops.push_back(dwarf::DW_OP_constu);
964 Ops.push_back(-VLENBSized);
965 Ops.append({dwarf::DW_OP_bregx, VLENB, 0ULL});
966 Ops.push_back(dwarf::DW_OP_mul);
967 Ops.push_back(dwarf::DW_OP_minus);
971std::pair<Register, Register>
973 if (Pair == RISCV::X0_Pair)
974 return {RISCV::X0, RISCV::X0};
975 return {getSubReg(Pair, RISCV::sub_gpr_even),
976 getSubReg(Pair, RISCV::sub_gpr_odd)};
984 ST.getCLOpts().cost_per_use
991 return getRegClassWeight(RC).RegWeight;
1005 unsigned HintType = Hint.first;
1017 TargetReg = PartnerPhys.
id() + (WantOdd ? 1 : -1);
1020 if (RISCV::GPRRegClass.
contains(TargetReg) &&
1029 if (TargetReg == PhysReg)
1032 unsigned RegNum = getEncodingValue(PhysReg);
1034 bool IsOdd = (RegNum % 2 != 0);
1037 MCRegister Paired = PhysReg + (IsOdd ? -1 : 1);
1038 if (WantOdd == IsOdd && !MRI->
isReserved(Paired))
1044 VirtReg, Order, Hints, MF, VRM,
Matrix);
1047 return BaseImplRetVal;
1053 bool NeedGPRC) ->
void {
1059 if (PhysReg && (!NeedGPRC || RISCV::GPRCRegClass.
contains(PhysReg)) &&
1060 !MO.getSubReg() && !VRRegMO.
getSubReg()) {
1062 TwoAddrHints.
insert(PhysReg);
1068 auto isCompressible = [&Subtarget](
const MachineInstr &
MI,
bool &NeedGPRC) {
1070 switch (
MI.getOpcode()) {
1083 if (!
MI.getOperand(2).isImm())
1085 int64_t
Imm =
MI.getOperand(2).getImm();
1089 return Subtarget.hasStdExtZcb() &&
Imm == 255;
1100 return MI.getOperand(2).isImm() &&
isInt<6>(
MI.getOperand(2).getImm());
1104 return Subtarget.hasStdExtZcb();
1107 case RISCV::ZEXT_H_RV32:
1108 case RISCV::ZEXT_H_RV64:
1111 return Subtarget.hasStdExtZcb() && Subtarget.hasStdExtZbb();
1115 return Subtarget.hasStdExtZcb() &&
MI.getOperand(2).isReg() &&
1116 MI.getOperand(2).getReg() == RISCV::X0;
1120 return Subtarget.hasStdExtZcb() &&
MI.getOperand(2).isImm() &&
1121 MI.getOperand(2).getImm() == -1;
1122 case RISCV::QC_EXTU:
1123 return MI.getOperand(2).getImm() >= 6 &&
MI.getOperand(3).getImm() == 0;
1128 return Subtarget.hasVendorXqcibm() &&
MI.getOperand(2).getImm() != 0;
1141 return PhysReg && RISCV::GPRCRegClass.contains(PhysReg);
1146 unsigned OpIdx = MO.getOperandNo();
1148 if (isCompressible(
MI, NeedGPRC)) {
1149 if (OpIdx == 0 &&
MI.getOperand(1).isReg()) {
1150 if (!NeedGPRC ||
MI.getNumExplicitOperands() < 3 ||
1151 MI.getOpcode() == RISCV::ADD_UW ||
1152 isCompressibleOpnd(
MI.getOperand(2)))
1153 tryAddHint(MO,
MI.getOperand(1), NeedGPRC);
1154 if (
MI.isCommutable() &&
MI.getOperand(2).isReg() &&
1155 (!NeedGPRC || isCompressibleOpnd(
MI.getOperand(1))))
1156 tryAddHint(MO,
MI.getOperand(2), NeedGPRC);
1157 }
else if (OpIdx == 1 && (!NeedGPRC ||
MI.getNumExplicitOperands() < 3 ||
1158 isCompressibleOpnd(
MI.getOperand(2)))) {
1159 tryAddHint(MO,
MI.getOperand(0), NeedGPRC);
1160 }
else if (
MI.isCommutable() && OpIdx == 2 &&
1161 (!NeedGPRC || isCompressibleOpnd(
MI.getOperand(1)))) {
1162 tryAddHint(MO,
MI.getOperand(0), NeedGPRC);
1169 if ((
MI.getOpcode() == RISCV::ADDIW ||
MI.getOpcode() == RISCV::ADDI) &&
1170 MI.getOperand(1).isReg()) {
1174 if (
I !=
MBB.begin()) {
1176 if ((
I->getOpcode() == RISCV::LUI ||
I->getOpcode() == RISCV::AUIPC) &&
1177 I->getOperand(0).getReg() ==
MI.getOperand(1).getReg()) {
1179 tryAddHint(MO,
MI.getOperand(1),
false);
1181 tryAddHint(MO,
MI.getOperand(0),
false);
1188 if (TwoAddrHints.
count(OrderReg))
1191 return BaseImplRetVal;
1202 Hint.second.isVirtual()) {
1207 std::pair<unsigned, Register> PartnerHint =
1211 if (PartnerHint.second == Reg) {
1225 uint16_t Encoding)
const {
1229 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 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
const RISCVOptions & getCLOpts() 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.
bool contains(const_arg_type key) const
Check if the SetVector contains the given key.
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 class consists of common code factored out of the SmallVector class to reduce code duplication b...
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 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...
virtual StringRef getRegAsmName(MCRegister Reg) const
Return the assembly name for Reg.
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
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
std::pair< Register, Register > getGPRPairSubRegs(MCRegister Pair) const
bool isArgumentRegister(const MachineFunction &MF, MCRegister Reg) const override
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
BitVector getReservedRegs(const MachineFunction &MF) const override
bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallSetVector< MCPhysReg, 16 > &Hints, const MachineFunction &MF, const VirtRegMap *VRM, const LiveRegMatrix *Matrix) 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
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