28 "loongarch-disable-reloc-sched",
29 cl::desc(
"Disable scheduling of instructions with target flags"),
32#define GET_INSTRINFO_CTOR_DTOR
33#include "LoongArchGenInstrInfo.inc"
52 bool RenamableSrc)
const {
53 if (LoongArch::GPRRegClass.
contains(DstReg, SrcReg)) {
61 if (LoongArch::LSX128RegClass.
contains(DstReg, SrcReg)) {
69 if (LoongArch::LASX256RegClass.
contains(DstReg, SrcReg)) {
77 if (LoongArch::CFRRegClass.
contains(DstReg) &&
78 LoongArch::GPRRegClass.
contains(SrcReg)) {
84 if (LoongArch::GPRRegClass.
contains(DstReg) &&
85 LoongArch::CFRRegClass.
contains(SrcReg)) {
91 if (LoongArch::CFRRegClass.
contains(DstReg, SrcReg)) {
99 if (LoongArch::FPR32RegClass.
contains(DstReg, SrcReg)) {
100 Opc = LoongArch::FMOV_S;
101 }
else if (LoongArch::FPR64RegClass.
contains(DstReg, SrcReg)) {
102 Opc = LoongArch::FMOV_D;
103 }
else if (LoongArch::GPRRegClass.
contains(DstReg) &&
104 LoongArch::FPR32RegClass.
contains(SrcReg)) {
106 Opc = LoongArch::MOVFR2GR_S;
107 }
else if (LoongArch::GPRRegClass.
contains(DstReg) &&
108 LoongArch::FPR64RegClass.
contains(SrcReg)) {
110 Opc = LoongArch::MOVFR2GR_D;
129 if (LoongArch::GPRRegClass.hasSubClassEq(RC))
130 Opcode =
TRI.getRegSizeInBits(LoongArch::GPRRegClass) == 32
133 else if (LoongArch::FPR32RegClass.hasSubClassEq(RC))
134 Opcode = LoongArch::FST_S;
135 else if (LoongArch::FPR64RegClass.hasSubClassEq(RC))
136 Opcode = LoongArch::FST_D;
137 else if (LoongArch::LSX128RegClass.hasSubClassEq(RC))
138 Opcode = LoongArch::VST;
139 else if (LoongArch::LASX256RegClass.hasSubClassEq(RC))
140 Opcode = LoongArch::XVST;
141 else if (LoongArch::CFRRegClass.hasSubClassEq(RC))
142 Opcode = LoongArch::PseudoST_CFR;
165 DL =
I->getDebugLoc();
168 if (LoongArch::GPRRegClass.hasSubClassEq(RC))
169 Opcode = RegInfo.getRegSizeInBits(LoongArch::GPRRegClass) == 32
172 else if (LoongArch::FPR32RegClass.hasSubClassEq(RC))
173 Opcode = LoongArch::FLD_S;
174 else if (LoongArch::FPR64RegClass.hasSubClassEq(RC))
175 Opcode = LoongArch::FLD_D;
176 else if (LoongArch::LSX128RegClass.hasSubClassEq(RC))
177 Opcode = LoongArch::VLD;
178 else if (LoongArch::LASX256RegClass.hasSubClassEq(RC))
179 Opcode = LoongArch::XVLD;
180 else if (LoongArch::CFRRegClass.hasSubClassEq(RC))
181 Opcode = LoongArch::PseudoLD_CFR;
196 int &FrameIndex)
const {
204 switch (
MI.getOpcode()) {
207 case LoongArch::LD_W:
208 case LoongArch::FLD_S:
211 case LoongArch::LD_D:
212 case LoongArch::FLD_D:
218 case LoongArch::XVLD:
223 if ((
MI.getOperand(1).isFI()) &&
224 (
MI.getOperand(2).isImm()) &&
225 (
MI.getOperand(2).getImm() == 0)) {
226 FrameIndex =
MI.getOperand(1).getIndex();
227 return MI.getOperand(0).getReg();
234 int &FrameIndex)
const {
242 switch (
MI.getOpcode()) {
245 case LoongArch::ST_W:
246 case LoongArch::FST_S:
249 case LoongArch::ST_D:
250 case LoongArch::FST_D:
256 case LoongArch::XVST:
261 if ((
MI.getOperand(1).isFI()) &&
262 (
MI.getOperand(2).isImm()) &&
263 (
MI.getOperand(2).getImm() == 0)) {
264 FrameIndex =
MI.getOperand(1).getIndex();
265 return MI.getOperand(0).getReg();
283 for (
auto &Inst : Seq) {
285 case LoongArch::LU12I_W:
290 case LoongArch::ADDI_W:
292 case LoongArch::LU32I_D:
293 case LoongArch::LU52I_D:
299 case LoongArch::BSTRINS_D:
308 assert(
false &&
"Unknown insn emitted by LoongArchMatInt");
317 unsigned Opcode =
MI.getOpcode();
319 if (Opcode == TargetOpcode::INLINEASM ||
320 Opcode == TargetOpcode::INLINEASM_BR) {
323 return getInlineAsmLength(
MI.getOperand(0).getSymbolName(), MAI);
326 unsigned NumBytes = 0;
332 switch (
Desc.getOpcode()) {
334 return Desc.getSize();
335 case TargetOpcode::STATEPOINT:
337 assert(NumBytes % 4 == 0 &&
"Invalid number of NOP bytes requested!");
342 case TargetOpcode::PATCHABLE_FUNCTION_ENTER: {
345 if (
F.hasFnAttribute(
"patchable-function-entry")) {
347 F.getFnAttributeAsParsedInteger(
"patchable-function-entry");
352 case TargetOpcode::PATCHABLE_FUNCTION_EXIT:
353 case TargetOpcode::PATCHABLE_TAIL_CALL:
356 case TargetOpcode::BUNDLE:
357 return getInstBundleSize(
MI);
363 const unsigned Opcode =
MI.getOpcode();
367 case LoongArch::ADDI_D:
369 case LoongArch::XORI:
370 return (
MI.getOperand(1).isReg() &&
371 MI.getOperand(1).getReg() == LoongArch::R0) ||
372 (
MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0);
374 return MI.isAsCheapAsAMove();
379 assert(
MI.getDesc().isBranch() &&
"Unexpected opcode!");
381 return MI.getOperand(
MI.getNumExplicitOperands() - 1).getMBB();
388 "Unknown conditional branch");
393 for (
int i = 0; i < NumOp - 1; i++)
401 bool AllowModify)
const {
407 if (
I ==
MBB.end() || !isUnpredicatedTerminator(*
I))
413 int NumTerminators = 0;
414 for (
auto J =
I.getReverse(); J !=
MBB.rend() && isUnpredicatedTerminator(*J);
417 if (J->getDesc().isUnconditionalBranch() ||
418 J->getDesc().isIndirectBranch()) {
425 if (AllowModify && FirstUncondOrIndirectBr !=
MBB.end()) {
426 while (std::next(FirstUncondOrIndirectBr) !=
MBB.end()) {
427 std::next(FirstUncondOrIndirectBr)->eraseFromParent();
430 I = FirstUncondOrIndirectBr;
434 if (NumTerminators == 1 &&
I->getDesc().isUnconditionalBranch()) {
440 if (NumTerminators == 1 &&
I->getDesc().isConditionalBranch()) {
446 if (NumTerminators == 2 && std::prev(
I)->getDesc().isConditionalBranch() &&
447 I->getDesc().isUnconditionalBranch()) {
458 int64_t BrOffset)
const {
466 case LoongArch::BLTU:
467 case LoongArch::BGEU:
469 case LoongArch::BEQZ:
470 case LoongArch::BNEZ:
471 case LoongArch::BCEQZ:
472 case LoongArch::BCNEZ:
475 case LoongArch::PseudoBR:
485 if (MO.getTargetFlags())
489 auto MII =
MI.getIterator();
490 auto MIE =
MBB->end();
521 switch (
MI.getOpcode()) {
522 case LoongArch::PCALAU12I: {
523 auto AddI = std::next(MII);
524 if (AddI == MIE || AddI->getOpcode() != LoongArch::ADDI_D)
526 auto Lu32I = std::next(AddI);
527 if (Lu32I == MIE || Lu32I->getOpcode() != LoongArch::LU32I_D)
529 auto MO0 =
MI.getOperand(1).getTargetFlags();
530 auto MO1 = AddI->getOperand(2).getTargetFlags();
531 auto MO2 = Lu32I->getOperand(2).getTargetFlags();
548 case LoongArch::LU52I_D: {
549 auto MO =
MI.getOperand(2).getTargetFlags();
560 if (
STI.hasFeature(LoongArch::FeatureRelax)) {
577 unsigned AddiOp =
STI.is64Bit() ? LoongArch::ADDI_D : LoongArch::ADDI_W;
578 unsigned LdOp =
STI.is64Bit() ? LoongArch::LD_D : LoongArch::LD_W;
579 switch (
MI.getOpcode()) {
580 case LoongArch::PCALAU12I: {
582 auto SecondOp = std::next(MII);
584 if (SecondOp == MIE || SecondOp->getOpcode() != AddiOp)
586 auto Ld = std::next(SecondOp);
587 if (Ld == MIE || Ld->getOpcode() != LdOp)
595 if (SecondOp == MIE ||
596 (SecondOp->getOpcode() != AddiOp && SecondOp->getOpcode() != LdOp))
611 case LoongArch::ADDI_W:
612 case LoongArch::ADDI_D: {
618 case LoongArch::LD_W:
619 case LoongArch::LD_D: {
625 case LoongArch::PseudoDESC_CALL: {
652 int *BytesRemoved)
const {
659 if (!
I->getDesc().isBranch())
665 I->eraseFromParent();
669 if (
I ==
MBB.begin())
672 if (!
I->getDesc().isConditionalBranch())
678 I->eraseFromParent();
691 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
693 "LoongArch branch conditions have at most two components!");
705 for (
unsigned i = 1; i <
Cond.size(); ++i)
728 assert(RS &&
"RegScavenger required for long branching");
730 "new block should be inserted for expanding unconditional branch");
738 bool Has32S =
STI.hasFeature(LoongArch::Feature32S);
742 "Branch offsets outside of the signed 32-bit range not supported");
748 unsigned ADDIOp =
STI.is64Bit() ? LoongArch::ADDI_D : LoongArch::ADDI_W;
769 RS->enterBasicBlockEnd(
MBB);
770 Register Scav = RS->scavengeRegisterBackwards(
771 LoongArch::GPRRegClass, PCAI->
getIterator(),
false,
773 if (Scav != LoongArch::NoRegister)
774 RS->setRegUsed(Scav);
778 Scav = LoongArch::R20;
780 if (FrameIndex == -1)
783 &LoongArch::GPRRegClass,
Register());
790 &LoongArch::GPRRegClass,
Register());
791 TRI->eliminateFrameIndex(RestoreBB.
back(),
803 return LoongArch::BNE;
805 return LoongArch::BEQ;
806 case LoongArch::BEQZ:
807 return LoongArch::BNEZ;
808 case LoongArch::BNEZ:
809 return LoongArch::BEQZ;
810 case LoongArch::BCEQZ:
811 return LoongArch::BCNEZ;
812 case LoongArch::BCNEZ:
813 return LoongArch::BCEQZ;
815 return LoongArch::BGE;
817 return LoongArch::BLT;
818 case LoongArch::BLTU:
819 return LoongArch::BGEU;
820 case LoongArch::BGEU:
821 return LoongArch::BLTU;
827 assert((
Cond.size() &&
Cond.size() <= 3) &&
"Invalid branch condition!");
832std::pair<unsigned, unsigned>
835 return std::make_pair(TF & Mask, TF & ~Mask);
842 static const std::pair<unsigned, const char *> TargetFlags[] = {
843 {MO_CALL,
"loongarch-call"},
844 {MO_CALL_PLT,
"loongarch-call-plt"},
845 {MO_PCREL_HI,
"loongarch-pcrel-hi"},
846 {MO_PCREL_LO,
"loongarch-pcrel-lo"},
847 {MO_PCREL64_LO,
"loongarch-pcrel64-lo"},
848 {MO_PCREL64_HI,
"loongarch-pcrel64-hi"},
849 {MO_GOT_PC_HI,
"loongarch-got-pc-hi"},
850 {MO_GOT_PC_LO,
"loongarch-got-pc-lo"},
851 {MO_GOT_PC64_LO,
"loongarch-got-pc64-lo"},
852 {MO_GOT_PC64_HI,
"loongarch-got-pc64-hi"},
853 {MO_LE_HI,
"loongarch-le-hi"},
854 {MO_LE_LO,
"loongarch-le-lo"},
855 {MO_LE64_LO,
"loongarch-le64-lo"},
856 {MO_LE64_HI,
"loongarch-le64-hi"},
857 {MO_IE_PC_HI,
"loongarch-ie-pc-hi"},
858 {MO_IE_PC_LO,
"loongarch-ie-pc-lo"},
859 {MO_IE_PC64_LO,
"loongarch-ie-pc64-lo"},
860 {MO_IE_PC64_HI,
"loongarch-ie-pc64-hi"},
861 {MO_LD_PC_HI,
"loongarch-ld-pc-hi"},
862 {MO_GD_PC_HI,
"loongarch-gd-pc-hi"},
863 {MO_CALL30,
"loongarch-call30"},
864 {MO_CALL36,
"loongarch-call36"},
865 {MO_DESC_PC_HI,
"loongarch-desc-pc-hi"},
866 {MO_DESC_PC_LO,
"loongarch-desc-pc-lo"},
867 {MO_DESC64_PC_LO,
"loongarch-desc64-pc-lo"},
868 {MO_DESC64_PC_HI,
"loongarch-desc64-pc-hi"},
869 {MO_DESC_LD,
"loongarch-desc-ld"},
870 {MO_DESC_CALL,
"loongarch-desc-call"},
871 {MO_LE_HI_R,
"loongarch-le-hi-r"},
872 {MO_LE_ADD_R,
"loongarch-le-add-r"},
873 {MO_LE_LO_R,
"loongarch-le-lo-r"},
874 {MO_PCADD_HI,
"loongarch-pcadd-hi"},
875 {MO_PCADD_LO,
"loongarch-pcadd-lo"},
876 {MO_GOT_PCADD_HI,
"loongarch-got-pcadd-hi"},
877 {MO_GOT_PCADD_LO,
"loongarch-got-pcadd-lo"},
878 {MO_IE_PCADD_HI,
"loongarch-ie-pcadd-hi"},
879 {MO_IE_PCADD_LO,
"loongarch-ie-pcadd-lo"},
880 {MO_LD_PCADD_HI,
"loongarch-ld-pcadd-hi"},
881 {MO_LD_PCADD_LO,
"loongarch-ld-pcadd-lo"},
882 {MO_GD_PCADD_HI,
"loongarch-gd-pcadd-hi"},
883 {MO_GD_PCADD_LO,
"loongarch-gd-pcadd-lo"},
884 {MO_DESC_PCADD_HI,
"loongarch-pcadd-desc-hi"},
885 {MO_DESC_PCADD_LO,
"loongarch-pcadd-desc-lo"}};
892 static const std::pair<unsigned, const char *> TargetFlags[] = {
893 {MO_RELAX,
"loongarch-relax"}};
901 enum MemIOffsetType {
917 case LoongArch::LDPTR_W:
918 case LoongArch::LDPTR_D:
919 case LoongArch::STPTR_W:
920 case LoongArch::STPTR_D:
923 case LoongArch::LD_B:
924 case LoongArch::LD_H:
925 case LoongArch::LD_W:
926 case LoongArch::LD_D:
927 case LoongArch::LD_BU:
928 case LoongArch::LD_HU:
929 case LoongArch::LD_WU:
930 case LoongArch::ST_B:
931 case LoongArch::ST_H:
932 case LoongArch::ST_W:
933 case LoongArch::ST_D:
934 case LoongArch::FLD_S:
935 case LoongArch::FLD_D:
936 case LoongArch::FST_S:
937 case LoongArch::FST_D:
940 case LoongArch::XVLD:
941 case LoongArch::XVST:
942 case LoongArch::VLDREPL_B:
943 case LoongArch::XVLDREPL_B:
946 case LoongArch::VLDREPL_H:
947 case LoongArch::XVLDREPL_H:
950 case LoongArch::VLDREPL_W:
951 case LoongArch::XVLDREPL_W:
954 case LoongArch::VLDREPL_D:
955 case LoongArch::XVLDREPL_D:
958 case LoongArch::VSTELM_B:
959 case LoongArch::XVSTELM_B:
962 case LoongArch::VSTELM_H:
963 case LoongArch::XVSTELM_H:
966 case LoongArch::VSTELM_W:
967 case LoongArch::XVSTELM_W:
970 case LoongArch::VSTELM_D:
971 case LoongArch::XVSTELM_D:
979 if ((AddrI.
getOpcode() != LoongArch::ADDI_W &&
980 AddrI.
getOpcode() != LoongArch::ADDI_D) ||
986 int64_t NewOffset = OldOffset + Disp;
991 !(OT == Imm12 &&
isInt<12>(NewOffset)) &&
995 !(OT == Imm8 &&
isInt<8>(NewOffset)) &&
1016 "Addressing mode not supported for folding");
1027 case LoongArch::VSTELM_B:
1028 case LoongArch::VSTELM_H:
1029 case LoongArch::VSTELM_W:
1030 case LoongArch::VSTELM_D:
1031 case LoongArch::XVSTELM_B:
1032 case LoongArch::XVSTELM_H:
1033 case LoongArch::XVSTELM_W:
1034 case LoongArch::XVSTELM_D:
1047 return MI.getOpcode() == LoongArch::ADDI_W &&
MI.getOperand(1).isReg() &&
1048 MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0;
static void parseCondBranch(MachineInstr *LastInst, MachineBasicBlock *&Target, SmallVectorImpl< MachineOperand > &Cond)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
static unsigned getOppositeBranchOpc(unsigned Opcode)
static cl::opt< bool > DisableRelocSched("loongarch-disable-reloc-sched", cl::desc("Disable scheduling of instructions with target flags"), cl::init(false), cl::Hidden)
Register const TargetRegisterInfo * TRI
Promote Memory to Register
uint64_t IntrinsicInst * II
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
This file declares the machine register scavenger class.
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, Register DstReg, Register SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override
ArrayRef< std::pair< unsigned, const char * > > getSerializableBitmaskMachineOperandTargetFlags() const override
const LoongArchSubtarget & STI
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
bool isSafeToMove(const MachineInstr &MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const override
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool IsKill, int FrameIndex, const TargetRegisterClass *RC, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
std::pair< unsigned, unsigned > decomposeMachineOperandsTargetFlags(unsigned TF) const override
bool isAsCheapAsAMove(const MachineInstr &MI) const override
MCInst getNop() const override
LoongArchInstrInfo(const LoongArchSubtarget &STI)
ArrayRef< std::pair< unsigned, const char * > > getSerializableDirectMachineOperandTargetFlags() const override
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const override
void movImm(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, Register DstReg, uint64_t Val, MachineInstr::MIFlag Flag=MachineInstr::NoFlags) const
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &dl, int *BytesAdded=nullptr) const override
void insertIndirectBranch(MachineBasicBlock &MBB, MachineBasicBlock &NewDestBB, MachineBasicBlock &RestoreBB, const DebugLoc &DL, int64_t BrOffset, RegScavenger *RS) const override
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DstReg, int FrameIndex, const TargetRegisterClass *RC, Register VReg, unsigned SubReg=0, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const override
bool isSchedulingBoundary(const MachineInstr &MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const override
bool isBranchOffsetInRange(unsigned BranchOpc, int64_t BrOffset) const override
bool canFoldIntoAddrMode(const MachineInstr &MemI, Register Reg, const MachineInstr &AddrI, ExtAddrMode &AM) const override
unsigned getInstSizeInBytes(const MachineInstr &MI) const override
MachineBasicBlock * getBranchDestBlock(const MachineInstr &MI) const override
MachineInstr * emitLdStWithAddr(MachineInstr &MemI, const ExtAddrMode &AM) const override
LoongArchMachineFunctionInfo - This class is derived from MachineFunctionInfo and contains private Lo...
int getBranchRelaxationSpillFrameIndex()
This class is intended to be used as a base class for asm properties and features specific to the tar...
LLVM_ABI MCSymbol * createNamedTempSymbol()
Create a temporary symbol with a unique name whose name cannot be omitted in the symbol table.
MCInstBuilder & addReg(MCRegister Reg)
Add a new register operand.
MCInstBuilder & addImm(int64_t Val)
Add a new integer immediate operand.
Instances of this class represent a single low-level machine instruction.
Describe properties that are true of each instruction in the target description file.
bool isConditionalBranch() const
Return true if this is a branch which may fall through to the next instruction or may transfer contro...
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
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.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const MachineInstrBuilder & setMemRefs(ArrayRef< MachineMemOperand * > MMOs) const
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 & add(const MachineOperand &MO) const
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
const MachineInstrBuilder & setMIFlags(unsigned Flags) const
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
reverse_iterator getReverse() const
Get a reverse iterator to the same node.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineBasicBlock * getParent() const
LLVM_ABI void setPreInstrSymbol(MachineFunction &MF, MCSymbol *Symbol)
Set a symbol that will be emitted just prior to the instruction itself.
LLVM_ABI unsigned getNumExplicitOperands() const
Returns the number of non-implicit operands.
bool mayLoad(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read memory.
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
ArrayRef< MachineMemOperand * > memoperands() const
Access to memory operands of the instruction.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
uint32_t getFlags() const
Return the MI flags bitvector.
A description of a memory reference used in the backend.
@ MOLoad
The memory access reads data.
@ MOStore
The memory access writes data.
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineBasicBlock * getMBB() const
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
void setMBB(MachineBasicBlock *MBB)
static MachineOperand CreateImm(int64_t Val)
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
LLVM_ABI void clearVirtRegs()
clearVirtRegs - Remove all virtual registers (after physreg assignment).
LLVM_ABI void replaceRegWith(Register FromReg, Register ToReg)
replaceRegWith - Replace all instances of FromReg with ToReg in the machine function.
Wrapper class representing virtual and physical registers.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
MI-level Statepoint operands.
uint32_t getNumPatchBytes() const
Return the number of patchable bytes the given statepoint should emit.
virtual bool isSchedulingBoundary(const MachineInstr &MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const
Test if the given instruction should be considered a scheduling boundary.
const MCAsmInfo & getMCAsmInfo() const
Return target specific asm information.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
Target - Wrapper for Target specific information.
static constexpr TypeSize getFixed(ScalarTy ExactSize)
static constexpr TypeSize getZero()
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static unsigned getDirectFlags(const MachineOperand &MO)
InstSeq generateInstSeq(int64_t Val)
bool isSEXT_W(const MachineInstr &MI)
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.
@ Kill
The last use of a register.
constexpr RegState getKillRegState(bool B)
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
constexpr RegState getDefRegState(bool B)
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr bool isShiftedInt(int64_t x)
Checks if a signed integer is an N bit number shifted left by S.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
Used to describe addressing mode similar to ExtAddrMode in CodeGenPrepare.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.