45#include "llvm/Config/llvm-config.h" 
   67#define DEBUG_TYPE "branch-folder" 
   69STATISTIC(NumDeadBlocks, 
"Number of dead blocks removed");
 
   70STATISTIC(NumBranchOpts, 
"Number of branches optimized");
 
   71STATISTIC(NumTailMerge , 
"Number of block tails merged");
 
   72STATISTIC(NumHoist     , 
"Number of times common instructions are hoisted");
 
   73STATISTIC(NumTailCalls,  
"Number of tail calls optimized");
 
   81          cl::desc(
"Max number of predecessors to consider tail merging"),
 
   87              cl::desc(
"Min number of instructions to consider tail merging"),
 
   99  bool runOnMachineFunction(MachineFunction &MF) 
override;
 
  101  void getAnalysisUsage(AnalysisUsage &AU)
 const override {
 
  102    AU.
addRequired<MachineBlockFrequencyInfoWrapperPass>();
 
  103    AU.
addRequired<MachineBranchProbabilityInfoWrapperPass>();
 
  109  MachineFunctionProperties getRequiredProperties()
 const override {
 
  110    return MachineFunctionProperties().setNoPHIs();
 
  116char BranchFolderLegacy::ID = 0;
 
  126  bool EnableTailMerge =
 
  127      !MF.getTarget().requiresStructuredCFG() && this->EnableTailMerge;
 
  131                  .getCachedResult<ProfileSummaryAnalysis>(
 
  132                      *MF.getFunction().getParent());
 
  135        "ProfileSummaryAnalysis is required for BranchFoldingPass", 
false);
 
  139  BranchFolder Folder(EnableTailMerge, 
true, MBBFreqInfo, MBPI,
 
  141  if (!Folder.OptimizeFunction(MF, MF.getSubtarget().getInstrInfo(),
 
  142                               MF.getSubtarget().getRegisterInfo()))
 
 
  151  TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
 
  156  MBFIWrapper MBBFreqInfo(
 
  157      getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI());
 
  159      EnableTailMerge, 
true, MBBFreqInfo,
 
  160      getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI(),
 
  161      &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI());
 
  170    : EnableHoistCommonCode(CommonHoist), MinCommonTailLength(MinTailLength),
 
  171      MBBFreqInfo(FreqInfo), MBPI(ProbInfo), PSI(PSI) {
 
  174    EnableTailMerge = DefaultEnableTailMerge;
 
 
  182  assert(
MBB->pred_empty() && 
"MBB must be dead!");
 
  187  while (!
MBB->succ_empty())
 
  188    MBB->removeSuccessor(
MBB->succ_end()-1);
 
  191  TriedMerging.erase(
MBB);
 
  195    if (
MI.shouldUpdateAdditionalCallInfo())
 
  200  EHScopeMembership.erase(
MBB);
 
  209  if (!tii) 
return false;
 
  211  TriedMerging.clear();
 
  214  AfterBlockPlacement = AfterPlacement;
 
  220  if (MinCommonTailLength == 0) {
 
  223                              : TII->getTailMergeSize(MF);
 
  226  UpdateLiveIns = MRI.
tracksLiveness() && TRI->trackLivenessAfterRegAlloc(MF);
 
  228    MRI.invalidateLiveness();
 
  230  bool MadeChange = 
false;
 
  235  bool MadeChangeThisIteration = 
true;
 
  236  while (MadeChangeThisIteration) {
 
  237    MadeChangeThisIteration    = TailMergeBlocks(MF);
 
  240    if (!AfterBlockPlacement || MadeChangeThisIteration)
 
  241      MadeChangeThisIteration |= OptimizeBranches(MF);
 
  242    if (EnableHoistCommonCode)
 
  243      MadeChangeThisIteration |= HoistCommonCode(MF);
 
  244    MadeChange |= MadeChangeThisIteration;
 
  258        if (!
Op.isJTI()) 
continue;
 
  261        JTIsLive.
set(
Op.getIndex());
 
  267  for (
unsigned i = 0, e = JTIsLive.
size(); i != e; ++i)
 
  268    if (!JTIsLive.
test(i)) {
 
 
  282  unsigned Hash = 
MI.getOpcode();
 
  283  for (
unsigned i = 0, e = 
MI.getNumOperands(); i != e; ++i) {
 
  289    unsigned OperandHash = 0;
 
  290    switch (
Op.getType()) {
 
  292      OperandHash = 
Op.getReg().id();
 
  295      OperandHash = 
Op.getImm();
 
  298      OperandHash = 
Op.getMBB()->getNumber();
 
  303      OperandHash = 
Op.getIndex();
 
  309      OperandHash = 
Op.getOffset();
 
  315    Hash += ((OperandHash << 3) | 
Op.getType()) << (i & 31);
 
 
  331  return !(
MI.isDebugInstr() || 
MI.isCFIInstruction());
 
 
  340  while (
I != 
MBB->begin()) {
 
 
  361  unsigned TailLen = 0;
 
  365    if (MBBI1 == MBB1->
end() || MBBI2 == MBB2->
end())
 
  367    if (!MBBI1->isIdenticalTo(*MBBI2) ||
 
  373        MBBI1->isInlineAsm()) {
 
 
  391    MachineBasicBlock &OldMBB = *OldInst->getParent();
 
  393    LiveRegs.addLiveOuts(OldMBB);
 
  398      LiveRegs.stepBackward(*
I);
 
  399    } 
while (
I != OldInst);
 
  404    for (MachineBasicBlock::RegisterMaskPair 
P : NewDest.
liveins()) {
 
  408             "Can only handle full register.");
 
  409      MCRegister 
Reg = 
P.PhysReg;
 
  410      if (!LiveRegs.available(*MRI, 
Reg))
 
  413      BuildMI(OldMBB, OldInst, 
DL, TII->get(TargetOpcode::IMPLICIT_DEF), 
Reg);
 
  417  TII->ReplaceTailWithBranchTo(OldInst, &NewDest);
 
  424  if (!TII->isLegalToSplitMBBAt(CurMBB, BBI1))
 
  427  MachineFunction &MF = *CurMBB.
getParent();
 
  441  NewMBB->
splice(NewMBB->
end(), &CurMBB, BBI1, CurMBB.
end());
 
  445    if (MachineLoop *
ML = MLI->getLoopFor(&CurMBB))
 
  446      ML->addBasicBlockToLoop(NewMBB, *MLI);
 
  449  MBBFreqInfo.setBlockFreq(NewMBB, MBBFreqInfo.getBlockFreq(&CurMBB));
 
  455  const auto &EHScopeI = EHScopeMembership.find(&CurMBB);
 
  456  if (EHScopeI != EHScopeMembership.end()) {
 
  457    auto n = EHScopeI->second;
 
  458    EHScopeMembership[NewMBB] = n;
 
  469  for (; 
I != 
E; ++
I) {
 
  474    else if (
I->mayLoadOrStore())
 
 
  495  if (
I != MF->
end() && !
TII->analyzeBranch(*CurMBB, 
TBB, FBB, 
Cond, 
true)) {
 
  497    if (
TBB == NextBB && !
Cond.empty() && !FBB) {
 
  498      if (!
TII->reverseBranchCondition(
Cond)) {
 
  499        TII->removeBranch(*CurMBB);
 
  500        TII->insertBranch(*CurMBB, SuccBB, 
nullptr, 
Cond, dl);
 
  505  TII->insertBranch(*CurMBB, SuccBB, 
nullptr,
 
 
  510BranchFolder::MergePotentialsElt::operator<(
const MergePotentialsElt &o)
 const {
 
  511  if (getHash() < 
o.getHash())
 
  513  if (getHash() > 
o.getHash())
 
  515  if (getBlock()->getNumber() < 
o.getBlock()->getNumber())
 
  517  if (getBlock()->getNumber() > 
o.getBlock()->getNumber())
 
  528  unsigned NumTerms = 0;
 
  530    if (
I == 
MBB->begin()) {
 
  535    if (!
I->isTerminator()) 
break;
 
 
  545  if (!
MBB->succ_empty())
 
  549  return !(
MBB->back().isReturn() || 
MBB->back().isIndirectBranch());
 
 
  570                  unsigned MinCommonTailLength, 
unsigned &CommonTailLen,
 
  579  if (!EHScopeMembership.
empty()) {
 
  580    auto EHScope1 = EHScopeMembership.
find(MBB1);
 
  581    assert(EHScope1 != EHScopeMembership.
end());
 
  582    auto EHScope2 = EHScopeMembership.
find(MBB2);
 
  583    assert(EHScope2 != EHScopeMembership.
end());
 
  584    if (EHScope1->second != EHScope2->second)
 
  589  if (CommonTailLen == 0)
 
  593                    << CommonTailLen << 
'\n');
 
  603  bool FullBlockTail1 = I1 == MBB1->
begin();
 
  604  bool FullBlockTail2 = I2 == MBB2->
begin();
 
  611  if ((MBB1 == PredBB || MBB2 == PredBB) &&
 
  612      (!AfterPlacement || MBB1->
succ_size() == 1)) {
 
  615    if (CommonTailLen > NumTerms)
 
  624  if (FullBlockTail1 && FullBlockTail2 &&
 
  641  if (AfterPlacement && FullBlockTail1 && FullBlockTail2) {
 
  643      if (!
MBB->succ_empty() && !
MBB->canFallThrough())
 
  647      return (
MBB != &*MF->
begin()) && std::prev(
I)->canFallThrough();
 
  649    if (!BothFallThrough(MBB1) || !BothFallThrough(MBB2))
 
  658  unsigned EffectiveTailLen = CommonTailLen;
 
  659  if (SuccBB && MBB1 != PredBB && MBB2 != PredBB &&
 
  660      (MBB1->
succ_size() == 1 || !AfterPlacement) &&
 
  666  if (EffectiveTailLen >= MinCommonTailLength)
 
  675  return EffectiveTailLen >= 2 && OptForSize &&
 
  676         (FullBlockTail1 || FullBlockTail2);
 
 
  679unsigned BranchFolder::ComputeSameTails(
unsigned CurHash,
 
  680                                        unsigned MinCommonTailLength,
 
  681                                        MachineBasicBlock *SuccBB,
 
  682                                        MachineBasicBlock *PredBB) {
 
  683  unsigned maxCommonTailLength = 0
U;
 
  686  MPIterator HighestMPIter = std::prev(MergePotentials.end());
 
  687  for (MPIterator CurMPIter = std::prev(MergePotentials.end()),
 
  688                  B = MergePotentials.begin();
 
  689       CurMPIter != 
B && CurMPIter->getHash() == CurHash; --CurMPIter) {
 
  690    for (MPIterator 
I = std::prev(CurMPIter); 
I->getHash() == CurHash; --
I) {
 
  691      unsigned CommonTailLen;
 
  694                            CommonTailLen, TrialBBI1, TrialBBI2,
 
  697                            AfterBlockPlacement, MBBFreqInfo, PSI)) {
 
  698        if (CommonTailLen > maxCommonTailLength) {
 
  700          maxCommonTailLength = CommonTailLen;
 
  701          HighestMPIter = CurMPIter;
 
  702          SameTails.push_back(SameTailElt(CurMPIter, TrialBBI1));
 
  704        if (HighestMPIter == CurMPIter &&
 
  705            CommonTailLen == maxCommonTailLength)
 
  706          SameTails.push_back(SameTailElt(
I, TrialBBI2));
 
  712  return maxCommonTailLength;
 
  715void BranchFolder::RemoveBlocksWithHash(
unsigned CurHash,
 
  716                                        MachineBasicBlock *SuccBB,
 
  717                                        MachineBasicBlock *PredBB,
 
  719  MPIterator CurMPIter, 
B;
 
  720  for (CurMPIter = std::prev(MergePotentials.end()),
 
  721      B = MergePotentials.begin();
 
  722       CurMPIter->getHash() == CurHash; --CurMPIter) {
 
  724    MachineBasicBlock *CurMBB = CurMPIter->getBlock();
 
  725    if (SuccBB && CurMBB != PredBB)
 
  726      FixTail(CurMBB, SuccBB, TII, BranchDL);
 
  730  if (CurMPIter->getHash() != CurHash)
 
  732  MergePotentials.erase(CurMPIter, MergePotentials.end());
 
  735bool BranchFolder::CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
 
  736                                             MachineBasicBlock *SuccBB,
 
  737                                             unsigned maxCommonTailLength,
 
  738                                             unsigned &commonTailIndex) {
 
  740  unsigned TimeEstimate = ~0
U;
 
  741  for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
 
  743    if (SameTails[i].getBlock() == PredBB) {
 
  750                                 SameTails[i].getTailStartPos());
 
  751    if (t <= TimeEstimate) {
 
  758    SameTails[commonTailIndex].getTailStartPos();
 
  759  MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
 
  762                    << maxCommonTailLength);
 
  769  MachineBasicBlock *newMBB = SplitMBBAt(*
MBB, BBI, BB);
 
  775  SameTails[commonTailIndex].setBlock(newMBB);
 
  776  SameTails[commonTailIndex].setTailStartPos(newMBB->
begin());
 
  792  unsigned CommonTailLen = 0;
 
  793  for (
auto E = 
MBB->end(); MBBIStartPos != 
E; ++MBBIStartPos)
 
  801  while (CommonTailLen--) {
 
  802    assert(
MBBI != MBBIE && 
"Reached BB end within common tail length!");
 
  813    assert(MBBICommon != MBBIECommon &&
 
  814           "Reached BB end within common tail length!");
 
  815    assert(MBBICommon->isIdenticalTo(*
MBBI) && 
"Expected matching MIIs!");
 
  818    if (MBBICommon->mayLoadOrStore())
 
  819      MBBICommon->cloneMergedMemRefs(*
MBB->getParent(), {&*MBBICommon, &*MBBI});
 
  821    for (
unsigned I = 0, 
E = MBBICommon->getNumOperands(); 
I != 
E; ++
I) {
 
 
  835void BranchFolder::mergeCommonTails(
unsigned commonTailIndex) {
 
  836  MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
 
  838  std::vector<MachineBasicBlock::iterator> NextCommonInsts(SameTails.size());
 
  839  for (
unsigned int i = 0 ; i != SameTails.size() ; ++i) {
 
  840    if (i != commonTailIndex) {
 
  841      NextCommonInsts[i] = SameTails[i].getTailStartPos();
 
  845          "MBB is not a common tail only block");
 
  849  for (
auto &
MI : *
MBB) {
 
  853    for (
unsigned int i = 0 ; i < NextCommonInsts.size() ; i++) {
 
  854      if (i == commonTailIndex)
 
  857      auto &Pos = NextCommonInsts[i];
 
  858      assert(Pos != SameTails[i].getBlock()->
end() &&
 
  859          "Reached BB end within common tail");
 
  862        assert(Pos != SameTails[i].getBlock()->
end() &&
 
  863            "Reached BB end within common tail");
 
  865      assert(
MI.isIdenticalTo(*Pos) && 
"Expected matching MIIs!");
 
  867      NextCommonInsts[i] = ++Pos;
 
  873    LivePhysRegs NewLiveIns(*TRI);
 
  881      LiveRegs.addLiveOuts(*Pred);
 
  884        if (!LiveRegs.available(*MRI, 
Reg))
 
  890              return NewLiveIns.contains(SReg) && !MRI->isReserved(SReg);
 
  895        BuildMI(*Pred, InsertBefore, 
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
 
  914bool BranchFolder::TryTailMergeBlocks(MachineBasicBlock *SuccBB,
 
  915                                      MachineBasicBlock *PredBB,
 
  916                                      unsigned MinCommonTailLength) {
 
  917  bool MadeChange = 
false;
 
  920    dbgs() << 
"\nTryTailMergeBlocks: ";
 
  921    for (
unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
 
  923             << (i == 
e - 1 ? 
"" : 
", ");
 
  931    dbgs() << 
"Looking for common tails of at least " << MinCommonTailLength
 
  932           << 
" instruction" << (MinCommonTailLength == 1 ? 
"" : 
"s") << 
'\n';
 
  937#if LLVM_ENABLE_DEBUGLOC_TRACKING_ORIGIN 
  940  std::sort(MergePotentials.begin(), MergePotentials.end());
 
  946  while (MergePotentials.size() > 1) {
 
  947    unsigned CurHash = MergePotentials.back().getHash();
 
  948    const DebugLoc &BranchDL = MergePotentials.back().getBranchDebugLoc();
 
  952    unsigned maxCommonTailLength = ComputeSameTails(CurHash,
 
  958    if (SameTails.empty()) {
 
  959      RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
 
  967    MachineBasicBlock *EntryBB =
 
  968        &MergePotentials.front().getBlock()->getParent()->front();
 
  969    unsigned commonTailIndex = SameTails.size();
 
  972    if (SameTails.size() == 2 &&
 
  973        SameTails[0].getBlock()->isLayoutSuccessor(SameTails[1].getBlock()) &&
 
  974        SameTails[1].tailIsWholeBlock() && !SameTails[1].getBlock()->isEHPad())
 
  976    else if (SameTails.size() == 2 &&
 
  977             SameTails[1].getBlock()->isLayoutSuccessor(
 
  978                 SameTails[0].getBlock()) &&
 
  979             SameTails[0].tailIsWholeBlock() &&
 
  980             !SameTails[0].getBlock()->isEHPad())
 
  985      for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
 
  986        MachineBasicBlock *
MBB = SameTails[i].getBlock();
 
  988            SameTails[i].tailIsWholeBlock())
 
  994        if (SameTails[i].tailIsWholeBlock())
 
  999    if (commonTailIndex == SameTails.size() ||
 
 1000        (SameTails[commonTailIndex].getBlock() == PredBB &&
 
 1001         !SameTails[commonTailIndex].tailIsWholeBlock())) {
 
 1004      if (!CreateCommonTailOnlyBlock(PredBB, SuccBB,
 
 1005                                     maxCommonTailLength, commonTailIndex)) {
 
 1006        RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
 
 1011    MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
 
 1014    setCommonTailEdgeWeights(*
MBB);
 
 1018    mergeCommonTails(commonTailIndex);
 
 1024    for (
unsigned int i=0, e = SameTails.size(); i != e; ++i) {
 
 1025      if (commonTailIndex == i)
 
 1028                        << (i == e - 1 ? 
"" : 
", "));
 
 1030      replaceTailWithBranchTo(SameTails[i].getTailStartPos(), *
MBB);
 
 1032      MergePotentials.erase(SameTails[i].getMPIter());
 
 1042bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
 
 1043  bool MadeChange = 
false;
 
 1044  if (!EnableTailMerge)
 
 1049  MergePotentials.clear();
 
 1050  for (MachineBasicBlock &
MBB : MF) {
 
 1061    for (
const MergePotentialsElt &Elt : MergePotentials)
 
 1062      TriedMerging.insert(Elt.getBlock());
 
 1065  if (MergePotentials.size() >= 2)
 
 1066    MadeChange |= TryTailMergeBlocks(
nullptr, 
nullptr, MinCommonTailLength);
 
 1089    if (
I->pred_size() < 2) 
continue;
 
 1090    SmallPtrSet<MachineBasicBlock *, 8> UniquePreds;
 
 1091    MachineBasicBlock *IBB = &*
I;
 
 1092    MachineBasicBlock *PredBB = &*std::prev(
I);
 
 1093    MergePotentials.clear();
 
 1106    if (AfterBlockPlacement && MLI) {
 
 1107      ML = MLI->getLoopFor(IBB);
 
 1108      if (
ML && IBB == 
ML->getHeader())
 
 1112    for (MachineBasicBlock *PBB : 
I->predecessors()) {
 
 1116      if (TriedMerging.count(PBB))
 
 1124      if (!UniquePreds.
insert(PBB).second)
 
 1129      if (PBB->hasEHPadSuccessor() || PBB->mayHaveInlineAsmBr())
 
 1135      if (AfterBlockPlacement && MLI)
 
 1136        if (
ML != MLI->getLoopFor(PBB))
 
 1139      MachineBasicBlock *
TBB = 
nullptr, *FBB = 
nullptr;
 
 1141      if (!TII->analyzeBranch(*PBB, 
TBB, FBB, 
Cond, 
true)) {
 
 1145        if (!
Cond.empty() && 
TBB == IBB) {
 
 1146          if (TII->reverseBranchCondition(NewCond))
 
 1150            auto Next = ++PBB->getIterator();
 
 1151            if (
Next != MF.end())
 
 1157        DebugLoc dl = PBB->findBranchDebugLoc();
 
 1158        if (
TBB && (
Cond.empty() || FBB)) {
 
 1159          TII->removeBranch(*PBB);
 
 1162            TII->insertBranch(*PBB, (
TBB == IBB) ? FBB : 
TBB, 
nullptr,
 
 1166        MergePotentials.push_back(
 
 1174      for (MergePotentialsElt &Elt : MergePotentials)
 
 1175        TriedMerging.insert(Elt.getBlock());
 
 1177    if (MergePotentials.size() >= 2)
 
 1178      MadeChange |= TryTailMergeBlocks(IBB, PredBB, MinCommonTailLength);
 
 1182    PredBB = &*std::prev(
I); 
 
 1183    if (MergePotentials.size() == 1 &&
 
 1184        MergePotentials.begin()->getBlock() != PredBB)
 
 1185      FixTail(MergePotentials.begin()->getBlock(), IBB, TII,
 
 1186              MergePotentials.begin()->getBranchDebugLoc());
 
 1192void BranchFolder::setCommonTailEdgeWeights(MachineBasicBlock &TailMBB) {
 
 1194  BlockFrequency AccumulatedMBBFreq;
 
 1199  for (
const auto &Src : SameTails) {
 
 1200    const MachineBasicBlock *SrcMBB = Src.getBlock();
 
 1201    BlockFrequency BlockFreq = MBBFreqInfo.getBlockFreq(SrcMBB);
 
 1202    AccumulatedMBBFreq += BlockFreq;
 
 1209    auto EdgeFreq = EdgeFreqLs.begin();
 
 1212         SuccI != SuccE; ++SuccI, ++EdgeFreq)
 
 1213      *EdgeFreq += BlockFreq * MBPI.getEdgeProbability(SrcMBB, *SuccI);
 
 1216  MBBFreqInfo.setBlockFreq(&TailMBB, AccumulatedMBBFreq);
 
 1222      std::accumulate(EdgeFreqLs.begin(), EdgeFreqLs.end(), BlockFrequency(0))
 
 1224  auto EdgeFreq = EdgeFreqLs.begin();
 
 1226  if (SumEdgeFreq > 0) {
 
 1228         SuccI != SuccE; ++SuccI, ++EdgeFreq) {
 
 1230          EdgeFreq->getFrequency(), SumEdgeFreq);
 
 1240bool BranchFolder::OptimizeBranches(MachineFunction &MF) {
 
 1241  bool MadeChange = 
false;
 
 1248  for (MachineBasicBlock &
MBB :
 
 1250    MadeChange |= OptimizeBlock(&
MBB);
 
 1254      RemoveDeadBlock(&
MBB);
 
 1266  return MBB->getFirstNonDebugInstr(
true) == 
MBB->end();
 
 
 1274  return I->isBranch();
 
 
 1283  assert(MBB1 && MBB2 && 
"Unknown MachineBasicBlock");
 
 1291  if (MBB1I == MBB1->
end() || MBB2I == MBB2->
end())
 
 1299  return MBB2I->isCall() && !MBB1I->isCall();
 
 
 1307    if (
MI.isDebugInstr()) {
 
 1308      TII->duplicate(PredMBB, InsertBefore, 
MI);
 
 1309      LLVM_DEBUG(
dbgs() << 
"Copied debug entity from empty block to pred: " 
 
 1319    if (
MI.isDebugInstr()) {
 
 1320      TII->duplicate(SuccMBB, InsertBefore, 
MI);
 
 1321      LLVM_DEBUG(
dbgs() << 
"Copied debug entity from empty block to succ: " 
 
 1349bool BranchFolder::OptimizeBlock(MachineBasicBlock *
MBB) {
 
 1350  bool MadeChange = 
false;
 
 1358  bool SameEHScope = 
true;
 
 1359  if (!EHScopeMembership.empty() && FallThrough != MF.
end()) {
 
 1360    auto MBBEHScope = EHScopeMembership.find(
MBB);
 
 1361    assert(MBBEHScope != EHScopeMembership.end());
 
 1362    auto FallThroughEHScope = EHScopeMembership.find(&*FallThrough);
 
 1363    assert(FallThroughEHScope != EHScopeMembership.end());
 
 1364    SameEHScope = MBBEHScope->second == FallThroughEHScope->second;
 
 1369  MachineBasicBlock *CurTBB = 
nullptr, *CurFBB = 
nullptr;
 
 1371  bool CurUnAnalyzable =
 
 1372      TII->analyzeBranch(*
MBB, CurTBB, CurFBB, CurCond, 
true);
 
 1384    if (FallThrough == MF.
end()) {
 
 1386    } 
else if (FallThrough->isEHPad()) {
 
 1402        if (*SI != &*FallThrough && !FallThrough->isSuccessor(*SI)) {
 
 1403          assert((*SI)->isEHPad() && 
"Bad CFG");
 
 1404          FallThrough->copySuccessor(
MBB, SI);
 
 1409        MJTI->ReplaceMBBInJumpTables(
MBB, &*FallThrough);
 
 1419  MachineBasicBlock *PriorTBB = 
nullptr, *PriorFBB = 
nullptr;
 
 1421  bool PriorUnAnalyzable =
 
 1422      TII->analyzeBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, 
true);
 
 1423  if (!PriorUnAnalyzable) {
 
 1427    if (PriorTBB && PriorTBB == PriorFBB) {
 
 1429      TII->removeBranch(PrevBB);
 
 1431      if (PriorTBB != 
MBB)
 
 1432        TII->insertBranch(PrevBB, PriorTBB, 
nullptr, PriorCond, Dl);
 
 1435      goto ReoptimizeBlock;
 
 1449                        << 
"From MBB: " << *
MBB);
 
 1451      if (!PrevBB.
empty()) {
 
 1457        while (PrevBBIter != PrevBB.
begin() && MBBIter != 
MBB->
end()
 
 1458               && PrevBBIter->isDebugInstr() && MBBIter->isDebugInstr()) {
 
 1459          if (!MBBIter->isIdenticalTo(*PrevBBIter))
 
 1461          MachineInstr &DuplicateDbg = *MBBIter;
 
 1462          ++MBBIter; -- PrevBBIter;
 
 1476    if (PriorTBB == 
MBB && !PriorFBB) {
 
 1477      TII->removeBranch(PrevBB);
 
 1480      goto ReoptimizeBlock;
 
 1485    if (PriorFBB == 
MBB) {
 
 1487      TII->removeBranch(PrevBB);
 
 1488      TII->insertBranch(PrevBB, PriorTBB, 
nullptr, PriorCond, Dl);
 
 1491      goto ReoptimizeBlock;
 
 1497    if (PriorTBB == 
MBB) {
 
 1499      if (!TII->reverseBranchCondition(NewPriorCond)) {
 
 1501        TII->removeBranch(PrevBB);
 
 1502        TII->insertBranch(PrevBB, PriorFBB, 
nullptr, NewPriorCond, Dl);
 
 1505        goto ReoptimizeBlock;
 
 1520      bool DoTransform = 
true;
 
 1527      if (FallThrough == --MF.
end() &&
 
 1529        DoTransform = 
false;
 
 1534        if (!TII->reverseBranchCondition(NewPriorCond)) {
 
 1536                            << 
"To make fallthrough to: " << *PriorTBB << 
"\n");
 
 1539          TII->removeBranch(PrevBB);
 
 1540          TII->insertBranch(PrevBB, 
MBB, 
nullptr, NewPriorCond, Dl);
 
 1554    if (TII->isUnconditionalTailCall(TailCall)) {
 
 1557        MachineBasicBlock *PredTBB = 
nullptr, *PredFBB = 
nullptr;
 
 1559        bool PredAnalyzable =
 
 1560            !TII->analyzeBranch(*Pred, PredTBB, PredFBB, PredCond, 
true);
 
 1563        if (PredAnalyzable && !PredCond.
empty() && PredTBB == 
MBB &&
 
 1564            PredTBB != PredFBB) {
 
 1568          if (TII->canMakeTailCallConditional(PredCond, TailCall)) {
 
 1572            TII->replaceBranchWithTailCall(*Pred, PredCond, TailCall);
 
 1582      if (!PredsChanged.
empty()) {
 
 1583        NumTailCalls += PredsChanged.
size();
 
 1584        for (
auto &Pred : PredsChanged)
 
 1592  if (!CurUnAnalyzable) {
 
 1598    if (CurTBB && CurFBB && CurFBB == 
MBB && CurTBB != 
MBB) {
 
 1600      if (!TII->reverseBranchCondition(NewCond)) {
 
 1602        TII->removeBranch(*
MBB);
 
 1603        TII->insertBranch(*
MBB, CurFBB, CurTBB, NewCond, Dl);
 
 1606        goto ReoptimizeBlock;
 
 1612    if (CurTBB && CurCond.
empty() && !CurFBB &&
 
 1619      TII->removeBranch(*
MBB);
 
 1635        if (PredHasNoFallThrough || !PriorUnAnalyzable ||
 
 1640              PriorTBB != 
MBB && PriorFBB != 
MBB) {
 
 1643                     "Bad branch analysis");
 
 1646              assert(!PriorFBB && 
"Machine CFG out of date!");
 
 1650            TII->removeBranch(PrevBB);
 
 1651            TII->insertBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, PrevDl);
 
 1656          bool DidChange = 
false;
 
 1657          bool HasBranchToSelf = 
false;
 
 1663              HasBranchToSelf = 
true;
 
 1673                  assert((*SI)->isEHPad() && 
"Bad CFG");
 
 1679              MachineBasicBlock *NewCurTBB = 
nullptr, *NewCurFBB = 
nullptr;
 
 1681              bool NewCurUnAnalyzable = TII->analyzeBranch(
 
 1682                  *PMBB, NewCurTBB, NewCurFBB, NewCurCond, 
true);
 
 1683              if (!NewCurUnAnalyzable && NewCurTBB && NewCurTBB == NewCurFBB) {
 
 1685                TII->removeBranch(*PMBB);
 
 1687                TII->insertBranch(*PMBB, NewCurTBB, 
nullptr, NewCurCond,
 
 1697            MJTI->ReplaceMBBInJumpTables(
MBB, CurTBB);
 
 1701            if (!HasBranchToSelf) 
return MadeChange;
 
 1707      TII->insertBranch(*
MBB, CurTBB, 
nullptr, CurCond, Dl);
 
 1725        MachineBasicBlock *PredTBB = 
nullptr, *PredFBB = 
nullptr;
 
 1728            !TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, 
true) &&
 
 1729            (PredTBB == 
MBB || PredFBB == 
MBB) &&
 
 1730            (!CurFallsThru || !CurTBB || !CurFBB) &&
 
 1745            TII->insertBranch(*
MBB, NextBB, 
nullptr, CurCond, 
DebugLoc());
 
 1749          goto ReoptimizeBlock;
 
 1754    if (!CurFallsThru) {
 
 1757      if (!CurUnAnalyzable) {
 
 1758        for (MachineBasicBlock *SuccBB : {CurFBB, CurTBB}) {
 
 1767          if (SuccBB != 
MBB && &*SuccPrev != 
MBB &&
 
 1768              !SuccPrev->canFallThrough()) {
 
 1771            goto ReoptimizeBlock;
 
 1797      MachineBasicBlock *PrevTBB = 
nullptr, *PrevFBB = 
nullptr;
 
 1800      if (FallThrough != MF.
end() && !FallThrough->isEHPad() &&
 
 1801          !FallThrough->isInlineAsmBrIndirectTarget() &&
 
 1802          !TII->analyzeBranch(PrevBB, PrevTBB, PrevFBB, PrevCond, 
true) &&
 
 1818bool BranchFolder::HoistCommonCode(MachineFunction &MF) {
 
 1819  bool MadeChange = 
false;
 
 1821    MadeChange |= HoistCommonCodeInSuccs(&
MBB);
 
 1831    if (SuccBB != TrueBB)
 
 
 1836template <
class Container>
 
 1839  if (
Reg.isPhysical()) {
 
 
 1861  if (!
TII->isUnpredicatedTerminator(*
Loc))
 
 1902    if (!MO.isReg() || MO.isUse())
 
 1923  bool DontMoveAcrossStore = 
true;
 
 1924  if (!PI->isSafeToMove(DontMoveAcrossStore) || 
TII->isPredicated(*PI))
 
 1939        if (
Reg.isPhysical()) {
 
 
 1951bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *
MBB) {
 
 1952  MachineBasicBlock *
TBB = 
nullptr, *FBB = 
nullptr;
 
 1970  SmallSet<Register, 4> 
Uses, Defs;
 
 1976  bool HasDups = 
false;
 
 1977  SmallSet<Register, 4> ActiveDefsSet, AllDefsSet;
 
 1982  while (TIB != TIE && FIB != FIE) {
 
 1986    if (TIB == TIE || FIB == FIE)
 
 1992    if (TII->isPredicated(*TIB))
 
 1997    for (MachineOperand &MO : TIB->operands()) {
 
 1999      if (MO.isRegMask()) {
 
 2016        if (Defs.
count(
Reg) && !MO.isDead()) {
 
 2031      } 
else if (!ActiveDefsSet.
count(
Reg)) {
 
 2038        if (MO.isKill() && 
Uses.count(
Reg))
 
 2041          MO.setIsKill(
false);
 
 2047    bool DontMoveAcrossStore = 
true;
 
 2048    if (!TIB->isSafeToMove(DontMoveAcrossStore))
 
 2052    for (
const MachineOperand &MO : TIB->all_uses()) {
 
 2062        for (MCRegAliasIterator AI(
Reg, TRI, 
true); AI.isValid(); ++AI)
 
 2063          ActiveDefsSet.
erase(*AI);
 
 2070    for (
const MachineOperand &MO : TIB->all_defs()) {
 
 2097    MachineInstrBuilder MIRBuilder(*
MBB->
getParent(), Loc);
 
 2099      assert(DI->isDebugInstr() && 
"Expected a debug instruction");
 
 2100      if (DI->isDebugRef()) {
 
 2101        const TargetInstrInfo *TII =
 
 2103        const MCInstrDesc &DBGV = TII->
get(TargetOpcode::DBG_VALUE);
 
 2105                     DI->getDebugVariable(), DI->getDebugExpression());
 
 2110      if (DI->isDebugPHI()) {
 
 2111        DI->eraseFromParent();
 
 2115      if (!DI->isDebugLabel())
 
 2116        DI->setDebugValueUndef();
 
 2117      DI->moveBefore(&*Loc);
 
 2129      while (FI != FE && FI->isDebugInstr())
 
 2130        HoistAndKillDbgInstr(FI++);
 
 2133      if (TI->isDebugInstr()) {
 
 2134        HoistAndKillDbgInstr(TI);
 
 2139      assert(FI != FE && 
"Unexpected end of FBB range");
 
 2142      assert(!TI->isPseudoProbe() && 
"Unexpected pseudo probe in range");
 
 2146             "Expected non-debug lockstep");
 
 2151      TI->moveBefore(&*Loc);
 
 2156  FBB->erase(FBB->begin(), FIB);
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
 
MachineBasicBlock MachineBasicBlock::iterator MBBI
 
This file implements the BitVector class.
 
static unsigned EstimateRuntime(MachineBasicBlock::iterator I, MachineBasicBlock::iterator E)
EstimateRuntime - Make a rough estimate for how long it will take to run the specified code.
 
static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2, MachineBasicBlock::iterator &I1, MachineBasicBlock::iterator &I2)
Given two machine basic blocks, return the number of instructions they actually have in common togeth...
 
static MachineBasicBlock * findFalseBlock(MachineBasicBlock *BB, MachineBasicBlock *TrueBB)
findFalseBlock - BB has a fallthrough.
 
static void copyDebugInfoToPredecessor(const TargetInstrInfo *TII, MachineBasicBlock &MBB, MachineBasicBlock &PredMBB)
 
static unsigned HashMachineInstr(const MachineInstr &MI)
HashMachineInstr - Compute a hash value for MI and its operands.
 
static bool countsAsInstruction(const MachineInstr &MI)
Whether MI should be counted as an instruction when calculating common tail.
 
static unsigned CountTerminators(MachineBasicBlock *MBB, MachineBasicBlock::iterator &I)
CountTerminators - Count the number of terminators in the given block and set I to the position of th...
 
static bool blockEndsInUnreachable(const MachineBasicBlock *MBB)
A no successor, non-return block probably ends in unreachable and is cold.
 
static void salvageDebugInfoFromEmptyBlock(const TargetInstrInfo *TII, MachineBasicBlock &MBB)
 
static MachineBasicBlock::iterator skipBackwardPastNonInstructions(MachineBasicBlock::iterator I, MachineBasicBlock *MBB)
Iterate backwards from the given iterator I, towards the beginning of the block.
 
static cl::opt< unsigned > TailMergeThreshold("tail-merge-threshold", cl::desc("Max number of predecessors to consider tail merging"), cl::init(150), cl::Hidden)
 
static void addRegAndItsAliases(Register Reg, const TargetRegisterInfo *TRI, Container &Set)
 
static cl::opt< cl::boolOrDefault > FlagEnableTailMerge("enable-tail-merge", cl::init(cl::BOU_UNSET), cl::Hidden)
 
static cl::opt< unsigned > TailMergeSize("tail-merge-size", cl::desc("Min number of instructions to consider tail merging"), cl::init(3), cl::Hidden)
 
static bool IsEmptyBlock(MachineBasicBlock *MBB)
 
static bool ProfitableToMerge(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2, unsigned MinCommonTailLength, unsigned &CommonTailLen, MachineBasicBlock::iterator &I1, MachineBasicBlock::iterator &I2, MachineBasicBlock *SuccBB, MachineBasicBlock *PredBB, DenseMap< const MachineBasicBlock *, int > &EHScopeMembership, bool AfterPlacement, MBFIWrapper &MBBFreqInfo, ProfileSummaryInfo *PSI)
ProfitableToMerge - Check if two machine basic blocks have a common tail and decide if it would be pr...
 
static void copyDebugInfoToSuccessor(const TargetInstrInfo *TII, MachineBasicBlock &MBB, MachineBasicBlock &SuccMBB)
 
static bool IsBranchOnlyBlock(MachineBasicBlock *MBB)
 
static void FixTail(MachineBasicBlock *CurMBB, MachineBasicBlock *SuccBB, const TargetInstrInfo *TII, const DebugLoc &BranchDL)
 
static bool IsBetterFallthrough(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2)
IsBetterFallthrough - Return true if it would be clearly better to fall-through to MBB1 than to fall ...
 
static unsigned HashEndOfMBB(const MachineBasicBlock &MBB)
HashEndOfMBB - Hash the last instruction in the MBB.
 
static void mergeOperations(MachineBasicBlock::iterator MBBIStartPos, MachineBasicBlock &MBBCommon)
 
static MachineBasicBlock::iterator findHoistingInsertPosAndDeps(MachineBasicBlock *MBB, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, SmallSet< Register, 4 > &Uses, SmallSet< Register, 4 > &Defs)
findHoistingInsertPosAndDeps - Find the location to move common instructions in successors to.
 
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
 
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
 
const HexagonInstrInfo * TII
 
A common definition of LaneBitmask for use in TableGen and CodeGen.
 
Register const TargetRegisterInfo * TRI
 
Promote Memory to Register
 
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
 
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
 
const SmallVectorImpl< MachineOperand > & Cond
 
Remove Loads Into Fake Uses
 
This file defines the SmallSet class.
 
This file defines the SmallVector class.
 
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
 
#define STATISTIC(VARNAME, DESC)
 
Target-Independent Code Generator Pass Configuration Options pass.
 
AnalysisUsage & addRequired()
 
LLVM Basic Block Representation.
 
bool test(unsigned Idx) const
 
size_type size() const
size - Returns the number of bits in this bitvector.
 
bool OptimizeFunction(MachineFunction &MF, const TargetInstrInfo *tii, const TargetRegisterInfo *tri, MachineLoopInfo *mli=nullptr, bool AfterPlacement=false)
Perhaps branch folding, tail merging and other CFG optimizations on the given function.
 
BranchFolder(bool DefaultEnableTailMerge, bool CommonHoist, MBFIWrapper &FreqInfo, const MachineBranchProbabilityInfo &ProbInfo, ProfileSummaryInfo *PSI, unsigned MinTailLength=0)
 
static LLVM_ABI BranchProbability getBranchProbability(uint64_t Numerator, uint64_t Denominator)
 
static LLVM_ABI DILocation * getMergedLocation(DILocation *LocA, DILocation *LocB)
Attempts to merge LocA and LocB into a single location; see DebugLoc::getMergedLocation for more deta...
 
static LLVM_ABI DebugLoc getMergedLocation(DebugLoc LocA, DebugLoc LocB)
When two instructions are combined into a single instruction we also need to combine the original loc...
 
iterator find(const_arg_type_t< KeyT > Val)
 
void removeBlock(BlockT *BB)
This method completely removes BB from all data structures, including all of the Loop objects it is n...
 
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode.
 
MCRegAliasIterator enumerates all registers aliasing Reg.
 
An RAII based helper class to modify MachineFunctionProperties when running pass.
 
unsigned pred_size() const
 
bool isEHPad() const
Returns true if the block is a landing pad.
 
MachineInstrBundleIterator< const MachineInstr > const_iterator
 
LLVM_ABI void moveBefore(MachineBasicBlock *NewAfter)
Move 'this' block before or after the specified block.
 
LLVM_ABI void transferSuccessors(MachineBasicBlock *FromMBB)
Transfers all the successors from MBB to this machine basic block (i.e., copies all the successors Fr...
 
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
 
iterator_range< livein_iterator > liveins() const
 
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
 
LLVM_ABI iterator SkipPHIsAndLabels(iterator I)
Return the first instruction in MBB after I that is not a PHI or a label.
 
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
 
LLVM_ABI bool canFallThrough()
Return true if the block can implicitly transfer control to the block after it by falling off the end...
 
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
 
LLVM_ABI iterator getFirstNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the first non-debug instruction in the basic block, or end().
 
succ_iterator succ_begin()
 
LLVM_ABI void clearLiveIns()
Clear live in list.
 
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
 
unsigned succ_size() const
 
bool hasAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
 
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
 
LLVM_ABI void copySuccessor(const MachineBasicBlock *Orig, succ_iterator I)
Copy a successor (and any probability info) from original block to this block's.
 
LLVM_ABI void removeSuccessor(MachineBasicBlock *Succ, bool NormalizeSuccProbs=false)
Remove successor from the successors list of this MachineBasicBlock.
 
pred_iterator pred_begin()
 
LLVM_ABI iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
 
LLVM_ABI void ReplaceUsesOfBlockWith(MachineBasicBlock *Old, MachineBasicBlock *New)
Given a machine basic block that branched to 'Old', change the code and CFG so that it branches to 'N...
 
MachineInstrBundleIterator< MachineInstr, true > reverse_iterator
 
LLVM_ABI bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
 
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
 
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
 
LLVM_ABI DebugLoc findBranchDebugLoc()
Find and return the merged DebugLoc of the branch instructions of the block.
 
iterator_range< succ_iterator > successors()
 
reverse_iterator rbegin()
 
bool isMachineBlockAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
 
LLVM_ABI bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
 
iterator_range< pred_iterator > predecessors()
 
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
 
MachineInstrBundleIterator< MachineInstr > iterator
 
LLVM_ABI void moveAfter(MachineBasicBlock *NewBefore)
 
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
 
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
 
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
 
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
 
Function & getFunction()
Return the LLVM function that this machine code represents.
 
const MachineBasicBlock & back() const
 
BasicBlockListType::iterator iterator
 
void eraseAdditionalCallInfo(const MachineInstr *MI)
Following functions update call site info.
 
void RenumberBlocks(MachineBasicBlock *MBBFrom=nullptr)
RenumberBlocks - This discards all of the MachineBasicBlock numbers and recomputes them.
 
const MachineJumpTableInfo * getJumpTableInfo() const
getJumpTableInfo - Return the jump table info object for the current function.
 
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
 
void erase(iterator MBBI)
 
void insert(iterator MBBI, MachineBasicBlock *MBB)
 
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
 
Representation of each machine instruction.
 
bool isBarrier(QueryType Type=AnyInBundle) const
Returns true if the specified instruction stops control flow from executing the instruction immediate...
 
LLVM_ABI void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
 
void RemoveJumpTable(unsigned Idx)
RemoveJumpTable - Mark the specific index as being dead.
 
const std::vector< MachineJumpTableEntry > & getJumpTables() const
 
MachineOperand class - Representation of each machine instruction operand.
 
bool isReg() const
isReg - Tests if this is a MO_Register operand.
 
void setIsUndef(bool Val=true)
 
@ MO_Immediate
Immediate operand.
 
@ MO_ConstantPoolIndex
Address of indexed Constant in Constant Pool.
 
@ MO_GlobalAddress
Address of a global value.
 
@ MO_MachineBasicBlock
MachineBasicBlock reference.
 
@ MO_FrameIndex
Abstract Stack Frame Index.
 
@ MO_Register
Register operand.
 
@ MO_ExternalSymbol
Name of external global symbol.
 
@ MO_JumpTableIndex
Address of indexed Jump Table for switch.
 
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
 
bool tracksLiveness() const
tracksLiveness - Returns true when tracking register liveness accurately.
 
A set of analyses that are preserved following a run of a transformation pass.
 
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
 
Analysis providing profile information.
 
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.
 
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
 
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
 
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
 
void push_back(const T &Elt)
 
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
 
TargetInstrInfo - Interface to description of machine instruction set.
 
bool requiresStructuredCFG() const
 
bool getEnableTailMerge() const
 
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
 
virtual const TargetInstrInfo * getInstrInfo() const
 
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
 
self_iterator getIterator()
 
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
 
@ BasicBlock
Various leaf nodes.
 
initializer< Ty > init(const Ty &Val)
 
LLVM_ABI iterator begin() const
 
This is an optimization pass for GlobalISel generic memory operations.
 
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
 
OuterAnalysisManagerProxy< ModuleAnalysisManager, MachineFunction > ModuleAnalysisManagerMachineFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
 
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
 
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
 
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
 
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
 
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
 
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
 
IterT skipDebugInstructionsForward(IterT It, IterT End, bool SkipPseudoOp=true)
Increment It until it points to a non-debug instruction or to End and return the resulting iterator.
 
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
 
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
 
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
 
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
 
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
 
FunctionAddr VTableAddr Next
 
DWARFExpression::Operation Op
 
void computeAndAddLiveIns(LivePhysRegs &LiveRegs, MachineBasicBlock &MBB)
Convenience function combining computeLiveIns() and addLiveIns().
 
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
 
void computeLiveIns(LivePhysRegs &LiveRegs, const MachineBasicBlock &MBB)
Computes registers live-in to MBB assuming all of its successors live-in lists are up-to-date.
 
LLVM_ABI char & BranchFolderPassID
BranchFolding - This pass performs machine code CFG based optimizations to delete branches to branche...
 
IterT prev_nodbg(IterT It, IterT Begin, bool SkipPseudoOp=true)
Decrement It, then continue decrementing it while it points to a debug instruction.
 
void fullyRecomputeLiveIns(ArrayRef< MachineBasicBlock * > MBBs)
Convenience function for recomputing live-in's for a set of MBBs until the computation converges.
 
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
 
void addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs)
Adds registers contained in LiveRegs to the block live-in list of MBB.
 
DenseMap< const MachineBasicBlock *, int > getEHScopeMembership(const MachineFunction &MF)
 
static constexpr LaneBitmask getAll()