13#ifndef LLVM_LIB_TARGET_ARM_ARMBASEINSTRINFO_H 
   14#define LLVM_LIB_TARGET_ARM_ARMBASEINSTRINFO_H 
   29#include "llvm/IR/IntrinsicsARM.h" 
   34#define GET_INSTRINFO_HEADER 
   35#include "ARMGenInstrInfo.inc" 
   39class ARMBaseRegisterInfo;
 
   50                                unsigned LoadImmOpc, 
unsigned LoadOpc) 
const;
 
  108                                       unsigned OpIdx2) 
const override;
 
  112  std::optional<DestSourcePair>
 
  117  std::optional<ParamLoadedValue>
 
  147                     bool AllowModify = 
false) 
const override;
 
  149                        int *BytesRemoved = 
nullptr) 
const override;
 
  153                        int *BytesAdded = 
nullptr) 
const override;
 
  168    int PIdx = 
MI.findFirstPredOperandIdx();
 
 
  180                         bool SkipDead) 
const override;
 
  192                               int &FrameIndex) 
const override;
 
  194                              int &FrameIndex) 
const override;
 
  196                                     int &FrameIndex) 
const override;
 
  198                                    int &FrameIndex) 
const override;
 
  209                   bool KillSrc, 
bool RenamableDest = 
false,
 
  210                   bool RenamableSrc = 
false) 
const override;
 
  238                                     unsigned SubIdx, 
unsigned State,
 
  250                               int64_t &Offset2) 
const override;
 
  261                               int64_t Offset1, int64_t Offset2,
 
  262                               unsigned NumLoads) 
const override;
 
  269                           unsigned NumCycles, 
unsigned ExtraPredCycles,
 
  274                           unsigned NumF, 
unsigned ExtraF,
 
  279    return NumCycles == 1;
 
 
  283                                            unsigned NumInsts) 
const override;
 
  294                      Register &SrcReg2, int64_t &CmpMask,
 
  295                      int64_t &CmpValue) 
const override;
 
  302                            Register SrcReg2, int64_t CmpMask, int64_t CmpValue,
 
  307                     unsigned &FalseOp, 
bool &Optimizable) 
const override;
 
  311                               bool) 
const override;
 
  325                                            unsigned UseIdx) 
const override;
 
  327                                            SDNode *DefNode, 
unsigned DefIdx,
 
  329                                            unsigned UseIdx) 
const override;
 
  332  std::pair<uint16_t, uint16_t>
 
  345  std::pair<unsigned, unsigned>
 
  354                                   bool OutlineFromLinkOnceODRs) 
const override;
 
  355  std::optional<std::unique_ptr<outliner::OutlinedFunction>>
 
  358      std::vector<outliner::Candidate> &RepeatedSequenceLocs,
 
  359      unsigned MinRepeats) 
const override;
 
  361      Function &
F, std::vector<outliner::Candidate> &Candidates) 
const override;
 
  364                                           unsigned Flags) 
const override;
 
  366                              unsigned &Flags) 
const override;
 
  378    return MI->getOpcode() == ARM::t2LoopEndDec ||
 
  379           MI->getOpcode() == ARM::t2DoLoopStartTP ||
 
  380           MI->getOpcode() == ARM::t2WhileLoopStartLR ||
 
  381           MI->getOpcode() == ARM::t2WhileLoopStartTP;
 
 
  386  std::unique_ptr<TargetInstrInfo::PipelinerLoopInfo>
 
  399                     bool CFI, 
bool Auth) 
const;
 
  424                                          unsigned DefClass, 
unsigned DefIdx,
 
  425                                          unsigned DefAlign) 
const;
 
  428                                         unsigned DefClass, 
unsigned DefIdx,
 
  429                                         unsigned DefAlign) 
const;
 
  432                                          unsigned UseClass, 
unsigned UseIdx,
 
  433                                          unsigned UseAlign) 
const;
 
  436                                         unsigned UseClass, 
unsigned UseIdx,
 
  437                                         unsigned UseAlign) 
const;
 
  440                                            unsigned DefIdx, 
unsigned DefAlign,
 
  443                                            unsigned UseAlign) 
