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;
133 return getAllocatableClass(RC);
141 bool Is64Bit)
const {
142 if (RB.
getID() == RISCV::GPRBRegBankID) {
143 if (Ty.getSizeInBits() <= 32 || (Is64Bit && Ty.getSizeInBits() == 64))
144 return &RISCV::GPRRegClass;
147 if (RB.
getID() == RISCV::FPRBRegBankID) {
148 if (Ty.getSizeInBits() == 16)
149 return &RISCV::FPR16RegClass;
150 if (Ty.getSizeInBits() == 32)
151 return &RISCV::FPR32RegClass;
152 if (Ty.getSizeInBits() == 64)
153 return &RISCV::FPR64RegClass;
156 if (RB.
getID() == RISCV::VRBRegBankID) {
157 if (Ty.getSizeInBits().getKnownMinValue() <= 64)
158 return &RISCV::VRRegClass;
160 if (Ty.getSizeInBits().getKnownMinValue() == 128)
161 return &RISCV::VRM2RegClass;
163 if (Ty.getSizeInBits().getKnownMinValue() == 256)
164 return &RISCV::VRM4RegClass;
166 if (Ty.getSizeInBits().getKnownMinValue() == 512)
167 return &RISCV::VRM8RegClass;
178 for (
size_t Reg = 0; Reg < getNumRegs(); Reg++) {
180 if (Subtarget.isRegisterReservedByUser(Reg)) {
186 if (isConstantPhysReg(Reg)) {
193 markSuperRegs(
Reserved, RISCV::X2_H);
194 markSuperRegs(
Reserved, RISCV::X3_H);
195 markSuperRegs(
Reserved, RISCV::X4_H);
197 markSuperRegs(
Reserved, RISCV::X8_H);
205 markSuperRegs(
Reserved, RISCV::DUMMY_REG_PAIR_WITH_X0);
208 if (Subtarget.hasStdExtE())
209 for (
MCPhysReg Reg = RISCV::X16_H; Reg <= RISCV::X31_H; Reg++)
214 markSuperRegs(
Reserved, RISCV::VTYPE);
215 markSuperRegs(
Reserved, RISCV::VXSAT);
216 markSuperRegs(
Reserved, RISCV::VXRM);
219 markSuperRegs(
Reserved, RISCV::FRM);
220 markSuperRegs(
Reserved, RISCV::FFLAGS);
223 markSuperRegs(
Reserved, RISCV::SF_VCIX_STATE);
226 if (Subtarget.hasStdExtE())
228 markSuperRegs(
Reserved, RISCV::X23_H);
229 markSuperRegs(
Reserved, RISCV::X27_H);
233 markSuperRegs(
Reserved, RISCV::SSP);
236 for (
MCPhysReg Reg = RISCV::T0; Reg <= RISCV::T15; Reg++)
249 return CSR_NoRegs_RegMask;
259 if (DestReg == SrcReg && !
Offset.getFixed() && !
Offset.getScalable())
268 if (
Offset.getScalable()) {
269 if (
auto VLEN = ST.getRealVLen()) {
271 const int64_t VLENB = *VLEN / 8;
273 "Reserve the stack by the multiple of one vector size.");
274 const int64_t NumOfVReg =
Offset.getScalable() / 8;
275 const int64_t FixedOffset = NumOfVReg * VLENB;
278 "Frame size outside of the signed 32-bit range not supported");
284 bool KillSrcReg =
false;
286 if (
Offset.getScalable()) {
287 unsigned ScalableAdjOpc = RISCV::ADD;
288 int64_t ScalableValue =
Offset.getScalable();
289 if (ScalableValue < 0) {
290 ScalableValue = -ScalableValue;
291 ScalableAdjOpc = RISCV::SUB;
295 if (DestReg == SrcReg)
298 assert(ScalableValue > 0 &&
"There is no need to get VLEN scaled value.");
300 "Reserve the stack by the multiple of one vector size.");
302 "Expect the number of vector registers within 32-bits.");
306 bool IsPrologueOrEpilogue =
308 bool UseVsetvliRatherThanVlenb =
309 IsPrologueOrEpilogue && ST.preferVsetvliOverReadVLENB();
310 if (UseVsetvliRatherThanVlenb && (NumOfVReg == 1 || NumOfVReg == 2 ||
311 NumOfVReg == 4 || NumOfVReg == 8)) {
321 if (UseVsetvliRatherThanVlenb)
330 if (ScalableAdjOpc == RISCV::ADD && ST.hasStdExtZba() &&
331 (NumOfVReg == 2 || NumOfVReg == 4 || NumOfVReg == 8)) {
332 unsigned Opc = NumOfVReg == 2
334 : (NumOfVReg == 4 ? RISCV::SH2ADD : RISCV::SH3ADD);
340 TII->mulImm(MF,
MBB,
II,
DL, ScratchReg, NumOfVReg, Flag);
351 int64_t Val =
Offset.getFixed();
352 if (DestReg == SrcReg && Val == 0)
367 if (ST.hasVendorXqcilia() &&
isInt<26>(Val)) {
371 int Hi20 = (Val & 0xFFFFF000) >> 12;
373 ((Val & 0xFFF) == 0) && (Hi20 != 0) &&
374 (
isUInt<5>(Hi20) || (Hi20 >= 0xfffe0 && Hi20 <= 0xfffff));
375 bool IsCompressAddSub =
376 (SrcReg == DestReg) &&
377 ((Val > 0 && RISCV::GPRNoX0RegClass.
contains(SrcReg)) ||
378 (Val < 0 && RISCV::GPRCRegClass.
contains(SrcReg)));
380 if (!(IsCompressLUI && IsCompressAddSub)) {
395 assert(
Align < 2048 &&
"Required alignment too large");
396 int64_t MaxPosAdjStep = 2048 -
Align;
397 if (Val > -4096 && Val <= (2 * MaxPosAdjStep)) {
398 int64_t FirstAdj = Val < 0 ? -2048 : MaxPosAdjStep;
416 if (ST.hasStdExtZba() && (Val & 0xFFF) != 0) {
427 TII->movImm(
MBB,
II,
DL, ScratchReg, Val, Flag);
436 unsigned Opc = RISCV::ADD;
443 TII->movImm(
MBB,
II,
DL, ScratchReg, Val, Flag);
450static std::tuple<RISCVVType::VLMUL, const TargetRegisterClass &, unsigned>
452 if (NumRemaining >= 8 && RegEncoding % 8 == 0)
454 IsSpill ? RISCV::VS8R_V : RISCV::VL8RE8_V};
455 if (NumRemaining >= 4 && RegEncoding % 4 == 0)
457 IsSpill ? RISCV::VS4R_V : RISCV::VL4RE8_V};
458 if (NumRemaining >= 2 && RegEncoding % 2 == 0)
460 IsSpill ? RISCV::VS2R_V : RISCV::VL2RE8_V};
462 IsSpill ? RISCV::VS1R_V : RISCV::VL1RE8_V};
468 bool IsSpill)
const {
478 unsigned NF = ZvlssegInfo->first;
479 unsigned LMUL = ZvlssegInfo->second;
480 unsigned NumRegs = NF * LMUL;
481 assert(NumRegs <= 8 &&
"Invalid NF/LMUL combinations.");
486 bool IsBaseKill =
II->getOperand(1).isKill();
489 auto *OldMMO = *(
II->memoperands_begin());
495 unsigned VLENBShift = 0;
496 unsigned PrevHandledNum = 0;
498 while (
I != NumRegs) {
499 auto [LMulHandled, RegClass, Opcode] =
502 bool IsLast =
I + RegNumHandled == NumRegs;
503 if (PrevHandledNum) {
507 int64_t
Offset = *VLEN / 8 * PrevHandledNum;
519 if (VLENBShift > ShiftAmount) {
522 .
addImm(VLENBShift - ShiftAmount);
523 }
else if (VLENBShift < ShiftAmount) {
526 .
addImm(ShiftAmount - VLENBShift);
528 VLENBShift = ShiftAmount;
544 VRegSize * RegNumHandled));
553 PrevHandledNum = RegNumHandled;
554 RegEncoding += RegNumHandled;
557 II->eraseFromParent();
561 int SPAdj,
unsigned FIOperandNum,
563 assert(SPAdj == 0 &&
"Unexpected non-zero SPAdj value");
570 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
573 getFrameLowering(MF)->getFrameIndexReference(MF, FrameIndex, FrameReg);
580 "Frame offsets outside of the signed 32-bit range not supported");
584 int64_t Val =
Offset.getFixed();
586 unsigned Opc =
MI.getOpcode();
594 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
595 }
else if ((
Opc == RISCV::PREFETCH_I ||
Opc == RISCV::PREFETCH_R ||
596 Opc == RISCV::PREFETCH_W) &&
597 (Lo12 & 0b11111) != 0) {
599 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
600 }
else if (
Opc == RISCV::MIPS_PREF && !
isUInt<9>(Val)) {
602 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
603 }
else if ((
Opc == RISCV::PseudoRV32ZdinxLD ||
604 Opc == RISCV::PseudoRV32ZdinxSD ||
605 Opc == RISCV::PseudoLD_RV32_OPT ||
606 Opc == RISCV::PseudoSD_RV32_OPT) &&
611 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
616 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Lo12);
624 if (
MI.getOpcode() == RISCV::ADDI)
625 DestReg =
MI.getOperand(0).getReg();
630 MI.getOperand(FIOperandNum).ChangeToRegister(DestReg,
false,
634 MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg,
false,
640 if (
MI.getOpcode() == RISCV::ADDI &&
641 MI.getOperand(0).getReg() ==
MI.getOperand(1).getReg() &&
642 MI.getOperand(2).getImm() == 0) {
643 MI.eraseFromParent();
649 switch (
MI.getOpcode()) {
650 case RISCV::PseudoVSPILL2_M1:
651 case RISCV::PseudoVSPILL2_M2:
652 case RISCV::PseudoVSPILL2_M4:
653 case RISCV::PseudoVSPILL3_M1:
654 case RISCV::PseudoVSPILL3_M2:
655 case RISCV::PseudoVSPILL4_M1:
656 case RISCV::PseudoVSPILL4_M2:
657 case RISCV::PseudoVSPILL5_M1:
658 case RISCV::PseudoVSPILL6_M1:
659 case RISCV::PseudoVSPILL7_M1:
660 case RISCV::PseudoVSPILL8_M1:
663 case RISCV::PseudoVRELOAD2_M1:
664 case RISCV::PseudoVRELOAD2_M2:
665 case RISCV::PseudoVRELOAD2_M4:
666 case RISCV::PseudoVRELOAD3_M1:
667 case RISCV::PseudoVRELOAD3_M2:
668 case RISCV::PseudoVRELOAD4_M1:
669 case RISCV::PseudoVRELOAD4_M2:
670 case RISCV::PseudoVRELOAD5_M1:
671 case RISCV::PseudoVRELOAD6_M1:
672 case RISCV::PseudoVRELOAD7_M1:
673 case RISCV::PseudoVRELOAD8_M1:
692 unsigned FIOperandNum = 0;
693 for (; !
MI->getOperand(FIOperandNum).isFI(); FIOperandNum++)
694 assert(FIOperandNum < MI->getNumOperands() &&
695 "Instr doesn't have FrameIndex operand");
704 if (!
MI->mayLoad() && !
MI->mayStore())
712 if (TFI->
hasFP(MF) && !shouldRealignStack(MF)) {
716 unsigned CalleeSavedSize = 0;
719 if (Subtarget.isRegisterReservedByUser(Reg))
722 if (RISCV::GPRRegClass.
contains(Reg))
723 CalleeSavedSize += getSpillSize(RISCV::GPRRegClass);
724 else if (RISCV::FPR64RegClass.
contains(Reg))
725 CalleeSavedSize += getSpillSize(RISCV::FPR64RegClass);
726 else if (RISCV::FPR32RegClass.
contains(Reg))
727 CalleeSavedSize += getSpillSize(RISCV::FPR32RegClass);
731 int64_t MaxFPOffset =
Offset - CalleeSavedSize;
745 int64_t MaxSPOffset =
Offset + 128;
755 unsigned FIOperandNum = 0;
756 while (!
MI->getOperand(FIOperandNum).isFI()) {
758 assert(FIOperandNum < MI->getNumOperands() &&
759 "Instr does not have a FrameIndex operand!");
791 unsigned FIOperandNum = 0;
792 while (!
MI.getOperand(FIOperandNum).isFI()) {
794 assert(FIOperandNum <
MI.getNumOperands() &&
795 "Instr does not have a FrameIndex operand!");
801 MI.getOperand(FIOperandNum).ChangeToRegister(BaseReg,
false);
802 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
811 "The MI must be I or S format.");
812 assert(
MI->getOperand(Idx).isFI() &&
"The Idx'th operand of MI is not a "
813 "FrameIndex operand");
814 return MI->getOperand(Idx + 1).getImm();
819 return TFI->
hasFP(MF) ? RISCV::X8 : RISCV::X2;
823 if (Reg == RISCV::SF_VCIX_STATE)
824 return "sf.vcix_state";
834 return CSR_NoRegs_RegMask;
838 return CSR_RT_MostRegs_RVE_RegMask;
839 return CSR_RT_MostRegs_RegMask;
846 return CSR_ILP32E_LP64E_RegMask;
850 return CSR_ILP32_LP64_V_RegMask;
851 return CSR_ILP32_LP64_RegMask;
855 return CSR_ILP32F_LP64F_V_RegMask;
856 return CSR_ILP32F_LP64F_RegMask;
860 return CSR_ILP32D_LP64D_V_RegMask;
861 return CSR_ILP32D_LP64D_RegMask;
868 if (RC == &RISCV::VMV0RegClass)
869 return &RISCV::VRRegClass;
870 if (RC == &RISCV::VRNoV0RegClass)
871 return &RISCV::VRRegClass;
872 if (RC == &RISCV::VRM2NoV0RegClass)
873 return &RISCV::VRM2RegClass;
874 if (RC == &RISCV::VRM4NoV0RegClass)
875 return &RISCV::VRM4RegClass;
876 if (RC == &RISCV::VRM8NoV0RegClass)
877 return &RISCV::VRM8RegClass;
886 assert(
Offset.getScalable() % 8 == 0 &&
"Invalid frame offset");
892 int64_t VLENBSized =
Offset.getScalable() / 8;
893 if (VLENBSized > 0) {
894 Ops.push_back(dwarf::DW_OP_constu);
895 Ops.push_back(VLENBSized);
896 Ops.append({dwarf::DW_OP_bregx, VLENB, 0ULL});
897 Ops.push_back(dwarf::DW_OP_mul);
898 Ops.push_back(dwarf::DW_OP_plus);
899 }
else if (VLENBSized < 0) {
900 Ops.push_back(dwarf::DW_OP_constu);
901 Ops.push_back(-VLENBSized);
902 Ops.append({dwarf::DW_OP_bregx, VLENB, 0ULL});
903 Ops.push_back(dwarf::DW_OP_mul);
904 Ops.push_back(dwarf::DW_OP_minus);
917 return getRegClassWeight(RC).RegWeight;
931 unsigned HintType = Hint.first;
943 TargetReg = PartnerPhys.
id() + (WantOdd ? 1 : -1);
946 if (RISCV::GPRRegClass.
contains(TargetReg) &&
955 if (TargetReg == PhysReg)
958 unsigned RegNum = getEncodingValue(PhysReg);
960 bool IsOdd = (RegNum % 2 != 0);
963 MCRegister Paired = PhysReg + (IsOdd ? -1 : 1);
964 if (WantOdd == IsOdd && !MRI->
isReserved(Paired))
970 VirtReg, Order, Hints, MF, VRM,
Matrix);
973 return BaseImplRetVal;
979 bool NeedGPRC) ->
void {
985 if (PhysReg && (!NeedGPRC || RISCV::GPRCRegClass.
contains(PhysReg)) &&
986 !MO.getSubReg() && !VRRegMO.
getSubReg()) {
988 TwoAddrHints.
insert(PhysReg);
994 auto isCompressible = [&Subtarget](
const MachineInstr &
MI,
bool &NeedGPRC) {
996 switch (
MI.getOpcode()) {
1009 if (!
MI.getOperand(2).isImm())
1011 int64_t Imm =
MI.getOperand(2).getImm();
1015 return Subtarget.hasStdExtZcb() && Imm == 255;
1026 return MI.getOperand(2).isImm() &&
isInt<6>(
MI.getOperand(2).getImm());
1030 return Subtarget.hasStdExtZcb();
1033 case RISCV::ZEXT_H_RV32:
1034 case RISCV::ZEXT_H_RV64:
1037 return Subtarget.hasStdExtZcb() && Subtarget.hasStdExtZbb();
1041 return Subtarget.hasStdExtZcb() &&
MI.getOperand(2).isReg() &&
1042 MI.getOperand(2).getReg() == RISCV::X0;
1046 return Subtarget.hasStdExtZcb() &&
MI.getOperand(2).isImm() &&
1047 MI.getOperand(2).getImm() == -1;
1048 case RISCV::QC_EXTU:
1049 return MI.getOperand(2).getImm() >= 6 &&
MI.getOperand(3).getImm() == 0;
1054 return Subtarget.hasVendorXqcibm() &&
MI.getOperand(2).getImm() != 0;
1067 return PhysReg && RISCV::GPRCRegClass.contains(PhysReg);
1072 unsigned OpIdx = MO.getOperandNo();
1074 if (isCompressible(
MI, NeedGPRC)) {
1075 if (
OpIdx == 0 &&
MI.getOperand(1).isReg()) {
1076 if (!NeedGPRC ||
MI.getNumExplicitOperands() < 3 ||
1077 MI.getOpcode() == RISCV::ADD_UW ||
1078 isCompressibleOpnd(
MI.getOperand(2)))
1079 tryAddHint(MO,
MI.getOperand(1), NeedGPRC);
1080 if (
MI.isCommutable() &&
MI.getOperand(2).isReg() &&
1081 (!NeedGPRC || isCompressibleOpnd(
MI.getOperand(1))))
1082 tryAddHint(MO,
MI.getOperand(2), NeedGPRC);
1083 }
else if (
OpIdx == 1 && (!NeedGPRC ||
MI.getNumExplicitOperands() < 3 ||
1084 isCompressibleOpnd(
MI.getOperand(2)))) {
1085 tryAddHint(MO,
MI.getOperand(0), NeedGPRC);
1086 }
else if (
MI.isCommutable() &&
OpIdx == 2 &&
1087 (!NeedGPRC || isCompressibleOpnd(
MI.getOperand(1)))) {
1088 tryAddHint(MO,
MI.getOperand(0), NeedGPRC);
1095 if ((
MI.getOpcode() == RISCV::ADDIW ||
MI.getOpcode() == RISCV::ADDI) &&
1096 MI.getOperand(1).isReg()) {
1100 if (
I !=
MBB.begin()) {
1102 if ((
I->getOpcode() == RISCV::LUI ||
I->getOpcode() == RISCV::AUIPC) &&
1103 I->getOperand(0).getReg() ==
MI.getOperand(1).getReg()) {
1105 tryAddHint(MO,
MI.getOperand(1),
false);
1107 tryAddHint(MO,
MI.getOperand(0),
false);
1114 if (TwoAddrHints.
count(OrderReg))
1117 return BaseImplRetVal;
1128 Hint.second.isVirtual()) {
1133 std::pair<unsigned, Register> PartnerHint =
1137 if (PartnerHint.second == Reg) {
1155 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
MachineInstr unsigned OpIdx
uint64_t IntrinsicInst * II
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.
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
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.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
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.
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
Register getReg() const
getReg - Returns the register number.
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.
const uint8_t TSFlags
Configurable target specific flags.
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)
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.
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
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
const TargetRegisterClass * getConstrainedRegClassForOperand(const MachineOperand &MO, const MachineRegisterInfo &MRI) 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
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