44  cl::desc(
"Disable hazard detection during preRA scheduling"));
 
   48    cl::desc(
"Enable reassociation of accumulation chains"));
 
   52                        cl::desc(
"Minimum length of accumulator chains " 
   53                                 "required for the optimization to kick in"));
 
   57    cl::desc(
"Maximum number of branches in the accumulator tree"));
 
   64  if (OpNum >= 
MCID.getNumOperands())
 
   71  if (OpInfo.isLookupPtrRegClass())
 
   72    return TRI->getPointerRegClass(RegClass);
 
   79  return TRI->getRegClass(RegClass);
 
 
   93                                  unsigned Quantity)
 const {
 
   94  for (
unsigned i = 0; i < Quantity; ++i)
 
 
  121  bool AtInsnStart = 
true;
 
  124  for (; *Str; ++Str) {
 
  134    if (AtInsnStart && !
isSpace(
static_cast<unsigned char>(*Str))) {
 
  135      unsigned AddLength = MaxInstLength;
 
  136      if (strncmp(Str, 
".space", 6) == 0) {
 
  139        SpaceSize = strtol(Str + 6, &EStr, 10);
 
  140        SpaceSize = SpaceSize < 0 ? 0 : SpaceSize;
 
  141        while (*EStr != 
'\n' && 
isSpace(
static_cast<unsigned char>(*EStr)))
 
  143        if (*EStr == 
'\0' || *EStr == 
'\n' ||
 
  145          AddLength = SpaceSize;
 
 
  163  while (!
MBB->succ_empty())
 
  164    MBB->removeSuccessor(
MBB->succ_begin());
 
  173    if (
MI->shouldUpdateAdditionalCallInfo())
 
  174      MBB->getParent()->eraseAdditionalCallInfo(&*
MI);
 
  181  MBB->addSuccessor(NewDest);
 
 
  185                                                      bool NewMI, 
unsigned Idx1,
 
  186                                                      unsigned Idx2)
 const {
 
  188  bool HasDef = 
MCID.getNumDefs();
 
  189  if (HasDef && !
MI.getOperand(0).isReg())
 
  193  unsigned CommutableOpIdx1 = Idx1; (void)CommutableOpIdx1;
 
  194  unsigned CommutableOpIdx2 = Idx2; (void)CommutableOpIdx2;
 
  196         CommutableOpIdx1 == Idx1 && CommutableOpIdx2 == Idx2 &&
 
  197         "TargetInstrInfo::CommuteInstructionImpl(): not commutable operands.");
 
  198  assert(
MI.getOperand(Idx1).isReg() && 
MI.getOperand(Idx2).isReg() &&
 
  199         "This only knows how to commute register operands so far");
 
  204  unsigned SubReg0 = HasDef ? 
MI.getOperand(0).getSubReg() : 0;
 
  205  unsigned SubReg1 = 
MI.getOperand(Idx1).getSubReg();
 
  206  unsigned SubReg2 = 
MI.getOperand(Idx2).getSubReg();
 
  207  bool Reg1IsKill = 
MI.getOperand(Idx1).isKill();
 
  208  bool Reg2IsKill = 
MI.getOperand(Idx2).isKill();
 
  209  bool Reg1IsUndef = 
MI.getOperand(Idx1).isUndef();
 
  210  bool Reg2IsUndef = 
MI.getOperand(Idx2).isUndef();
 
  211  bool Reg1IsInternal = 
MI.getOperand(Idx1).isInternalRead();
 
  212  bool Reg2IsInternal = 
MI.getOperand(Idx2).isInternalRead();
 
  215  bool Reg1IsRenamable =
 
  216      Reg1.
isPhysical() ? 
MI.getOperand(Idx1).isRenamable() : 
false;
 
  217  bool Reg2IsRenamable =
 
  218      Reg2.
isPhysical() ? 
MI.getOperand(Idx2).isRenamable() : 
false;
 
  225  if (HasDef && 
MI.hasImplicitDef()) {
 
  227        MI.getMF()->getSubtarget().getRegisterInfo();
 
  230      if ((ImplReg.
isVirtual() && ImplReg == Reg0) ||
 
  232           TRI->isSubRegisterEq(ImplReg, Reg0)))
 
  233        UpdateImplicitDefIdx.
push_back(OpNo + 
MI.getNumExplicitOperands());
 
  239  if (HasDef && Reg0 == Reg1 &&
 
  244  } 
else if (HasDef && Reg0 == Reg2 &&
 
  255    CommutedMI = MF.CloneMachineInstr(&
MI);
 
  263    for (
unsigned Idx : UpdateImplicitDefIdx)
 
 
  287                                                  unsigned OpIdx2)
 const {
 
  294           "Precondition violation: MI must be commutable.");
 
 
  301                                           unsigned &ResultIdx2,
 
  302                                           unsigned CommutableOpIdx1,
 
  303                                           unsigned CommutableOpIdx2) {
 
  306    ResultIdx1 = CommutableOpIdx1;
 
  307    ResultIdx2 = CommutableOpIdx2;
 
  309    if (ResultIdx2 == CommutableOpIdx1)
 
  310      ResultIdx1 = CommutableOpIdx2;
 
  311    else if (ResultIdx2 == CommutableOpIdx2)
 
  312      ResultIdx1 = CommutableOpIdx1;
 
  316    if (ResultIdx1 == CommutableOpIdx1)
 
  317      ResultIdx2 = CommutableOpIdx2;
 
  318    else if (ResultIdx1 == CommutableOpIdx2)
 
  319      ResultIdx2 = CommutableOpIdx1;
 
  325    return (ResultIdx1 == CommutableOpIdx1 && ResultIdx2 == CommutableOpIdx2) ||
 
  326           (ResultIdx1 == CommutableOpIdx2 && ResultIdx2 == CommutableOpIdx1);
 
 
  333                                            unsigned &SrcOpIdx2)
 const {
 
  335         "TargetInstrInfo::findCommutedOpIndices() can't handle bundles");
 
  338  if (!
MCID.isCommutable())
 
  343  unsigned CommutableOpIdx1 = 
MCID.getNumDefs();
 
  344  unsigned CommutableOpIdx2 = CommutableOpIdx1 + 1;
 
  346                            CommutableOpIdx1, CommutableOpIdx2))
 
  349  if (!
MI.getOperand(SrcOpIdx1).isReg() || !
MI.getOperand(SrcOpIdx2).isReg())
 
 
  356  if (!
MI.isTerminator()) 
return false;
 
  359  if (
MI.isBranch() && !
MI.isBarrier())
 
  361  if (!
MI.isPredicable())
 
 
  368  bool MadeChange = 
false;
 
  371         "TargetInstrInfo::PredicateInstruction() can't handle bundles");
 
  374  if (!
MI.isPredicable())
 
  377  for (
unsigned j = 0, i = 0, e = 
MI.getNumOperands(); i != e; ++i) {
 
  378    if (
MCID.operands()[i].isPredicate()) {
 
  383      } 
else if (MO.
isImm()) {
 
  386      } 
else if (MO.
isMBB()) {
 
  387        MO.
setMBB(Pred[j].getMBB());
 
 
  401                                  oe = 
MI.memoperands_end();
 
  403    if ((*o)->isLoad() &&
 
  407  return Accesses.size() != StartSize;
 
 
  415                                  oe = 
MI.memoperands_end();
 
  417    if ((*o)->isStore() &&
 
  421  return Accesses.size() != StartSize;
 
 
  425                                        unsigned SubIdx, 
unsigned &
Size,
 
  434  unsigned BitSize = 
TRI->getSubRegIdxSize(SubIdx);
 
  439  int BitOffset = 
TRI->getSubRegIdxOffset(SubIdx);
 
  440  if (BitOffset < 0 || BitOffset % 8)
 
 
  460  MI->substituteRegister(
MI->getOperand(0).getReg(), DestReg, SubIdx, 
TRI);
 
 
  480         "Instruction cannot be duplicated");
 
  482  return MF.cloneMachineInstrBundle(
MBB, InsertBefore, Orig);
 
 
  490  assert(
TII.isCopyInstr(
MI) && 
"MI must be a COPY instruction");
 
  491  if (
MI.getNumOperands() != 2)
 
  493  assert(FoldIdx<2 && 
"FoldIdx refers no nonexistent operand");
 
 
  530  DefMI = 
MRI->getVRegDef(FoldAsLoadDefReg);
 
  532  bool SawStore = 
false;
 
  533  if (!
DefMI->isSafeToMove(SawStore))
 
  538  for (
unsigned i = 0, e = 
MI.getNumOperands(); i != e; ++i) {
 
  543    if (Reg != FoldAsLoadDefReg)
 
  550  if (SrcOperandIds.
empty())
 
  555    FoldAsLoadDefReg = 0;
 
 
  562std::pair<unsigned, unsigned>
 
  564  switch (
MI.getOpcode()) {
 
  565  case TargetOpcode::STACKMAP:
 
  568  case TargetOpcode::PATCHPOINT:
 
  572  case TargetOpcode::STATEPOINT:
 
 
  583  unsigned StartIdx = 0;
 
  584  unsigned NumDefs = 0;
 
  586  std::tie(NumDefs, StartIdx) = 
TII.getPatchpointUnfoldableRange(
MI);
 
  588  unsigned DefToFoldIdx = 
MI.getNumOperands();
 
  592  for (
unsigned Op : 
Ops) {
 
  594      assert(DefToFoldIdx == 
MI.getNumOperands() && 
"Folding multiple defs");
 
  596    } 
else if (
Op < StartIdx) {
 
  599    if (
MI.getOperand(
Op).isTied())
 
  604      MF.CreateMachineInstr(
TII.get(
MI.getOpcode()), 
MI.getDebugLoc(), 
true);
 
  608  for (
unsigned i = 0; i < StartIdx; ++i)
 
  609    if (i != DefToFoldIdx)
 
  610      MIB.
add(
MI.getOperand(i));
 
  612  for (
unsigned i = StartIdx, e = 
MI.getNumOperands(); i < e; ++i) {
 
  615    (void)
MI.isRegTiedToDefOperand(i, &TiedTo);
 
  618      assert(TiedTo == e && 
"Cannot fold tied operands");
 
  620      unsigned SpillOffset;
 
  625          TII.getStackSlotRange(RC, MO.
getSubReg(), SpillSize, SpillOffset, MF);
 
  628      MIB.
addImm(StackMaps::IndirectMemRefOp);
 
  635        assert(TiedTo < NumDefs && 
"Bad tied operand");
 
  636        if (TiedTo > DefToFoldIdx)
 
 
  648  if (
MI->getOperand(OpNo).isTied()) {
 
  649    unsigned TiedTo = 
MI->findTiedOperandIdx(OpNo);
 
  650    MI->untieRegOperand(OpNo);
 
  656  TII.getFrameIndexOperands(NewOps, FI);
 
  657  assert(!NewOps.
empty() && 
"getFrameIndexOperands didn't create any operands");
 
  658  MI->removeOperand(OpNo);
 
  659  MI->insert(
MI->operands_begin() + OpNo, NewOps);
 
 
  674  assert(
MI.isInlineAsm() && 
"wrong opcode");
 
  677  unsigned Op = 
Ops[0];
 
  678  assert(
Op && 
"should never be first operand");
 
  679  assert(
MI.getOperand(
Op).isReg() && 
"shouldn't be folding non-reg operands");
 
  681  if (!
MI.mayFoldInlineAsmRegOp(
Op))
 
 
  721  assert(
MBB && 
"foldMemoryOperand needs an inserted instruction");
 
  738        unsigned SubRegSize = 
TRI->getSubRegIdxSize(
SubReg);
 
  739        if (SubRegSize > 0 && !(SubRegSize % 8))
 
  740          OpSize = SubRegSize / 8;
 
  743      MemSize = std::max(MemSize, OpSize);
 
  747  assert(MemSize && 
"Did not expect a zero-sized stack slot");
 
  751  if (
MI.getOpcode() == TargetOpcode::STACKMAP ||
 
  752      MI.getOpcode() == TargetOpcode::PATCHPOINT ||
 
  753      MI.getOpcode() == TargetOpcode::STATEPOINT) {
 
  757      MBB->insert(
MI, NewMI);
 
  758  } 
else if (
MI.isInlineAsm()) {
 
  770           "Folded a def to a non-store!");
 
  773           "Folded a use to a non-load!");
 
 
  819    assert(
MI.getOperand(
OpIdx).isUse() && 
"Folding load into def!");
 
  829  if ((
MI.getOpcode() == TargetOpcode::STACKMAP ||
 
  830       MI.getOpcode() == TargetOpcode::PATCHPOINT ||
 
  831       MI.getOpcode() == TargetOpcode::STATEPOINT) &&
 
  836      NewMI = &*
MBB.insert(
MI, NewMI);
 
  848  if (
MI.memoperands_empty()) {
 
 
  872    CopyMI->addOperand(MO);
 
  878    if (MO.isKill() && 
TRI->regsOverlap(DstReg, MO.getReg()))
 
  879      CopyMI->getOperand(CopyMI->getNumOperands() - 1).setIsKill(
false);
 
 
  885  if (
MI->allDefsAreDead()) {
 
  886    MI->setDesc(
get(TargetOpcode::KILL));
 
  894  if (IdentityCopy || SrcMO.
isUndef()) {
 
  897    if (SrcMO.
isUndef() || 
MI->getNumOperands() > 2) {
 
  900      MI->setDesc(
get(TargetOpcode::KILL));
 
  904    MI->eraseFromParent();
 
  913  if (
MI->getNumOperands() > 2)
 
  915  MI->eraseFromParent();
 
 
  929    MI1 = 
MRI.getUniqueVRegDef(Op1.
getReg());
 
  931    MI2 = 
MRI.getUniqueVRegDef(Op2.
getReg());
 
 
  938                                               unsigned Opcode2)
 const {
 
 
  943                                             bool &Commuted)
 const {
 
 
  978                                               bool &Commuted)
 const {
 
 
  990                       unsigned CombineOpc = 0) {
 
  997  if (!
MI || 
MI->getParent() != &
MBB ||
 
  998      (
MI->getOpcode() != CombineOpc && CombineOpc != 0))
 
 
 1020  unsigned AccumulatorOpcode = CurrentInstr->
getOpcode();
 
 1021  std::optional<unsigned> ChainStartOpCode =
 
 1024  if (!ChainStartOpCode.has_value())
 
 1031  while (CurrentInstr &&
 
 1038  if (CurrentInstr->
getOpcode() == AccumulatorOpcode &&
 
 
 1075  for (
const auto &
I : 
MBB) {
 
 1076    if (
I.getOpcode() == 
Opc &&
 
 1077        !ReductionChain.
contains(
I.getOperand(0).getReg()))
 
 
 1099  for (
unsigned int i = 1; i <= (RegistersToReduce.
size() / 2); i += 2) {
 
 1100    auto RHS = RegistersToReduce[i - 1];
 
 1101    auto LHS = RegistersToReduce[i];
 
 1104    if (RegistersToReduce.
size() == 2)
 
 1108      auto NewVR = 
MRI.createVirtualRegister(
 
 1112      InstrIdxForVirtReg.
insert(std::make_pair(Dest, InsInstrs.
size()));
 
 1127  if (RegistersToReduce.
size() % 2 != 0)
 
 1128    NewRegs.
push_back(RegistersToReduce[RegistersToReduce.
size() - 1]);
 
 1130  RegistersToReduce = NewRegs;
 
 
 1156    bool DoRegPressureReduce)
 const {
 
 
 1193std::pair<unsigned, unsigned>
 
 1203  if (AssocCommutRoot && AssocCommutPrev) {
 
 1213         "Incorrectly matched pattern");
 
 1214  unsigned AssocCommutOpcode = Root.
getOpcode();
 
 1216  if (!AssocCommutRoot)
 
 1217    std::swap(AssocCommutOpcode, InverseOpcode);
 
 1245    if (!AssocCommutRoot && AssocCommutPrev)
 
 1246      return {AssocCommutOpcode, InverseOpcode};
 
 1247    if (AssocCommutRoot && !AssocCommutPrev)
 
 1248      return {InverseOpcode, InverseOpcode};
 
 1249    if (!AssocCommutRoot && !AssocCommutPrev)
 
 1250      return {InverseOpcode, AssocCommutOpcode};
 
 1253    if (!AssocCommutRoot && AssocCommutPrev)
 
 1254      return {AssocCommutOpcode, InverseOpcode};
 
 1255    if (AssocCommutRoot && !AssocCommutPrev)
 
 1256      return {InverseOpcode, AssocCommutOpcode};
 
 1257    if (!AssocCommutRoot && !AssocCommutPrev)
 
 1258      return {InverseOpcode, InverseOpcode};
 
 1261    if (!AssocCommutRoot && AssocCommutPrev)
 
 1262      return {InverseOpcode, InverseOpcode};
 
 1263    if (AssocCommutRoot && !AssocCommutPrev)
 
 1264      return {AssocCommutOpcode, InverseOpcode};
 
 1265    if (!AssocCommutRoot && !AssocCommutPrev)
 
 1266      return {InverseOpcode, AssocCommutOpcode};
 
 1269    if (!AssocCommutRoot && AssocCommutPrev)
 
 1270      return {InverseOpcode, InverseOpcode};
 
 1271    if (AssocCommutRoot && !AssocCommutPrev)
 
 1272      return {InverseOpcode, AssocCommutOpcode};
 
 1273    if (!AssocCommutRoot && !AssocCommutPrev)
 
 1274      return {AssocCommutOpcode, InverseOpcode};
 
 
 1288    return {
false, 
false};
 
 1290    return {
true, 
false};
 
 1292    return {
true, 
true};
 
 1294    return {
true, 
true};
 
 
 1346    MRI.constrainRegClass(RegA, RC);
 
 1348    MRI.constrainRegClass(RegB, RC);
 
 1350    MRI.constrainRegClass(RegX, RC);
 
 1352    MRI.constrainRegClass(RegY, RC);
 
 1354    MRI.constrainRegClass(RegC, RC);
 
 1360  InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
 
 1363  bool KillA = OpA.
isKill();
 
 1364  bool KillX = OpX.
isKill();
 
 1365  bool KillY = OpY.
isKill();
 
 1366  bool KillNewVR = 
true;
 
 1370  if (SwapPrevOperands) {
 
 1375  unsigned PrevFirstOpIdx, PrevSecondOpIdx;
 
 1376  unsigned RootFirstOpIdx, RootSecondOpIdx;
 
 1410               MF, MF.CreateMachineInstr(
MCID, MIMD.getDL(), 
true))
 
 1417      buildMINoImplicit(*MF, 
MIMetadata(Prev), 
TII->get(NewPrevOpc), NewVR);
 
 1419    unsigned Idx = MO.getOperandNo();
 
 1423    if (Idx == PrevFirstOpIdx)
 
 1425    else if (Idx == PrevSecondOpIdx)
 
 1432  if (SwapRootOperands) {
 
 1438      buildMINoImplicit(*MF, 
MIMetadata(Root), 
TII->get(NewRootOpc), RegC);
 
 1440    unsigned Idx = MO.getOperandNo();
 
 1444    if (Idx == RootFirstOpIdx)
 
 1446    else if (Idx == RootSecondOpIdx)
 
 1449      MIB2 = MIB2.
add(MO);
 
 
 1524           "Max accumulator width set to illegal value");
 
 1532      if (IndexedReg.index() == 0)
 
 1538      if (IndexedReg.index() < MaxWidth) {
 
 1540        AccReg = Instr->getOperand(0).getReg();
 
 1544                  .
addReg(Instr->getOperand(2).getReg(),
 
 1546                  .
addReg(Instr->getOperand(3).getReg(),
 
 1552                     ? 
MRI.createVirtualRegister(
 
 1554                     : Instr->getOperand(0).getReg();
 
 1555        assert(IndexedReg.index() >= MaxWidth);
 
 1556        auto AccumulatorInput =
 
 1557            ChainRegs[
Depth - (IndexedReg.index() - MaxWidth) - 1];
 
 1561                  .
addReg(Instr->getOperand(2).getReg(),
 
 1563                  .
addReg(Instr->getOperand(3).getReg(),
 
 1568      InstIdxForVirtReg.
insert(std::make_pair(AccReg, InsInstrs.
size()));
 
 1574    for (
unsigned i = (InsInstrs.
size() - MaxWidth); i < InsInstrs.
size();
 
 1576      auto Reg = InsInstrs[i]->getOperand(0).getReg();
 
 1580    while (RegistersToReduce.
size() > 1)
 
 
 1599  if (!
MI.getNumOperands() || !
MI.getOperand(0).isReg())
 
 1607  if (DefReg.
isVirtual() && 
MI.getOperand(0).getSubReg() &&
 
 1608      MI.readsVirtualRegister(DefReg))
 
 1620  if (
MI.isNotDuplicable() || 
MI.mayStore() || 
MI.mayRaiseFPException() ||
 
 1621      MI.hasUnmodeledSideEffects())
 
 1626  if (
MI.isInlineAsm())
 
 1630  if (
MI.mayLoad() && !
MI.isDereferenceableInvariantLoad())
 
 1636    if (!MO.isReg()) 
continue;
 
 1642    if (Reg.isPhysical()) {
 
 1647        if (!
MRI.isConstantPhysReg(Reg))
 
 1658    if (MO.isDef() && Reg != DefReg)
 
 
 1669  bool StackGrowsDown =
 
 1680  if ((!StackGrowsDown && 
MI.getOpcode() == FrameSetupOpcode) ||
 
 1681      (StackGrowsDown && 
MI.getOpcode() == FrameDestroyOpcode))
 
 
 1694  if (
MI.isTerminator() || 
MI.isPosition())
 
 1698  if (
MI.getOpcode() == TargetOpcode::INLINEASM_BR)
 
 
 1746      BaseOps.
size() != 1)
 
 1748  BaseOp = BaseOps.
front();
 
 
 1756std::optional<unsigned>
 
 1758                                   SDNode *DefNode, 
unsigned DefIdx,
 
 1759                                   SDNode *UseNode, 
unsigned UseIdx)
 const {
 
 1760  if (!ItinData || ItinData->
isEmpty())
 
 1761    return std::nullopt;
 
 1764    return std::nullopt;
 
 
 1775  if (!ItinData || ItinData->
isEmpty())
 
 1778  if (!
N->isMachineOpcode())
 
 
 1790  if (!ItinData || ItinData->
isEmpty())
 
 1793  unsigned Class = 
MI.getDesc().getSchedClass();
 
 
 1806  if (
DefMI.isTransient())
 
 1808  if (
DefMI.mayLoad())
 
 
 1821                                          unsigned *PredCost)
 const {
 
 1825    return MI.mayLoad() ? 2 : 1;
 
 
 1832                                       unsigned DefIdx)
 const {
 
 1834  if (!ItinData || ItinData->
isEmpty())
 
 1837  unsigned DefClass = 
DefMI.getDesc().getSchedClass();
 
 1838  std::optional<unsigned> DefCycle =
 
 1840  return DefCycle && DefCycle <= 1U;
 
 
 1854  if (SectionPrefix &&
 
 1855      (*SectionPrefix == 
"unlikely" || *SectionPrefix == 
"unknown")) {
 
 
 1862std::optional<ParamLoadedValue>
 
 1869  bool OffsetIsScalable;
 
 1876    Register DestReg = DestSrc->Destination->getReg();
 
 1887    return std::nullopt;
 
 1893  } 
else if (
MI.hasOneMemOperand()) {
 
 1905      return std::nullopt;
 
 1908    if (!
TII->getMemOperandWithOffset(
MI, BaseOp, 
Offset, OffsetIsScalable,
 
 1910      return std::nullopt;
 
 1913    if (OffsetIsScalable)
 
 1914      return std::nullopt;
 
 1922    if (
MI.getNumExplicitDefs() != 1)
 
 1923      return std::nullopt;
 
 1929    Ops.push_back(dwarf::DW_OP_deref_size);
 
 1936  return std::nullopt;
 
 
 1952  return MBB->getCallFrameSize();
 
 
 1960  unsigned DefClass = 
DefMI.getDesc().getSchedClass();
 
 1961  unsigned UseClass = 
UseMI.getDesc().getSchedClass();
 
 
 1969          MI.isRegSequenceLike()) && 
"Instruction do not have the proper type");
 
 1971  if (!
MI.isRegSequence())
 
 1976  assert(DefIdx == 0 && 
"REG_SEQUENCE only has one def");
 
 1977  for (
unsigned OpIdx = 1, EndOpIdx = 
MI.getNumOperands(); 
OpIdx != EndOpIdx;
 
 1984           "One of the subindex of the reg_sequence is not an immediate");
 
 1987                                            (
unsigned)MOSubIdx.
getImm()));
 
 
 1996      MI.isExtractSubregLike()) && 
"Instruction do not have the proper type");
 
 1998  if (!
MI.isExtractSubreg())
 
 2003  assert(DefIdx == 0 && 
"EXTRACT_SUBREG only has one def");
 
 2009         "The subindex of the extract_subreg is not an immediate");
 
 
 2021      MI.isInsertSubregLike()) && 
"Instruction do not have the proper type");
 
 2023  if (!
MI.isInsertSubreg())
 
 2028  assert(DefIdx == 0 && 
"INSERT_SUBREG only has one def");
 
 2035         "One of the subindex of the reg_sequence is not an immediate");
 
 2036  BaseReg.Reg = MOBaseReg.
getReg();
 
 2039  InsertedReg.
Reg = MOInsertedReg.
getReg();
 
 
 2050  if (!
MI.isInlineAsm())
 
 2058    unsigned ExtraInfo = 
Op.getImm();
 
 2070  int FlagIdx = 
MI.findInlineAsmFlagIdx(
OpIdx);
 
 2071  if (FlagIdx < 0 || (
unsigned)FlagIdx != 
OpIdx)
 
 2074  assert(
Op.isImm() && 
"Expected flag operand to be an immediate");
 
 2076  unsigned Flag = 
Op.getImm();
 
 2078  OS << 
F.getKindName();
 
 2081  if (!
F.isImmKind() && !
F.isMemKind() && 
F.hasRegClassConstraint(RCID)) {
 
 2083      OS << 
':' << 
TRI->getRegClassName(
TRI->getRegClass(RCID));
 
 2085      OS << 
":RC" << RCID;
 
 2088  if (
F.isMemKind()) {
 
 2094  if (
F.isUseOperandTiedToDef(TiedTo))
 
 2095    OS << 
" tiedto:$" << TiedTo;
 
 2097  if ((
F.isRegDefKind() || 
F.isRegDefEarlyClobberKind() || 
F.isRegUseKind()) &&
 
 2098      F.getRegMayBeFolded())
 
 
 2107    Function &
F, std::vector<outliner::Candidate> &Candidates)
 const {
 
 2121        return C.getMF()->getFunction().hasFnAttribute(Attribute::NoUnwind);
 
 2123    F.addFnAttr(Attribute::NoUnwind);
 
 
 2129                                  unsigned Flags)
 const {
 
 2134  if (
MI.isCFIInstruction())
 
 2139  if (
MI.isInlineAsm())
 
 2147  if (
MI.isDebugInstr())
 
 2151  switch (
MI.getOpcode()) {
 
 2152    case TargetOpcode::IMPLICIT_DEF:
 
 2153    case TargetOpcode::KILL:
 
 2154    case TargetOpcode::LIFETIME_START:
 
 2155    case TargetOpcode::LIFETIME_END:
 
 2162  if (
MI.isTerminator()) {
 
 2164    if (!
MI.getParent()->succ_empty())
 
 2189    assert(!MOP.isTargetIndex() && 
"This isn't used quite yet!");
 
 2192    assert(!MOP.isCFIIndex() && 
"CFI instructions handled elsewhere!");
 
 2195    assert(!MOP.isFI() && 
"FrameIndex instructions should be gone by now!");
 
 2197    if (MOP.isMBB() || MOP.isBlockAddress() || MOP.isCPI() || MOP.isJTI())
 
 
 2206                                             unsigned &Flags)
 const {
 
 2209  auto First = 
MBB.getFirstNonDebugInstr();
 
 2213  if (
First->getOpcode() == TargetOpcode::FENTRY_CALL ||
 
 2214      First->getOpcode() == TargetOpcode::PATCHABLE_FUNCTION_ENTER)
 
 2219  auto Last = 
MBB.getLastNonDebugInstr();
 
 2220  if (
Last->getOpcode() == TargetOpcode::PATCHABLE_RET ||
 
 2221      Last->getOpcode() == TargetOpcode::PATCHABLE_TAIL_CALL)
 
 2226    if (
Last->getOpcode() == TargetOpcode::PATCHABLE_FUNCTION_EXIT ||
 
 2227        Last->getOpcode() == TargetOpcode::PATCHABLE_TAIL_CALL)
 
 
 2234  return MI->isCall() || 
MI->hasUnmodeledSideEffects() ||
 
 2235         (
MI->hasOrderedMemoryRef() && !
MI->isDereferenceableInvariantLoad());
 
 
unsigned const MachineRegisterInfo * MRI
 
MachineInstrBuilder & UseMI
 
MachineInstrBuilder MachineInstrBuilder & DefMI
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
SmallVector< int16_t, MAX_SRC_OPERANDS_NUM > OperandIndices
 
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
 
DXIL Forward Handle Accesses
 
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
 
static unsigned getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
 
MachineInstr unsigned OpIdx
 
uint64_t IntrinsicInst * II
 
TargetInstrInfo::RegSubRegPairAndIdx RegSubRegPairAndIdx
 
This file defines the SmallSet class.
 
static bool isAsmComment(const char *Str, const MCAsmInfo &MAI)
 
static void transferImplicitOperands(MachineInstr *MI, const TargetRegisterInfo *TRI)
transferImplicitOperands - MI is a pseudo-instruction, and the lowered replacement instructions immed...
 
static cl::opt< bool > EnableAccReassociation("acc-reassoc", cl::Hidden, cl::init(true), cl::desc("Enable reassociation of accumulation chains"))
 
static std::pair< bool, bool > mustSwapOperands(unsigned Pattern)
 
static const TargetRegisterClass * canFoldCopy(const MachineInstr &MI, const TargetInstrInfo &TII, unsigned FoldIdx)
 
static cl::opt< unsigned int > MinAccumulatorDepth("acc-min-depth", cl::Hidden, cl::init(8), cl::desc("Minimum length of accumulator chains " "required for the optimization to kick in"))
 
static void foldInlineAsmMemOperand(MachineInstr *MI, unsigned OpNo, int FI, const TargetInstrInfo &TII)
 
static cl::opt< unsigned int > MaxAccumulatorWidth("acc-max-width", cl::Hidden, cl::init(3), cl::desc("Maximum number of branches in the accumulator tree"))
 
static bool canCombine(MachineBasicBlock &MBB, MachineOperand &MO, unsigned CombineOpc=0)
 
static cl::opt< bool > DisableHazardRecognizer("disable-sched-hazard", cl::Hidden, cl::init(false), cl::desc("Disable hazard detection during preRA scheduling"))
 
static MachineInstr * foldPatchpoint(MachineFunction &MF, MachineInstr &MI, ArrayRef< unsigned > Ops, int FrameIndex, const TargetInstrInfo &TII)
 
This file describes how to lower LLVM code to machine code.
 
ArrayRef - 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.
 
static LLVM_ABI DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
 
static LLVM_ABI DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false, bool EntryValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
 
bool isLittleEndian() const
Layout endianness...
 
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
 
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
 
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
 
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
 
LLVM_ABI std::optional< StringRef > getSectionPrefix() const
Get the section prefix for this global object.
 
bool hasSection() const
Check if this global has a custom object file section.
 
static std::vector< StringRef > getExtraInfoNames(unsigned ExtraInfo)
 
static StringRef getMemConstraintName(ConstraintCode C)
 
Itinerary data supplied by a subtarget to be used by a target.
 
std::optional< unsigned > getOperandCycle(unsigned ItinClassIndx, unsigned OperandIdx) const
Return the cycle for the given class and operand.
 
unsigned getStageLatency(unsigned ItinClassIndx) const
Return the total stage latency of the given class.
 
std::optional< unsigned > getOperandLatency(unsigned DefClass, unsigned DefIdx, unsigned UseClass, unsigned UseIdx) const
Compute and return the use operand latency of a given itinerary class and operand index if the value ...
 
const InstrItinerary * Itineraries
Array of itineraries selected.
 
bool isEmpty() const
Returns true if there are no itineraries.
 
static LocationSize precise(uint64_t Value)
 
TypeSize getValue() const
 
This class is intended to be used as a base class for asm properties and features specific to the tar...
 
virtual unsigned getMaxInstLength(const MCSubtargetInfo *STI=nullptr) const
Returns the maximum possible encoded instruction size in bytes.
 
StringRef getCommentString() const
 
const char * getSeparatorString() const
 
Instances of this class represent a single low-level machine instruction.
 
Describe properties that are true of each instruction in the target description file.
 
unsigned getSchedClass() const
Return the scheduling class for this instruction.
 
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode.
 
This holds information about one operand of a machine instruction, indicating the register class for ...
 
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
 
MachineInstrBundleIterator< MachineInstr > iterator
 
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
 
bool isImmutableObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to an immutable object.
 
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.
 
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
 
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.
 
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
 
Function & getFunction()
Return the LLVM function that this machine code represents.
 
BasicBlockListType::iterator iterator
 
const MachineFunctionProperties & getProperties() const
Get the function properties.
 
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
 
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
 
const MachineInstrBuilder & add(const MachineOperand &MO) const
 
const MachineInstrBuilder & addFrameIndex(int Idx) const
 
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
 
const MachineInstrBuilder & copyImplicitOps(const MachineInstr &OtherMI) const
Copy all the implicit operands from OtherMI onto this one.
 
MachineInstr * getInstr() const
If conversion operators fail, use this method to get the MachineInstr explicitly.
 
const MachineInstrBuilder & copyMIMetadata(const MIMetadata &MIMD) const
 
Representation of each machine instruction.
 
ArrayRef< MachineMemOperand * >::iterator mmo_iterator
 
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
 
const MachineBasicBlock * getParent() const
 
void setFlags(unsigned flags)
 
unsigned getNumOperands() const
Retuns the total number of operands.
 
void setDebugInstrNum(unsigned Num)
Set instruction number of this MachineInstr.
 
mmo_iterator memoperands_end() const
Access to memory operands of the instruction.
 
unsigned peekDebugInstrNum() const
Examine the instruction number of this MachineInstr.
 
LLVM_ABI void setMemRefs(MachineFunction &MF, ArrayRef< MachineMemOperand * > MemRefs)
Assign this MachineInstr's memory reference descriptor list.
 
bool mayLoad(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read memory.
 
bool isCFIInstruction() const
 
bool isNotDuplicable(QueryType Type=AnyInBundle) const
Return true if this instruction cannot be safely duplicated.
 
void clearFlag(MIFlag Flag)
clearFlag - Clear a MI flag.
 
mop_range explicit_operands()
 
LLVM_ABI void tieOperands(unsigned DefIdx, unsigned UseIdx)
Add a tie between the register operands at DefIdx and UseIdx.
 
mmo_iterator memoperands_begin() const
Access to memory operands of the instruction.
 
LLVM_ABI void cloneInstrSymbols(MachineFunction &MF, const MachineInstr &MI)
Clone another MachineInstr's pre- and post- instruction symbols and replace ours with it.
 
LLVM_ABI bool isIdenticalTo(const MachineInstr &Other, MICheckType Check=CheckDefs) const
Return true if this instruction is identical to Other.
 
LLVM_ABI const MachineFunction * getMF() const
Return the function that contains the basic block that this instruction belongs to.
 
ArrayRef< MachineMemOperand * > memoperands() const
Access to memory operands of the instruction.
 
bool mayStore(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly modify memory.
 
const MachineOperand & getOperand(unsigned i) const
 
uint32_t getFlags() const
Return the MI flags bitvector.
 
bool canFoldAsLoad(QueryType Type=IgnoreBundle) const
Return true for instructions that can be folded as memory operands in other instructions.
 
LLVM_ABI const TargetRegisterClass * getRegClassConstraint(unsigned OpIdx, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const
Compute the static register class constraint for operand OpIdx.
 
LLVM_ABI void addMemOperand(MachineFunction &MF, MachineMemOperand *MO)
Add a MachineMemOperand to the machine instruction.
 
A description of a memory reference used in the backend.
 
LocationSize getSize() const
Return the size in bytes of the memory reference.
 
const PseudoSourceValue * getPseudoValue() const
 
Flags
Flags values. These may be or'd together.
 
@ MOLoad
The memory access reads data.
 
@ MOStore
The memory access writes data.
 
This class contains meta information specific to a module.
 
MachineOperand class - Representation of each machine instruction operand.
 
void setSubReg(unsigned subReg)
 
unsigned getSubReg() const
 
void setIsInternalRead(bool Val=true)
 
void setImm(int64_t immVal)
 
LLVM_ABI void setIsRenamable(bool Val=true)
 
bool isReg() const
isReg - Tests if this is a MO_Register operand.
 
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
 
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
 
void setIsKill(bool Val=true)
 
LLVM_ABI bool isRenamable() const
isRenamable - Returns true if this register may be renamed, i.e.
 
void setMBB(MachineBasicBlock *MBB)
 
void setIsUndef(bool Val=true)
 
Register getReg() const
getReg - Returns the register number.
 
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)
 
bool isMBB() const
isMBB - Tests if this is a MO_MachineBasicBlock operand.
 
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
 
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
 
MI-level patchpoint operands.
 
Special value supplied for machine level alias analysis.
 
virtual bool mayAlias(const MachineFrameInfo *) const
Return true if the memory pointed to by this PseudoSourceValue can ever alias an LLVM IR Value.
 
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.
 
Represents one node in the SelectionDAG.
 
bool isMachineOpcode() const
Test if this node has a post-isel opcode, directly corresponding to a MachineInstr opcode.
 
unsigned getMachineOpcode() const
This may only be called if isMachineOpcode returns true.
 
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,...
 
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
 
bool contains(const T &V) const
Check if the SmallSet contains the given element.
 
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
 
void push_back(const T &Elt)
 
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
 
MI-level stackmap operands.
 
MI-level Statepoint operands.
 
StringRef - Represent a constant reference to a string, i.e.
 
constexpr size_t size() const
size - Get the string size.
 
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
 
Information about stack frame layout on the target.
 
StackDirection getStackGrowthDirection() const
getStackGrowthDirection - Return the direction the stack grows
 
int alignSPAdjust(int SPAdj) const
alignSPAdjust - This method aligns the stack adjustment to the correct alignment.
 
virtual ~PipelinerLoopInfo()
 
TargetInstrInfo - Interface to description of machine instruction set.
 
virtual ScheduleHazardRecognizer * CreateTargetPostRAHazardRecognizer(const InstrItineraryData *, const ScheduleDAG *DAG) const
Allocate and return a hazard recognizer to use for this target when scheduling the machine instructio...
 
virtual MachineInstr * foldMemoryOperandImpl(MachineFunction &MF, MachineInstr &MI, ArrayRef< unsigned > Ops, MachineBasicBlock::iterator InsertPt, int FrameIndex, LiveIntervals *LIS=nullptr, VirtRegMap *VRM=nullptr) const
Target-dependent implementation for foldMemoryOperand.
 
virtual bool hasLowDefLatency(const TargetSchedModel &SchedModel, const MachineInstr &DefMI, unsigned DefIdx) const
Compute operand latency of a def of 'Reg'.
 
virtual void setSpecialOperandAttr(MachineInstr &OldMI1, MachineInstr &OldMI2, MachineInstr &NewMI1, MachineInstr &NewMI2) const
This is an architecture-specific helper function of reassociateOps.
 
virtual unsigned getNumMicroOps(const InstrItineraryData *ItinData, const MachineInstr &MI) const
Return the number of u-operations the given machine instruction will be decoded to on the target cpu.
 
virtual int getSPAdjust(const MachineInstr &MI) const
Returns the actual stack pointer adjustment made by an instruction as part of a call sequence.
 
virtual void ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail, MachineBasicBlock *NewDest) const
Delete the instruction OldInst and everything after it, replacing it with an unconditional branch to ...
 
virtual bool PredicateInstruction(MachineInstr &MI, ArrayRef< MachineOperand > Pred) const
Convert the instruction into a predicated instruction.
 
int16_t getOpRegClassID(const MCOperandInfo &OpInfo) const
 
bool areOpcodesEqualOrInverse(unsigned Opcode1, unsigned Opcode2) const
Return true when \P Opcode1 or its inversion is equal to \P Opcode2.
 
virtual outliner::InstrType getOutliningTypeImpl(const MachineModuleInfo &MMI, MachineBasicBlock::iterator &MIT, unsigned Flags) const
Target-dependent implementation for getOutliningTypeImpl.
 
virtual bool getInsertSubregLikeInputs(const MachineInstr &MI, unsigned DefIdx, RegSubRegPair &BaseReg, RegSubRegPairAndIdx &InsertedReg) const
Target-dependent implementation of getInsertSubregInputs.
 
outliner::InstrType getOutliningType(const MachineModuleInfo &MMI, MachineBasicBlock::iterator &MIT, unsigned Flags) const
Returns how or if MIT should be outlined.
 
virtual bool isThroughputPattern(unsigned Pattern) const
Return true when a code sequence can improve throughput.
 
bool getAccumulatorReassociationPatterns(MachineInstr &Root, SmallVectorImpl< unsigned > &Patterns) const
Find chains of accumulations that can be rewritten as a tree for increased ILP.
 
virtual std::pair< unsigned, unsigned > getPatchpointUnfoldableRange(const MachineInstr &MI) const
For a patchpoint, stackmap, or statepoint intrinsic, return the range of operands which can't be fold...
 
virtual bool findCommutedOpIndices(const MachineInstr &MI, unsigned &SrcOpIdx1, unsigned &SrcOpIdx2) const
Returns true iff the routine could find two commutable operands in the given machine instruction.
 
virtual void mergeOutliningCandidateAttributes(Function &F, std::vector< outliner::Candidate > &Candidates) const
Optional target hook to create the LLVM IR attributes for the outlined function.
 
virtual const TargetRegisterClass * getRegClass(const MCInstrDesc &MCID, unsigned OpNum, const TargetRegisterInfo *TRI) const
Given a machine instruction descriptor, returns the register class constraint for OpNum,...
 
bool isUnpredicatedTerminator(const MachineInstr &MI) const
Returns true if the instruction is a terminator instruction that has not been predicated.
 
virtual void insertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const
Insert a noop into the instruction stream at the specified point.
 
void getAccumulatorChain(MachineInstr *CurrentInstr, SmallVectorImpl< Register > &Chain) const
Find the chain of accumulator instructions in \P MBB and return them in \P Chain.
 
bool isFrameInstr(const MachineInstr &I) const
Returns true if the argument is a frame pseudo instruction.
 
virtual bool getRegSequenceLikeInputs(const MachineInstr &MI, unsigned DefIdx, SmallVectorImpl< RegSubRegPairAndIdx > &InputRegs) const
Target-dependent implementation of getRegSequenceInputs.
 
virtual bool getStackSlotRange(const TargetRegisterClass *RC, unsigned SubIdx, unsigned &Size, unsigned &Offset, const MachineFunction &MF) const
Compute the size in bytes and offset within a stack slot of a spilled register or subregister.
 
virtual ScheduleHazardRecognizer * CreateTargetMIHazardRecognizer(const InstrItineraryData *, const ScheduleDAGMI *DAG) const
Allocate and return a hazard recognizer to use for this target when scheduling the machine instructio...
 
virtual bool hasStoreToStackSlot(const MachineInstr &MI, SmallVectorImpl< const MachineMemOperand * > &Accesses) const
If the specified machine instruction has a store to a stack slot, return true along with the FrameInd...
 
virtual bool hasReassociableOperands(const MachineInstr &Inst, const MachineBasicBlock *MBB) const
Return true when \P Inst has reassociable operands in the same \P MBB.
 
virtual unsigned getInlineAsmLength(const char *Str, const MCAsmInfo &MAI, const TargetSubtargetInfo *STI=nullptr) const
Measure the specified inline asm to determine an approximation of its length.
 
virtual void genAlternativeCodeSequence(MachineInstr &Root, unsigned Pattern, SmallVectorImpl< MachineInstr * > &InsInstrs, SmallVectorImpl< MachineInstr * > &DelInstrs, DenseMap< Register, unsigned > &InstIdxForVirtReg) const
When getMachineCombinerPatterns() finds patterns, this function generates the instructions that could...
 
virtual std::optional< ParamLoadedValue > describeLoadedValue(const MachineInstr &MI, Register Reg) const
Produce the expression describing the MI loading a value into the physical register Reg.
 
void lowerCopy(MachineInstr *MI, const TargetRegisterInfo *TRI) const
This function defines the logic to lower COPY instruction to target specific instruction(s).
 
virtual unsigned getReduceOpcodeForAccumulator(unsigned int AccumulatorOpCode) const
Returns the opcode that should be use to reduce accumulation registers.
 
virtual Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const
If the specified machine instruction is a direct load from a stack slot, return the virtual or physic...
 
MachineInstr * foldMemoryOperand(MachineInstr &MI, ArrayRef< unsigned > Ops, int FI, LiveIntervals *LIS=nullptr, VirtRegMap *VRM=nullptr) const
Attempt to fold a load or store of the specified stack slot into the specified machine instruction fo...
 
virtual MachineInstr * optimizeLoadInstr(MachineInstr &MI, const MachineRegisterInfo *MRI, Register &FoldAsLoadDefReg, MachineInstr *&DefMI) const
Try to remove the load by folding it to a register operand at the use.
 
virtual void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const
Store the specified register of the given register class to the specified stack frame index.
 
virtual ScheduleHazardRecognizer * CreateTargetHazardRecognizer(const TargetSubtargetInfo *STI, const ScheduleDAG *DAG) const
Allocate and return a hazard recognizer to use for this target when scheduling the machine instructio...
 
virtual unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const
Insert branch code into the end of the specified MachineBasicBlock.
 
virtual void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const DebugLoc &DL, Register DestReg, Register SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const
Emit instructions to copy a pair of physical registers.
 
virtual unsigned getAccumulationStartOpcode(unsigned Opcode) const
Returns an opcode which defines the accumulator used by \P Opcode.
 
unsigned getCallFrameSetupOpcode() const
These methods return the opcode of the frame setup/destroy instructions if they exist (-1 otherwise).
 
virtual bool getMachineCombinerPatterns(MachineInstr &Root, SmallVectorImpl< unsigned > &Patterns, bool DoRegPressureReduce) const
Return true when there is potentially a faster code sequence for an instruction chain ending in Root.
 
virtual bool isReMaterializableImpl(const MachineInstr &MI) const
For instructions with opcodes for which the M_REMATERIALIZABLE flag is set, this hook lets the target...
 
virtual MCInst getNop() const
Return the noop instruction to use for a noop.
 
unsigned getCallFrameSizeAt(MachineInstr &MI) const
 
virtual MachineInstr & duplicate(MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertBefore, const MachineInstr &Orig) const
Clones instruction or the whole instruction bundle Orig and insert into MBB before InsertBefore.
 
std::pair< unsigned, unsigned > getReassociationOpcodes(unsigned Pattern, const MachineInstr &Root, const MachineInstr &Prev) const
Reassociation of some instructions requires inverse operations (e.g.
 
virtual bool isMBBSafeToOutlineFrom(MachineBasicBlock &MBB, unsigned &Flags) const
Optional target hook that returns true if MBB is safe to outline from, and returns any target-specifi...
 
virtual void getReassociateOperandIndices(const MachineInstr &Root, unsigned Pattern, std::array< unsigned, 5 > &OperandIndices) const
The returned array encodes the operand index for each parameter because the operands may be commuted;...
 
virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const
Load the specified register of the given register class from the specified stack frame index.
 
int64_t getFrameTotalSize(const MachineInstr &I) const
Returns the total frame size, which is made up of the space set up inside the pair of frame start-sto...
 
MachineInstr * commuteInstruction(MachineInstr &MI, bool NewMI=false, unsigned OpIdx1=CommuteAnyOperandIndex, unsigned OpIdx2=CommuteAnyOperandIndex) const
This method commutes the operands of the given machine instruction MI.
 
virtual std::optional< unsigned > getOperandLatency(const InstrItineraryData *ItinData, SDNode *DefNode, unsigned DefIdx, SDNode *UseNode, unsigned UseIdx) const
 
virtual bool isAssociativeAndCommutative(const MachineInstr &Inst, bool Invert=false) const
Return true when \P Inst is both associative and commutative.
 
virtual void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register DestReg, unsigned SubIdx, const MachineInstr &Orig, const TargetRegisterInfo &TRI) const
Re-issue the specified 'original' instruction at the specific location targeting a new destination re...
 
void reassociateOps(MachineInstr &Root, MachineInstr &Prev, unsigned Pattern, SmallVectorImpl< MachineInstr * > &InsInstrs, SmallVectorImpl< MachineInstr * > &DelInstrs, ArrayRef< unsigned > OperandIndices, DenseMap< Register, unsigned > &InstrIdxForVirtReg) const
Attempt to reassociate \P Root and \P Prev according to \P Pattern to reduce critical path length.
 
virtual std::optional< unsigned > getInverseOpcode(unsigned Opcode) const
Return the inverse operation opcode if it exists for \P Opcode (e.g.
 
virtual void insertNoops(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned Quantity) const
Insert noops into the instruction stream at the specified point.
 
unsigned getCallFrameDestroyOpcode() const
 
int64_t getFrameSize(const MachineInstr &I) const
Returns size of the frame associated with the given frame instruction.
 
virtual bool isPredicated(const MachineInstr &MI) const
Returns true if the instruction is already predicated.
 
bool getInsertSubregInputs(const MachineInstr &MI, unsigned DefIdx, RegSubRegPair &BaseReg, RegSubRegPairAndIdx &InsertedReg) const
Build the equivalent inputs of a INSERT_SUBREG for the given MI and DefIdx.
 
virtual ~TargetInstrInfo()
 
virtual unsigned getInstrLatency(const InstrItineraryData *ItinData, const MachineInstr &MI, unsigned *PredCost=nullptr) const
Compute the instruction latency of a given instruction.
 
virtual bool produceSameValue(const MachineInstr &MI0, const MachineInstr &MI1, const MachineRegisterInfo *MRI=nullptr) const
Return true if two machine instructions would produce identical values.
 
virtual bool isAccumulationOpcode(unsigned Opcode) const
Return true when \P OpCode is an instruction which performs accumulation into one of its operand regi...
 
std::optional< DestSourcePair > isCopyInstr(const MachineInstr &MI) const
If the specific machine instruction is a instruction that moves/copies value from one register to ano...
 
bool isReassociationCandidate(const MachineInstr &Inst, bool &Commuted) const
Return true if the input \P Inst is part of a chain of dependent ops that are suitable for reassociat...
 
void reduceAccumulatorTree(SmallVectorImpl< Register > &RegistersToReduce, SmallVectorImpl< MachineInstr * > &InsInstrs, MachineFunction &MF, MachineInstr &Root, MachineRegisterInfo &MRI, DenseMap< Register, unsigned > &InstrIdxForVirtReg, Register ResultReg) const
Reduces branches of the accumulator tree into a single register.
 
virtual bool isSchedulingBoundary(const MachineInstr &MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const
Test if the given instruction should be considered a scheduling boundary.
 
TargetInstrInfo(unsigned CFSetupOpcode=~0u, unsigned CFDestroyOpcode=~0u, unsigned CatchRetOpcode=~0u, unsigned ReturnOpcode=~0u, const int16_t *const RegClassByHwModeTable=nullptr)
 
virtual bool getMemOperandsWithOffsetWidth(const MachineInstr &MI, SmallVectorImpl< const MachineOperand * > &BaseOps, int64_t &Offset, bool &OffsetIsScalable, LocationSize &Width, const TargetRegisterInfo *TRI) const
Get zero or more base operands and the byte offset of an instruction that reads/writes memory.
 
virtual unsigned getPredicationCost(const MachineInstr &MI) const
 
virtual CombinerObjective getCombinerObjective(unsigned Pattern) const
Return the objective of a combiner pattern.
 
virtual MachineInstr * commuteInstructionImpl(MachineInstr &MI, bool NewMI, unsigned OpIdx1, unsigned OpIdx2) const
This method commutes the operands of the given machine instruction MI.
 
virtual bool isFunctionSafeToSplit(const MachineFunction &MF) const
Return true if the function is a viable candidate for machine function splitting.
 
virtual MachineTraceStrategy getMachineCombinerTraceStrategy() const
Return a strategy that MachineCombiner must use when creating traces.
 
bool getRegSequenceInputs(const MachineInstr &MI, unsigned DefIdx, SmallVectorImpl< RegSubRegPairAndIdx > &InputRegs) const
Build the equivalent inputs of a REG_SEQUENCE for the given MI and DefIdx.
 
virtual bool hasLoadFromStackSlot(const MachineInstr &MI, SmallVectorImpl< const MachineMemOperand * > &Accesses) const
If the specified machine instruction has a load from a stack slot, return true along with the FrameIn...
 
virtual bool isGlobalMemoryObject(const MachineInstr *MI) const
Returns true if MI is an instruction we are unable to reason about (like a call or something with unm...
 
virtual std::optional< RegImmPair > isAddImmediate(const MachineInstr &MI, Register Reg) const
If the specific machine instruction is an instruction that adds an immediate value and a register,...
 
unsigned defaultDefLatency(const MCSchedModel &SchedModel, const MachineInstr &DefMI) const
Return the default expected latency for a def based on its opcode.
 
static const unsigned CommuteAnyOperandIndex
 
virtual bool hasReassociableSibling(const MachineInstr &Inst, bool &Commuted) const
Return true when \P Inst has reassociable sibling.
 
virtual std::string createMIROperandComment(const MachineInstr &MI, const MachineOperand &Op, unsigned OpIdx, const TargetRegisterInfo *TRI) const
 
virtual bool isHighLatencyDef(int opc) const
Return true if this opcode has high latency to its result.
 
static bool fixCommutedOpIndices(unsigned &ResultIdx1, unsigned &ResultIdx2, unsigned CommutableOpIdx1, unsigned CommutableOpIdx2)
Assigns the (CommutableOpIdx1, CommutableOpIdx2) pair of commutable operand indices to (ResultIdx1,...
 
bool getExtractSubregInputs(const MachineInstr &MI, unsigned DefIdx, RegSubRegPairAndIdx &InputReg) const
Build the equivalent inputs of a EXTRACT_SUBREG for the given MI and DefIdx.
 
virtual bool getExtractSubregLikeInputs(const MachineInstr &MI, unsigned DefIdx, RegSubRegPairAndIdx &InputReg) const
Target-dependent implementation of getExtractSubregInputs.
 
bool usePreRAHazardRecognizer() const
Provide a global flag for disabling the PreRA hazard recognizer that targets may choose to honor.
 
bool getMemOperandWithOffset(const MachineInstr &MI, const MachineOperand *&BaseOp, int64_t &Offset, bool &OffsetIsScalable, const TargetRegisterInfo *TRI) const
Get the base operand and byte offset of an instruction that reads/writes memory.
 
Register getStackPointerRegisterToSaveRestore() const
If a physical register, this specifies the register that llvm.savestack/llvm.restorestack should save...
 
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
 
const Triple & getTargetTriple() const
 
bool contains(Register Reg) const
Return true if the specified register is included in this register class.
 
bool hasSubClassEq(const TargetRegisterClass *RC) const
Returns true if RC is a sub-class of or equal to this class.
 
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
 
Provide an instruction scheduling machine model to CodeGen passes.
 
const InstrItineraryData * getInstrItineraries() const
 
TargetSubtargetInfo - Generic base class for all target subtargets.
 
virtual const TargetFrameLowering * getFrameLowering() const
 
virtual const TargetInstrInfo * getInstrInfo() const
 
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
 
virtual const TargetLowering * getTargetLowering() const
 
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
 
A raw_ostream that writes to an std::string.
 
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
 
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
 
@ C
The default llvm calling convention, compatible with C.
 
@ Define
Register definition.
 
initializer< Ty > init(const Ty &Val)
 
InstrType
Represents how an instruction should be mapped by the outliner.
 
This is an optimization pass for GlobalISel generic memory operations.
 
MachineTraceStrategy
Strategies for selecting traces.
 
@ TS_MinInstrCount
Select the trace through a block that has the fewest instructions.
 
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
 
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
 
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
 
constexpr from_range_t from_range
 
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
 
bool isa_and_nonnull(const Y &Val)
 
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
 
auto reverse(ContainerTy &&C)
 
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
 
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
 
CombinerObjective
The combiner's goal may differ based on which pattern it is attempting to optimize.
 
LLVM_ABI VirtRegInfo AnalyzeVirtRegInBundle(MachineInstr &MI, Register Reg, SmallVectorImpl< std::pair< MachineInstr *, unsigned > > *Ops=nullptr)
AnalyzeVirtRegInBundle - Analyze how the current instruction or bundle uses a virtual register.
 
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
 
unsigned getKillRegState(bool B)
 
DWARFExpression::Operation Op
 
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
 
bool isSpace(char C)
Checks whether character C is whitespace in the "C" locale.
 
std::pair< MachineOperand, DIExpression * > ParamLoadedValue
 
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
 
Machine model for scheduling, bundling, and heuristics.
 
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
 
A pair composed of a pair of a register and a sub-register index, and another sub-register index.
 
A pair composed of a register and a sub-register index.
 
VirtRegInfo - Information about a virtual register used by a set of operands.
 
bool Reads
Reads - One of the operands read the virtual register.
 
bool Writes
Writes - One of the operands writes the virtual register.
 
An individual sequence of instructions to be replaced with a call to an outlined function.
 
MachineFunction * getMF() const