const;
 
  445  std::optional<unsigned> getOperandLatencyImpl(
 
  447      unsigned DefIdx, 
const MCInstrDesc &DefMCID, 
unsigned DefAdj,
 
  449      unsigned UseIdx, 
const MCInstrDesc &UseMCID, 
unsigned UseAdj) 
const;
 
  451  unsigned getPredicationCost(
const MachineInstr &
MI) 
const override;
 
  455                           unsigned *PredCost = 
nullptr) 
const override;
 
  464                             unsigned UseIdx) 
const override;
 
  467                        unsigned DefIdx) 
const override;
 
  482  bool isReMaterializableImpl(
const MachineInstr &
MI) 
const override;
 
  499    return MLxEntryMap.count(Opcode);
 
 
  506                          unsigned &AddSubOpc, 
bool &NegAcc,
 
  507                          bool &HasLane) 
const;
 
  513    return MLxHazardOpcodes.count(Opcode);
 
 
  530    return MI.getOperand(3).getReg();
 
 
 
  541                                                    unsigned PredReg = 0) {
 
 
  563  return Opc == ARM::B || 
Opc == ARM::tB || 
Opc == ARM::t2B;
 
 
  570  return Opc == ARM::MVE_VPTv16i8 || 
Opc == ARM::MVE_VPTv16u8 ||
 
  571         Opc == ARM::MVE_VPTv16s8 || 
Opc == ARM::MVE_VPTv8i16 ||
 
  572         Opc == ARM::MVE_VPTv8u16 || 
Opc == ARM::MVE_VPTv8s16 ||
 
  573         Opc == ARM::MVE_VPTv4i32 || 
Opc == ARM::MVE_VPTv4u32 ||
 
  574         Opc == ARM::MVE_VPTv4s32 || 
Opc == ARM::MVE_VPTv4f32 ||
 
  575         Opc == ARM::MVE_VPTv8f16 || 
Opc == ARM::MVE_VPTv16i8r ||
 
  576         Opc == ARM::MVE_VPTv16u8r || 
Opc == ARM::MVE_VPTv16s8r ||
 
  577         Opc == ARM::MVE_VPTv8i16r || 
Opc == ARM::MVE_VPTv8u16r ||
 
  578         Opc == ARM::MVE_VPTv8s16r || 
Opc == ARM::MVE_VPTv4i32r ||
 
  579         Opc == ARM::MVE_VPTv4u32r || 
Opc == ARM::MVE_VPTv4s32r ||
 
  580         Opc == ARM::MVE_VPTv4f32r || 
Opc == ARM::MVE_VPTv8f16r ||
 
  581         Opc == ARM::MVE_VPST;
 
 
  589  case ARM::MVE_VCMPf32:
 
  590    return ARM::MVE_VPTv4f32;
 
  591  case ARM::MVE_VCMPf16:
 
  592    return ARM::MVE_VPTv8f16;
 
  593  case ARM::MVE_VCMPi8:
 
  594    return ARM::MVE_VPTv16i8;
 
  595  case ARM::MVE_VCMPi16:
 
  596    return ARM::MVE_VPTv8i16;
 
  597  case ARM::MVE_VCMPi32:
 
  598    return ARM::MVE_VPTv4i32;
 
  599  case ARM::MVE_VCMPu8:
 
  600    return ARM::MVE_VPTv16u8;
 
  601  case ARM::MVE_VCMPu16:
 
  602    return ARM::MVE_VPTv8u16;
 
  603  case ARM::MVE_VCMPu32:
 
  604    return ARM::MVE_VPTv4u32;
 
  605  case ARM::MVE_VCMPs8:
 
  606    return ARM::MVE_VPTv16s8;
 
  607  case ARM::MVE_VCMPs16:
 
  608    return ARM::MVE_VPTv8s16;
 
  609  case ARM::MVE_VCMPs32:
 
  610    return ARM::MVE_VPTv4s32;
 
  612  case ARM::MVE_VCMPf32r:
 
  613    return ARM::MVE_VPTv4f32r;
 
  614  case ARM::MVE_VCMPf16r:
 
  615    return ARM::MVE_VPTv8f16r;
 
  616  case ARM::MVE_VCMPi8r:
 
  617    return ARM::MVE_VPTv16i8r;
 
  618  case ARM::MVE_VCMPi16r:
 
  619    return ARM::MVE_VPTv8i16r;
 
  620  case ARM::MVE_VCMPi32r:
 
  621    return ARM::MVE_VPTv4i32r;
 
  622  case ARM::MVE_VCMPu8r:
 
  623    return ARM::MVE_VPTv16u8r;
 
  624  case ARM::MVE_VCMPu16r:
 
  625    return ARM::MVE_VPTv8u16r;
 
  626  case ARM::MVE_VCMPu32r:
 
  627    return ARM::MVE_VPTv4u32r;
 
  628  case ARM::MVE_VCMPs8r:
 
  629    return ARM::MVE_VPTv16s8r;
 
  630  case ARM::MVE_VCMPs16r:
 
  631    return ARM::MVE_VPTv8s16r;
 
  632  case ARM::MVE_VCMPs32r:
 
  633    return ARM::MVE_VPTv4s32r;
 
 
  639  return Opc == ARM::Bcc || 
Opc == ARM::tBcc || 
Opc == ARM::t2Bcc;
 
 
  643  return Opc == ARM::BR_JTr || 
Opc == ARM::BR_JTm_i12 ||
 
  644         Opc == ARM::BR_JTm_rs || 
Opc == ARM::BR_JTadd || 
Opc == ARM::tBR_JTr ||
 
 
  650  return Opc == ARM::BX || 
Opc == ARM::MOVPCRX || 
Opc == ARM::tBRIND;
 
 
  654  int Opc = 
MI.getOpcode();
 
  660  case ARM::BLX_pred_noip:
 
  662  case ARM::BMOVPCRX_CALL:
 
  663  case ARM::TCRETURNri:
 
  664  case ARM::TCRETURNrinotr12:
 
  668  case ARM::tBLXr_noip:
 
  670  case ARM::tBLXNS_CALL:
 
  678  case ARM::BMOVPCB_CALL:
 
  681  case ARM::TCRETURNdi:
 
  691  case ARM::tBL_PUSHLR:
 
  692  case ARM::tTAILJMPdND:
 
 
  703  int opc = 
MI.getOpcode();
 
 
  709  return Opc == ARM::SpeculationBarrierISBDSBEndBB ||
 
  710         Opc == ARM::SpeculationBarrierSBEndBB ||
 
  711         Opc == ARM::t2SpeculationBarrierISBDSBEndBB ||
 
  712         Opc == ARM::t2SpeculationBarrierSBEndBB;
 
 
  716  return Opc == ARM::tPOP_RET || 
Opc == ARM::LDMIA_RET ||
 
  717         Opc == ARM::t2LDMIA_RET || 
Opc == ARM::tPOP || 
Opc == ARM::LDMIA_UPD ||
 
  718         Opc == ARM::t2LDMIA_UPD || 
Opc == ARM::VLDMDIA_UPD;
 
 
  722  return Opc == ARM::tPUSH || 
Opc == ARM::t2STMDB_UPD ||
 
  723         Opc == ARM::STMDB_UPD || 
Opc == ARM::VSTMDDB_UPD;
 
 
  727  return Opc == ARM::SUBri ||
 
  728         Opc == ARM::tSUBi3 || 
Opc == ARM::tSUBi8 ||
 
  729         Opc == ARM::tSUBSi3 || 
Opc == ARM::tSUBSi8 ||
 
  730         Opc == ARM::t2SUBri || 
Opc == ARM::t2SUBri12 || 
Opc == ARM::t2SUBSri;
 
 
  734  return Opc == ARM::MOVr || 
Opc == ARM::tMOVr || 
Opc == ARM::t2MOVr;
 
 
  747  if (featureBits[ARM::HasV8Ops] && (Num & 0xE) != 0xE)
 
  752  if (featureBits[ARM::HasV8_1MMainlineOps] &&
 
  753      ((Num & 0xE) == 0x8 || (Num & 0xE) == 0xE))
 
 
  760  unsigned Opc = 
MI.getOpcode();
 
  762  case ARM::SEH_StackAlloc:
 
  763  case ARM::SEH_SaveRegs:
 
  764  case ARM::SEH_SaveRegs_Ret:
 
  765  case ARM::SEH_SaveSP:
 
  766  case ARM::SEH_SaveFRegs:
 
  767  case ARM::SEH_SaveLR:
 
  769  case ARM::SEH_Nop_Ret:
 
  770  case ARM::SEH_PrologEnd:
 
  771  case ARM::SEH_EpilogStart:
 
  772  case ARM::SEH_EpilogEnd:
 
 
  799                             const ARMBaseInstrInfo &
TII, 
unsigned MIFlags = 0);
 
  806                            const ARMBaseInstrInfo &
TII, 
unsigned MIFlags = 0);
 
  811                               const TargetInstrInfo &
TII,
 
  812                               const ARMBaseRegisterInfo &
MRI,
 
  813                               unsigned MIFlags = 0);
 
  821                                MachineFunction &MF, MachineInstr *
MI,
 
  830                          const ARMBaseInstrInfo &
TII);
 
  834                         const ARMBaseInstrInfo &
TII,
 
  835                         const TargetRegisterInfo *
TRI);
 
  840                            const TargetRegisterInfo *
TRI);
 
  845                                   const TargetRegisterInfo *
TRI);
 
  858                                     const ARMSubtarget *Subtarget,
 
  859                                     bool ForCodesize = 
false);
 
  865                                         const ARMSubtarget *Subtarget,
 
  866                                         bool ForCodesize = 
false);
 
  873  switch (
MI.getOpcode()) {
 
  890  return Scale * 
MI.getOperand(ImmOp).getImm();
 
 
  901    return std::abs(Imm) < ((1 << 7) * 1);
 
  903    return std::abs(Imm) < ((1 << 7) * 2) && Imm % 2 == 0;
 
  905    return std::abs(Imm) < ((1 << 7) * 4) && Imm % 4 == 0;
 
  907    return std::abs(Imm) < ((1 << 8) * 1);
 
  909    return Imm >= 0 && Imm < ((1 << 8) * 1);
 
  911    return Imm < 0 && -Imm < ((1 << 8) * 1);
 
  913    return std::abs(Imm) < ((1 << 8) * 4) && Imm % 4 == 0;
 
  915    return Imm >= 0 && Imm < ((1 << 12) * 1);
 
  917    return std::abs(Imm) < ((1 << 12) * 1);
 
 
  925  if (IntInst == 
nullptr)
 
  928  return (IntrinsicID == Intrinsic::masked_gather ||
 
  929          IntrinsicID == Intrinsic::arm_mve_vldr_gather_base ||
 
  930          IntrinsicID == Intrinsic::arm_mve_vldr_gather_base_predicated ||
 
  931          IntrinsicID == Intrinsic::arm_mve_vldr_gather_base_wb ||
 
  932          IntrinsicID == Intrinsic::arm_mve_vldr_gather_base_wb_predicated ||
 
  933          IntrinsicID == Intrinsic::arm_mve_vldr_gather_offset ||
 
  934          IntrinsicID == Intrinsic::arm_mve_vldr_gather_offset_predicated);
 
 
  939  if (IntInst == 
nullptr)
 
  942  return (IntrinsicID == Intrinsic::masked_scatter ||
 
  943          IntrinsicID == Intrinsic::arm_mve_vstr_scatter_base ||
 
  944          IntrinsicID == Intrinsic::arm_mve_vstr_scatter_base_predicated ||
 
  945          IntrinsicID == Intrinsic::arm_mve_vstr_scatter_base_wb ||
 
  946          IntrinsicID == Intrinsic::arm_mve_vstr_scatter_base_wb_predicated ||
 
  947          IntrinsicID == Intrinsic::arm_mve_vstr_scatter_offset ||
 
  948          IntrinsicID == Intrinsic::arm_mve_vstr_scatter_offset_predicated);
 
 
  953  if (IntInst == 
nullptr)
 
 
  965  switch (
MI->getOpcode()) {
 
  970  case ARM::MVE_SQRSHR:
 
  971  case ARM::MVE_UQRSHL:
 
  977  case ARM::MVE_SQRSHRL:
 
  978  case ARM::MVE_SQSHLL:
 
  979  case ARM::MVE_SRSHRL:
 
  980  case ARM::MVE_UQRSHLL:
 
  981  case ARM::MVE_UQSHLL:
 
  982  case ARM::MVE_URSHRL:
 
 
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file defines the DenseMap class.
const HexagonInstrInfo * TII
TargetInstrInfo::RegSubRegPair RegSubRegPair
Register const TargetRegisterInfo * TRI
Promote Memory to Register
MachineInstr unsigned OpIdx
uint64_t IntrinsicInst * II
PowerPC TLS Dynamic Call Fixup
TargetInstrInfo::RegSubRegPairAndIdx RegSubRegPairAndIdx
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
bool isDead(const MachineInstr &MI, const MachineRegisterInfo &MRI)
This file defines the SmallSet class.
static void expandLoadStackGuard(MachineInstrBuilder &MIB, const TargetInstrInfo &TII)
bool isUnspillableTerminatorImpl(const MachineInstr *MI) const override
static bool isCPSRDefined(const MachineInstr &MI)
bool optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg, Register SrcReg2, int64_t CmpMask, int64_t CmpValue, const MachineRegisterInfo *MRI) const override
optimizeCompareInstr - Convert the instruction to set the zero flag so that we can remove a "comparis...
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
ScheduleHazardRecognizer * CreateTargetHazardRecognizer(const TargetSubtargetInfo *STI, const ScheduleDAG *DAG) const override
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, const DebugLoc &DL, Register DestReg, Register SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override
bool foldImmediate(MachineInstr &UseMI, MachineInstr &DefMI, Register Reg, MachineRegisterInfo *MRI) const override
foldImmediate - 'Reg' is known to be defined by a move immediate instruction, try to fold the immedia...
bool canCauseFpMLxStall(unsigned Opcode) const
canCauseFpMLxStall - Return true if an instruction of the specified opcode will cause stalls when sch...
std::pair< unsigned, unsigned > decomposeMachineOperandsTargetFlags(unsigned TF) const override
bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, unsigned ExtraPredCycles, BranchProbability Probability) const override
bool ClobbersPredicate(MachineInstr &MI, std::vector< MachineOperand > &Pred, bool SkipDead) const override
const MachineInstrBuilder & AddDReg(MachineInstrBuilder &MIB, unsigned Reg, unsigned SubIdx, unsigned State, const TargetRegisterInfo *TRI) const
void copyFromCPSR(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, MCRegister DestReg, bool KillSrc, const ARMSubtarget &Subtarget) const
unsigned getNumMicroOps(const InstrItineraryData *ItinData, const MachineInstr &MI) const override
virtual unsigned getUnindexedOpcode(unsigned Opc) const =0
std::optional< RegImmPair > isAddImmediate(const MachineInstr &MI, Register Reg) const override
unsigned getPartialRegUpdateClearance(const MachineInstr &, unsigned, const TargetRegisterInfo *) const override
unsigned getNumLDMAddresses(const MachineInstr &MI) const
Get the number of addresses by LDM or VLDM or zero for unknown.
bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, BranchProbability Probability) const override
MachineInstr * optimizeSelect(MachineInstr &MI, SmallPtrSetImpl< MachineInstr * > &SeenMIs, bool) const override
bool produceSameValue(const MachineInstr &MI0, const MachineInstr &MI1, const MachineRegisterInfo *MRI) const override
void setExecutionDomain(MachineInstr &MI, unsigned Domain) const override
ArrayRef< std::pair< unsigned, const char * > > getSerializableBitmaskMachineOperandTargetFlags() const override
virtual const ARMBaseRegisterInfo & getRegisterInfo() const =0
ScheduleHazardRecognizer * CreateTargetPostRAHazardRecognizer(const InstrItineraryData *II, const ScheduleDAG *DAG) const override
std::unique_ptr< TargetInstrInfo::PipelinerLoopInfo > analyzeLoopForPipelining(MachineBasicBlock *LoopBB) const override
Analyze loop L, which must be a single-basic-block loop, and if the conditions can be understood enou...
unsigned getInstSizeInBytes(const MachineInstr &MI) const override
GetInstSize - Returns the size of the specified MachineInstr.
void copyToCPSR(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, MCRegister SrcReg, bool KillSrc, const ARMSubtarget &Subtarget) const
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
void mergeOutliningCandidateAttributes(Function &F, std::vector< outliner::Candidate > &Candidates) const override
ARMCC::CondCodes getPredicate(const MachineInstr &MI) const
bool isFunctionSafeToOutlineFrom(MachineFunction &MF, bool OutlineFromLinkOnceODRs) const override
ARM supports the MachineOutliner.
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register DestReg, unsigned SubIdx, const MachineInstr &Orig, const TargetRegisterInfo &TRI) const override
bool shouldOutlineFromFunctionByDefault(MachineFunction &MF) const override
Enable outlining by default at -Oz.
std::optional< DestSourcePair > isCopyInstrImpl(const MachineInstr &MI) const override
If the specific machine instruction is an instruction that moves/copies value from one register to an...
MachineInstr & duplicate(MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertBefore, const MachineInstr &Orig) const override
ScheduleHazardRecognizer * CreateTargetMIHazardRecognizer(const InstrItineraryData *II, const ScheduleDAGMI *DAG) const override
MachineBasicBlock::iterator insertOutlinedCall(Module &M, MachineBasicBlock &MBB, MachineBasicBlock::iterator &It, MachineFunction &MF, outliner::Candidate &C) const override
ARMBaseInstrInfo(const ARMSubtarget &STI)
std::string createMIROperandComment(const MachineInstr &MI, const MachineOperand &Op, unsigned OpIdx, const TargetRegisterInfo *TRI) const override
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
bool isPredicated(const MachineInstr &MI) const override
bool isSchedulingBoundary(const MachineInstr &MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const override
void expandLoadStackGuardBase(MachineBasicBlock::iterator MI, unsigned LoadImmOpc, unsigned LoadOpc) const
bool isPredicable(const MachineInstr &MI) const override
isPredicable - Return true if the specified instruction can be predicated.
unsigned getFramePred(const MachineInstr &MI) const
Returns predicate register associated with the given frame instruction.
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
Register isLoadFromStackSlotPostFE(const MachineInstr &MI, int &FrameIndex) const override
std::optional< ParamLoadedValue > describeLoadedValue(const MachineInstr &MI, Register Reg) const override
Specialization of TargetInstrInfo::describeLoadedValue, used to enhance debug entry value description...
std::optional< std::unique_ptr< outliner::OutlinedFunction > > getOutliningCandidateInfo(const MachineModuleInfo &MMI, std::vector< outliner::Candidate > &RepeatedSequenceLocs, unsigned MinRepeats) const override
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify=false) const override
unsigned extraSizeToPredicateInstructions(const MachineFunction &MF, unsigned NumInsts) const override
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
bool areLoadsFromSameBasePtr(SDNode *Load1, SDNode *Load2, int64_t &Offset1, int64_t &Offset2) const override
areLoadsFromSameBasePtr - This is used by the pre-regalloc scheduler to determine if two loads are lo...
std::optional< unsigned > getOperandLatency(const InstrItineraryData *ItinData, const MachineInstr &DefMI, unsigned DefIdx, const MachineInstr &UseMI, unsigned UseIdx) const override
bool getRegSequenceLikeInputs(const MachineInstr &MI, unsigned DefIdx, SmallVectorImpl< RegSubRegPairAndIdx > &InputRegs) const override
Build the equivalent inputs of a REG_SEQUENCE for the given MI and DefIdx.
unsigned predictBranchSizeForIfCvt(MachineInstr &MI) const override
bool getInsertSubregLikeInputs(const MachineInstr &MI, unsigned DefIdx, RegSubRegPair &BaseReg, RegSubRegPairAndIdx &InsertedReg) const override
Build the equivalent inputs of a INSERT_SUBREG for the given MI and DefIdx.
bool expandPostRAPseudo(MachineInstr &MI) const override
outliner::InstrType getOutliningTypeImpl(const MachineModuleInfo &MMI, MachineBasicBlock::iterator &MIT, unsigned Flags) const override
bool SubsumesPredicate(ArrayRef< MachineOperand > Pred1, ArrayRef< MachineOperand > Pred2) const override
bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2, int64_t Offset1, int64_t Offset2, unsigned NumLoads) const override
shouldScheduleLoadsNear - This is a used by the pre-regalloc scheduler to determine (in conjunction w...
bool PredicateInstruction(MachineInstr &MI, ArrayRef< MachineOperand > Pred) const override
std::pair< uint16_t, uint16_t > getExecutionDomain(const MachineInstr &MI) const override
VFP/NEON execution domains.
bool isProfitableToUnpredicate(MachineBasicBlock &TMBB, MachineBasicBlock &FMBB) const override
bool isFpMLxInstruction(unsigned Opcode) const
isFpMLxInstruction - Return true if the specified opcode is a fp MLA / MLS instruction.
bool isSwiftFastImmShift(const MachineInstr *MI) const
Returns true if the instruction has a shift by immediate that can be executed in one cycle less.
ArrayRef< std::pair< unsigned, const char * > > getSerializableDirectMachineOperandTargetFlags() const override
Register isStoreToStackSlotPostFE(const MachineInstr &MI, int &FrameIndex) const override
bool analyzeCompare(const MachineInstr &MI, Register &SrcReg, Register &SrcReg2, int64_t &CmpMask, int64_t &CmpValue) const override
analyzeCompare - For a comparison instruction, return the source registers in SrcReg and SrcReg2 if h...
Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const override
void breakPartialRegDependency(MachineInstr &, unsigned, const TargetRegisterInfo *TRI) const override
bool isMBBSafeToOutlineFrom(MachineBasicBlock &MBB, unsigned &Flags) const override
void buildOutlinedFrame(MachineBasicBlock &MBB, MachineFunction &MF, const outliner::OutlinedFunction &OF) const override
Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const override
const ARMSubtarget & getSubtarget() const
MachineInstr * commuteInstructionImpl(MachineInstr &MI, bool NewMI, unsigned OpIdx1, unsigned OpIdx2) const override
Commutes the operands in the given instruction.
bool analyzeSelect(const MachineInstr &MI, SmallVectorImpl< MachineOperand > &Cond, unsigned &TrueOp, unsigned &FalseOp, bool &Optimizable) const override
bool getExtractSubregLikeInputs(const MachineInstr &MI, unsigned DefIdx, RegSubRegPairAndIdx &InputReg) const override
Build the equivalent inputs of a EXTRACT_SUBREG for the given MI and DefIdx.
bool shouldSink(const MachineInstr &MI) const override
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Container class for subtarget features.
Itinerary data supplied by a subtarget to be used by a target.
A wrapper class for inspecting calls to intrinsic functions.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Describe properties that are true of each instruction in the target description file.
Wrapper class representing physical registers. Should be passed by value.
MachineInstrBundleIterator< MachineInstr > iterator
Representation of each machine instruction.
This class contains meta information specific to a module.
MachineOperand class - Representation of each machine instruction operand.
static MachineOperand CreateImm(int64_t Val)
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
A Module instance is used to store all the information related to an LLVM module.
Wrapper class representing virtual and physical registers.
Represents one node in the SelectionDAG.
ScheduleDAGMI is an implementation of ScheduleDAGInstrs that simply schedules machine instructions ac...
HazardRecognizer - This determines whether or not an instruction can be issued this cycle,...
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
StringRef - Represent a constant reference to a string, i.e.
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Provide an instruction scheduling machine model to CodeGen passes.
TargetSubtargetInfo - Generic base class for all target subtargets.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
InstrType
Represents how an instruction should be mapped by the outliner.
This is an optimization pass for GlobalISel generic memory operations.
static bool isIndirectCall(const MachineInstr &MI)
MachineInstr * findCMPToFoldIntoCBZ(MachineInstr *Br, const TargetRegisterInfo *TRI)
Search backwards from a tBcc to find a tCMPi8 against 0, meaning we can convert them to a tCBZ or tCB...
static bool isCondBranchOpcode(int Opc)
bool HasLowerConstantMaterializationCost(unsigned Val1, unsigned Val2, const ARMSubtarget *Subtarget, bool ForCodesize=false)
Returns true if Val1 has a lower Constant Materialization Cost than Val2.
static bool isPushOpcode(int Opc)
void addPredicatedMveVpredNOp(MachineInstrBuilder &MIB, unsigned Cond)
unsigned getBLXpredOpcode(const MachineFunction &MF)
static bool isIndirectBranchOpcode(int Opc)
static bool isVPTOpcode(int Opc)
bool isLegalAddressImm(unsigned Opcode, int Imm, const TargetInstrInfo *TII)
bool rewriteT2FrameIndex(MachineInstr &MI, unsigned FrameRegIdx, Register FrameReg, int &Offset, const ARMBaseInstrInfo &TII, const TargetRegisterInfo *TRI)
bool registerDefinedBetween(unsigned Reg, MachineBasicBlock::iterator From, MachineBasicBlock::iterator To, const TargetRegisterInfo *TRI)
Return true if Reg is defd between From and To.
static std::array< MachineOperand, 2 > predOps(ARMCC::CondCodes Pred, unsigned PredReg=0)
Get the operands corresponding to the given Pred value.
static bool isMovRegOpcode(int Opc)
bool isGather(IntrinsicInst *IntInst)
static bool isSEHInstruction(const MachineInstr &MI)
static bool isSubImmOpcode(int Opc)
bool isGatherScatter(IntrinsicInst *IntInst)
bool tryFoldSPUpdateIntoPushPop(const ARMSubtarget &Subtarget, MachineFunction &MF, MachineInstr *MI, unsigned NumBytes)
Tries to add registers to the reglist of a given base-updating push/pop instruction to adjust the sta...
static bool isJumpTableBranchOpcode(int Opc)
bool isMVEVectorInstruction(const MachineInstr *MI)
static bool isPopOpcode(int Opc)
void addPredicatedMveVpredROp(MachineInstrBuilder &MIB, unsigned Cond, unsigned Inactive)
static bool isValidCoprocessorNumber(unsigned Num, const FeatureBitset &featureBits)
isValidCoprocessorNumber - decide whether an explicit coprocessor number is legal in generic instruct...
void addUnpredicatedMveVpredROp(MachineInstrBuilder &MIB, Register DestReg)
unsigned ConstantMaterializationCost(unsigned Val, const ARMSubtarget *Subtarget, bool ForCodesize=false)
Returns the number of instructions required to materialize the given constant in a register,...
bool rewriteARMFrameIndex(MachineInstr &MI, unsigned FrameRegIdx, Register FrameReg, int &Offset, const ARMBaseInstrInfo &TII)
rewriteARMFrameIndex / rewriteT2FrameIndex - Rewrite MI to access 'Offset' bytes from the FP.
static bool isIndirectControlFlowNotComingBack(const MachineInstr &MI)
void emitThumbRegPlusImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, const DebugLoc &dl, Register DestReg, Register BaseReg, int NumBytes, const TargetInstrInfo &TII, const ARMBaseRegisterInfo &MRI, unsigned MIFlags=0)
emitThumbRegPlusImmediate - Emits a series of instructions to materialize a destreg = basereg + immed...
ARMCC::CondCodes getInstrPredicate(const MachineInstr &MI, Register &PredReg)
getInstrPredicate - If instruction is predicated, returns its predicate condition,...
unsigned getMatchingCondBranchOpcode(unsigned Opc)
DWARFExpression::Operation Op
static bool isUncondBranchOpcode(int Opc)
bool isScatter(IntrinsicInst *IntInst)
static MachineOperand t1CondCodeOp(bool isDead=false)
Get the operand corresponding to the conditional code result for Thumb1.
static unsigned VCMPOpcodeToVPT(unsigned Opcode)
static MachineOperand condCodeOp(unsigned CCReg=0)
Get the operand corresponding to the conditional code result.
unsigned gettBLXrOpcode(const MachineFunction &MF)
int getAddSubImmediate(MachineInstr &MI)
static bool isSpeculationBarrierEndBBOpcode(int Opc)
unsigned getBLXOpcode(const MachineFunction &MF)
void addUnpredicatedMveVpredNOp(MachineInstrBuilder &MIB)
void emitARMRegPlusImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, const DebugLoc &dl, Register DestReg, Register BaseReg, int NumBytes, ARMCC::CondCodes Pred, Register PredReg, const ARMBaseInstrInfo &TII, unsigned MIFlags=0)
emitARMRegPlusImmediate / emitT2RegPlusImmediate - Emits a series of instructions to materializea des...
unsigned convertAddSubFlagsOpcode(unsigned OldOpc)
Map pseudo instructions that imply an 'S' bit onto real opcodes.
void emitT2RegPlusImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, const DebugLoc &dl, Register DestReg, Register BaseReg, int NumBytes, ARMCC::CondCodes Pred, Register PredReg, const ARMBaseInstrInfo &TII, unsigned MIFlags=0)
An individual sequence of instructions to be replaced with a call to an outlined function.
The information necessary to create an outlined function for some class of candidate.