47#include "llvm/Config/llvm-config.h"
69#define DEBUG_TYPE "branch-folder"
71STATISTIC(NumDeadBlocks,
"Number of dead blocks removed");
72STATISTIC(NumBranchOpts,
"Number of branches optimized");
73STATISTIC(NumTailMerge ,
"Number of block tails merged");
74STATISTIC(NumHoist ,
"Number of times common instructions are hoisted");
75STATISTIC(NumTailCalls,
"Number of tail calls optimized");
83 cl::desc(
"Max number of predecessors to consider tail merging"),
89 cl::desc(
"Min number of instructions to consider tail merging"),
101 bool runOnMachineFunction(MachineFunction &MF)
override;
103 void getAnalysisUsage(AnalysisUsage &AU)
const override {
104 AU.
addRequired<MachineBlockFrequencyInfoWrapperPass>();
105 AU.
addRequired<MachineBranchProbabilityInfoWrapperPass>();
111 MachineFunctionProperties getRequiredProperties()
const override {
112 return MachineFunctionProperties().setNoPHIs();
118char BranchFolderLegacy::ID = 0;
128 bool EnableTailMerge =
129 !MF.getTarget().requiresStructuredCFG() && this->EnableTailMerge;
133 .getCachedResult<ProfileSummaryAnalysis>(
134 *MF.getFunction().getParent());
137 "ProfileSummaryAnalysis is required for BranchFoldingPass",
false);
143 BranchFolder Folder(EnableTailMerge,
true, MBBFreqInfo, MBPI,
145 if (Folder.OptimizeFunction(MF, MF.getSubtarget().getInstrInfo(),
146 MF.getSubtarget().getRegisterInfo()))
150 MDT->updateBlockNumbers();
152 MPDT->updateBlockNumbers();
160 TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
165 MBFIWrapper MBBFreqInfo(
166 getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI());
168 EnableTailMerge,
true, MBBFreqInfo,
169 getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI(),
170 &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI());
179 : EnableHoistCommonCode(CommonHoist), MinCommonTailLength(MinTailLength),
180 MBBFreqInfo(FreqInfo), MBPI(ProbInfo), PSI(PSI) {
183 EnableTailMerge = DefaultEnableTailMerge;
191 assert(
MBB->pred_empty() &&
"MBB must be dead!");
196 while (!
MBB->succ_empty())
197 MBB->removeSuccessor(
MBB->succ_end()-1);
200 TriedMerging.erase(
MBB);
204 if (
MI.shouldUpdateAdditionalCallInfo())
209 EHScopeMembership.erase(
MBB);
218 if (!tii)
return false;
220 TriedMerging.clear();
223 AfterBlockPlacement = AfterPlacement;
229 if (MinCommonTailLength == 0) {
232 : TII->getTailMergeSize(MF);
235 UpdateLiveIns = MRI.
tracksLiveness() && TRI->trackLivenessAfterRegAlloc(MF);
237 MRI.invalidateLiveness();
239 bool MadeChange =
false;
244 bool MadeChangeThisIteration =
true;
245 while (MadeChangeThisIteration) {
246 MadeChangeThisIteration = TailMergeBlocks(MF);
249 if (!AfterBlockPlacement || MadeChangeThisIteration)
250 MadeChangeThisIteration |= OptimizeBranches(MF);
251 if (EnableHoistCommonCode)
252 MadeChangeThisIteration |= HoistCommonCode(MF);
253 MadeChange |= MadeChangeThisIteration;
267 if (!
Op.isJTI())
continue;
270 JTIsLive.
set(
Op.getIndex());
276 for (
unsigned i = 0, e = JTIsLive.
size(); i != e; ++i)
277 if (!JTIsLive.
test(i)) {
291 unsigned Hash =
MI.getOpcode();
292 for (
unsigned i = 0, e =
MI.getNumOperands(); i != e; ++i) {
298 unsigned OperandHash = 0;
299 switch (
Op.getType()) {
301 OperandHash =
Op.getReg().id();
304 OperandHash =
Op.getImm();
307 OperandHash =
Op.getMBB()->getNumber();
312 OperandHash =
Op.getIndex();
318 OperandHash =
Op.getOffset();
324 Hash += ((OperandHash << 3) |
Op.getType()) << (i & 31);
340 return !(
MI.isDebugInstr() ||
MI.isCFIInstruction());
349 while (
I !=
MBB->begin()) {
370 unsigned TailLen = 0;
374 if (MBBI1 == MBB1->
end() || MBBI2 == MBB2->
end())
376 if (!MBBI1->isIdenticalTo(*MBBI2) ||
382 MBBI1->isInlineAsm()) {
400 MachineBasicBlock &OldMBB = *OldInst->getParent();
402 LiveRegs.addLiveOuts(OldMBB);
407 LiveRegs.stepBackward(*
I);
408 }
while (
I != OldInst);
413 for (MachineBasicBlock::RegisterMaskPair
P : NewDest.
liveins()) {
417 "Can only handle full register.");
418 MCRegister
Reg =
P.PhysReg;
419 if (!LiveRegs.available(*MRI,
Reg))
422 BuildMI(OldMBB, OldInst,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
Reg);
426 TII->ReplaceTailWithBranchTo(OldInst, &NewDest);
433 if (!TII->isLegalToSplitMBBAt(CurMBB, BBI1))
436 MachineFunction &MF = *CurMBB.
getParent();
450 NewMBB->
splice(NewMBB->
end(), &CurMBB, BBI1, CurMBB.
end());
454 if (MachineLoop *
ML = MLI->getLoopFor(&CurMBB))
455 ML->addBasicBlockToLoop(NewMBB, *MLI);
458 MBBFreqInfo.setBlockFreq(NewMBB, MBBFreqInfo.getBlockFreq(&CurMBB));
464 const auto &EHScopeI = EHScopeMembership.find(&CurMBB);
465 if (EHScopeI != EHScopeMembership.end()) {
466 auto n = EHScopeI->second;
467 EHScopeMembership[NewMBB] = n;
478 for (;
I !=
E; ++
I) {
483 else if (
I->mayLoadOrStore())
504 if (
I != MF->
end() && !
TII->analyzeBranch(*CurMBB,
TBB, FBB,
Cond,
true)) {
506 if (
TBB == NextBB && !
Cond.empty() && !FBB) {
507 if (!
TII->reverseBranchCondition(
Cond)) {
508 TII->removeBranch(*CurMBB);
509 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
Cond, dl);
514 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
519BranchFolder::MergePotentialsElt::operator<(
const MergePotentialsElt &o)
const {
520 if (getHash() <
o.getHash())
522 if (getHash() >
o.getHash())
524 if (getBlock()->getNumber() <
o.getBlock()->getNumber())
526 if (getBlock()->getNumber() >
o.getBlock()->getNumber())
537 unsigned NumTerms = 0;
539 if (
I ==
MBB->begin()) {
544 if (!
I->isTerminator())
break;
554 if (!
MBB->succ_empty())
558 return !(
MBB->back().isReturn() ||
MBB->back().isIndirectBranch());
579 unsigned MinCommonTailLength,
unsigned &CommonTailLen,
588 if (!EHScopeMembership.
empty()) {
589 auto EHScope1 = EHScopeMembership.
find(MBB1);
590 assert(EHScope1 != EHScopeMembership.
end());
591 auto EHScope2 = EHScopeMembership.
find(MBB2);
592 assert(EHScope2 != EHScopeMembership.
end());
593 if (EHScope1->second != EHScope2->second)
598 if (CommonTailLen == 0)
602 << CommonTailLen <<
'\n');
612 bool FullBlockTail1 = I1 == MBB1->
begin();
613 bool FullBlockTail2 = I2 == MBB2->
begin();
620 if ((MBB1 == PredBB || MBB2 == PredBB) &&
621 (!AfterPlacement || MBB1->
succ_size() == 1)) {
624 if (CommonTailLen > NumTerms)
633 if (FullBlockTail1 && FullBlockTail2 &&
650 if (AfterPlacement && FullBlockTail1 && FullBlockTail2) {
652 if (!
MBB->succ_empty() && !
MBB->canFallThrough())
656 return (
MBB != &*MF->
begin()) && std::prev(
I)->canFallThrough();
658 if (!BothFallThrough(MBB1) || !BothFallThrough(MBB2))
667 unsigned EffectiveTailLen = CommonTailLen;
668 if (SuccBB && MBB1 != PredBB && MBB2 != PredBB &&
669 (MBB1->
succ_size() == 1 || !AfterPlacement) &&
675 if (EffectiveTailLen >= MinCommonTailLength)
684 return EffectiveTailLen >= 2 && OptForSize &&
685 (FullBlockTail1 || FullBlockTail2);
688unsigned BranchFolder::ComputeSameTails(
unsigned CurHash,
689 unsigned MinCommonTailLength,
690 MachineBasicBlock *SuccBB,
691 MachineBasicBlock *PredBB) {
692 unsigned maxCommonTailLength = 0
U;
695 MPIterator HighestMPIter = std::prev(MergePotentials.end());
696 for (MPIterator CurMPIter = std::prev(MergePotentials.end()),
697 B = MergePotentials.begin();
698 CurMPIter !=
B && CurMPIter->getHash() == CurHash; --CurMPIter) {
699 for (MPIterator
I = std::prev(CurMPIter);
I->getHash() == CurHash; --
I) {
700 unsigned CommonTailLen;
703 CommonTailLen, TrialBBI1, TrialBBI2,
706 AfterBlockPlacement, MBBFreqInfo, PSI)) {
707 if (CommonTailLen > maxCommonTailLength) {
709 maxCommonTailLength = CommonTailLen;
710 HighestMPIter = CurMPIter;
711 SameTails.push_back(SameTailElt(CurMPIter, TrialBBI1));
713 if (HighestMPIter == CurMPIter &&
714 CommonTailLen == maxCommonTailLength)
715 SameTails.push_back(SameTailElt(
I, TrialBBI2));
721 return maxCommonTailLength;
724void BranchFolder::RemoveBlocksWithHash(
unsigned CurHash,
725 MachineBasicBlock *SuccBB,
726 MachineBasicBlock *PredBB,
728 MPIterator CurMPIter,
B;
729 for (CurMPIter = std::prev(MergePotentials.end()),
730 B = MergePotentials.begin();
731 CurMPIter->getHash() == CurHash; --CurMPIter) {
733 MachineBasicBlock *CurMBB = CurMPIter->getBlock();
734 if (SuccBB && CurMBB != PredBB)
735 FixTail(CurMBB, SuccBB, TII, BranchDL);
739 if (CurMPIter->getHash() != CurHash)
741 MergePotentials.erase(CurMPIter, MergePotentials.end());
744bool BranchFolder::CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
745 MachineBasicBlock *SuccBB,
746 unsigned maxCommonTailLength,
747 unsigned &commonTailIndex) {
749 unsigned TimeEstimate = ~0
U;
750 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
752 if (SameTails[i].getBlock() == PredBB) {
759 SameTails[i].getTailStartPos());
760 if (t <= TimeEstimate) {
767 SameTails[commonTailIndex].getTailStartPos();
768 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
771 << maxCommonTailLength);
778 MachineBasicBlock *newMBB = SplitMBBAt(*
MBB, BBI, BB);
784 SameTails[commonTailIndex].setBlock(newMBB);
785 SameTails[commonTailIndex].setTailStartPos(newMBB->
begin());
801 unsigned CommonTailLen = 0;
802 for (
auto E =
MBB->end(); MBBIStartPos !=
E; ++MBBIStartPos)
810 while (CommonTailLen--) {
811 assert(
MBBI != MBBIE &&
"Reached BB end within common tail length!");
822 assert(MBBICommon != MBBIECommon &&
823 "Reached BB end within common tail length!");
824 assert(MBBICommon->isIdenticalTo(*
MBBI) &&
"Expected matching MIIs!");
827 if (MBBICommon->mayLoadOrStore())
828 MBBICommon->cloneMergedMemRefs(*
MBB->getParent(), {&*MBBICommon, &*MBBI});
830 for (
unsigned I = 0,
E = MBBICommon->getNumOperands();
I !=
E; ++
I) {
844void BranchFolder::mergeCommonTails(
unsigned commonTailIndex) {
845 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
847 std::vector<MachineBasicBlock::iterator> NextCommonInsts(SameTails.size());
848 for (
unsigned int i = 0 ; i != SameTails.size() ; ++i) {
849 if (i != commonTailIndex) {
850 NextCommonInsts[i] = SameTails[i].getTailStartPos();
854 "MBB is not a common tail only block");
858 for (
auto &
MI : *
MBB) {
862 for (
unsigned int i = 0 ; i < NextCommonInsts.size() ; i++) {
863 if (i == commonTailIndex)
866 auto &Pos = NextCommonInsts[i];
867 assert(Pos != SameTails[i].getBlock()->
end() &&
868 "Reached BB end within common tail");
871 assert(Pos != SameTails[i].getBlock()->
end() &&
872 "Reached BB end within common tail");
874 assert(
MI.isIdenticalTo(*Pos) &&
"Expected matching MIIs!");
876 NextCommonInsts[i] = ++Pos;
882 LivePhysRegs NewLiveIns(*TRI);
890 LiveRegs.addLiveOuts(*Pred);
893 if (!LiveRegs.available(*MRI,
Reg))
899 return NewLiveIns.contains(SReg) && !MRI->isReserved(SReg);
904 BuildMI(*Pred, InsertBefore,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
923bool BranchFolder::TryTailMergeBlocks(MachineBasicBlock *SuccBB,
924 MachineBasicBlock *PredBB,
925 unsigned MinCommonTailLength) {
926 bool MadeChange =
false;
929 dbgs() <<
"\nTryTailMergeBlocks: ";
930 for (
unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
932 << (i ==
e - 1 ?
"" :
", ");
940 dbgs() <<
"Looking for common tails of at least " << MinCommonTailLength
941 <<
" instruction" << (MinCommonTailLength == 1 ?
"" :
"s") <<
'\n';
946#if LLVM_ENABLE_DEBUGLOC_TRACKING_ORIGIN
949 std::sort(MergePotentials.begin(), MergePotentials.end());
955 while (MergePotentials.size() > 1) {
956 unsigned CurHash = MergePotentials.back().getHash();
957 const DebugLoc &BranchDL = MergePotentials.back().getBranchDebugLoc();
961 unsigned maxCommonTailLength = ComputeSameTails(CurHash,
967 if (SameTails.empty()) {
968 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
976 MachineBasicBlock *EntryBB =
977 &MergePotentials.front().getBlock()->getParent()->front();
978 unsigned commonTailIndex = SameTails.size();
981 if (SameTails.size() == 2 &&
982 SameTails[0].getBlock()->isLayoutSuccessor(SameTails[1].getBlock()) &&
983 SameTails[1].tailIsWholeBlock() && !SameTails[1].getBlock()->isEHPad())
985 else if (SameTails.size() == 2 &&
986 SameTails[1].getBlock()->isLayoutSuccessor(
987 SameTails[0].getBlock()) &&
988 SameTails[0].tailIsWholeBlock() &&
989 !SameTails[0].getBlock()->isEHPad())
994 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
995 MachineBasicBlock *
MBB = SameTails[i].getBlock();
997 SameTails[i].tailIsWholeBlock())
1000 commonTailIndex = i;
1003 if (SameTails[i].tailIsWholeBlock())
1004 commonTailIndex = i;
1008 if (commonTailIndex == SameTails.size() ||
1009 (SameTails[commonTailIndex].getBlock() == PredBB &&
1010 !SameTails[commonTailIndex].tailIsWholeBlock())) {
1013 if (!CreateCommonTailOnlyBlock(PredBB, SuccBB,
1014 maxCommonTailLength, commonTailIndex)) {
1015 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
1020 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
1023 setCommonTailEdgeWeights(*
MBB);
1027 mergeCommonTails(commonTailIndex);
1033 for (
unsigned int i=0, e = SameTails.size(); i != e; ++i) {
1034 if (commonTailIndex == i)
1037 << (i == e - 1 ?
"" :
", "));
1039 replaceTailWithBranchTo(SameTails[i].getTailStartPos(), *
MBB);
1041 MergePotentials.erase(SameTails[i].getMPIter());
1051bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
1052 bool MadeChange =
false;
1053 if (!EnableTailMerge)
1058 MergePotentials.clear();
1059 for (MachineBasicBlock &
MBB : MF) {
1070 for (
const MergePotentialsElt &Elt : MergePotentials)
1071 TriedMerging.insert(Elt.getBlock());
1074 if (MergePotentials.size() >= 2)
1075 MadeChange |= TryTailMergeBlocks(
nullptr,
nullptr, MinCommonTailLength);
1098 if (
I->pred_size() < 2)
continue;
1099 SmallPtrSet<MachineBasicBlock *, 8> UniquePreds;
1100 MachineBasicBlock *IBB = &*
I;
1101 MachineBasicBlock *PredBB = &*std::prev(
I);
1102 MergePotentials.clear();
1115 if (AfterBlockPlacement && MLI) {
1116 ML = MLI->getLoopFor(IBB);
1117 if (
ML && IBB ==
ML->getHeader())
1121 for (MachineBasicBlock *PBB :
I->predecessors()) {
1125 if (TriedMerging.count(PBB))
1133 if (!UniquePreds.
insert(PBB).second)
1138 if (PBB->hasEHPadSuccessor() || PBB->mayHaveInlineAsmBr())
1144 if (AfterBlockPlacement && MLI)
1145 if (
ML != MLI->getLoopFor(PBB))
1148 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
1150 if (!TII->analyzeBranch(*PBB,
TBB, FBB,
Cond,
true)) {
1154 if (!
Cond.empty() &&
TBB == IBB) {
1155 if (TII->reverseBranchCondition(NewCond))
1159 auto Next = ++PBB->getIterator();
1160 if (
Next != MF.end())
1166 DebugLoc dl = PBB->findBranchDebugLoc();
1167 if (
TBB && (
Cond.empty() || FBB)) {
1168 TII->removeBranch(*PBB);
1171 TII->insertBranch(*PBB, (
TBB == IBB) ? FBB :
TBB,
nullptr,
1175 MergePotentials.push_back(
1183 for (MergePotentialsElt &Elt : MergePotentials)
1184 TriedMerging.insert(Elt.getBlock());
1186 if (MergePotentials.size() >= 2)
1187 MadeChange |= TryTailMergeBlocks(IBB, PredBB, MinCommonTailLength);
1191 PredBB = &*std::prev(
I);
1192 if (MergePotentials.size() == 1 &&
1193 MergePotentials.begin()->getBlock() != PredBB)
1194 FixTail(MergePotentials.begin()->getBlock(), IBB, TII,
1195 MergePotentials.begin()->getBranchDebugLoc());
1201void BranchFolder::setCommonTailEdgeWeights(MachineBasicBlock &TailMBB) {
1203 BlockFrequency AccumulatedMBBFreq;
1208 for (
const auto &Src : SameTails) {
1209 const MachineBasicBlock *SrcMBB = Src.getBlock();
1210 BlockFrequency BlockFreq = MBBFreqInfo.getBlockFreq(SrcMBB);
1211 AccumulatedMBBFreq += BlockFreq;
1218 auto EdgeFreq = EdgeFreqLs.begin();
1221 SuccI != SuccE; ++SuccI, ++EdgeFreq)
1222 *EdgeFreq += BlockFreq * MBPI.getEdgeProbability(SrcMBB, *SuccI);
1225 MBBFreqInfo.setBlockFreq(&TailMBB, AccumulatedMBBFreq);
1231 std::accumulate(EdgeFreqLs.begin(), EdgeFreqLs.end(), BlockFrequency(0))
1233 auto EdgeFreq = EdgeFreqLs.begin();
1235 if (SumEdgeFreq > 0) {
1237 SuccI != SuccE; ++SuccI, ++EdgeFreq) {
1239 EdgeFreq->getFrequency(), SumEdgeFreq);
1249bool BranchFolder::OptimizeBranches(MachineFunction &MF) {
1250 bool MadeChange =
false;
1257 for (MachineBasicBlock &
MBB :
1259 MadeChange |= OptimizeBlock(&
MBB);
1264 RemoveDeadBlock(&
MBB);
1276 return MBB->getFirstNonDebugInstr(
true) ==
MBB->end();
1284 return I->isBranch();
1293 assert(MBB1 && MBB2 &&
"Unknown MachineBasicBlock");
1301 if (MBB1I == MBB1->
end() || MBB2I == MBB2->
end())
1309 return MBB2I->isCall() && !MBB1I->isCall();
1317 if (
MI.isDebugInstr()) {
1318 TII->duplicate(PredMBB, InsertBefore,
MI);
1319 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to pred: "
1329 if (
MI.isDebugInstr()) {
1330 TII->duplicate(SuccMBB, InsertBefore,
MI);
1331 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to succ: "
1359bool BranchFolder::OptimizeBlock(MachineBasicBlock *
MBB) {
1360 bool MadeChange =
false;
1368 bool SameEHScope =
true;
1369 if (!EHScopeMembership.empty() && FallThrough != MF.
end()) {
1370 auto MBBEHScope = EHScopeMembership.find(
MBB);
1371 assert(MBBEHScope != EHScopeMembership.end());
1372 auto FallThroughEHScope = EHScopeMembership.find(&*FallThrough);
1373 assert(FallThroughEHScope != EHScopeMembership.end());
1374 SameEHScope = MBBEHScope->second == FallThroughEHScope->second;
1379 MachineBasicBlock *CurTBB =
nullptr, *CurFBB =
nullptr;
1381 bool CurUnAnalyzable =
1382 TII->analyzeBranch(*
MBB, CurTBB, CurFBB, CurCond,
true);
1394 if (FallThrough == MF.
end()) {
1396 }
else if (FallThrough->isEHPad()) {
1412 if (*SI != &*FallThrough && !FallThrough->isSuccessor(*SI)) {
1413 assert((*SI)->isEHPad() &&
"Bad CFG");
1414 FallThrough->copySuccessor(
MBB, SI);
1419 MJTI->ReplaceMBBInJumpTables(
MBB, &*FallThrough);
1429 MachineBasicBlock *PriorTBB =
nullptr, *PriorFBB =
nullptr;
1431 bool PriorUnAnalyzable =
1432 TII->analyzeBranch(PrevBB, PriorTBB, PriorFBB, PriorCond,
true);
1433 if (!PriorUnAnalyzable) {
1437 if (PriorTBB && PriorTBB == PriorFBB) {
1439 TII->removeBranch(PrevBB);
1441 if (PriorTBB !=
MBB)
1442 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1445 goto ReoptimizeBlock;
1459 <<
"From MBB: " << *
MBB);
1461 if (!PrevBB.
empty()) {
1467 while (PrevBBIter != PrevBB.
begin() && MBBIter !=
MBB->
end()
1468 && PrevBBIter->isDebugInstr() && MBBIter->isDebugInstr()) {
1469 if (!MBBIter->isIdenticalTo(*PrevBBIter))
1471 MachineInstr &DuplicateDbg = *MBBIter;
1472 ++MBBIter; -- PrevBBIter;
1486 if (PriorTBB ==
MBB && !PriorFBB) {
1487 TII->removeBranch(PrevBB);
1490 goto ReoptimizeBlock;
1495 if (PriorFBB ==
MBB) {
1497 TII->removeBranch(PrevBB);
1498 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1501 goto ReoptimizeBlock;
1507 if (PriorTBB ==
MBB) {
1509 if (!TII->reverseBranchCondition(NewPriorCond)) {
1511 TII->removeBranch(PrevBB);
1512 TII->insertBranch(PrevBB, PriorFBB,
nullptr, NewPriorCond, Dl);
1515 goto ReoptimizeBlock;
1530 bool DoTransform =
true;
1537 if (FallThrough == --MF.
end() &&
1539 DoTransform =
false;
1544 if (!TII->reverseBranchCondition(NewPriorCond)) {
1546 <<
"To make fallthrough to: " << *PriorTBB <<
"\n");
1549 TII->removeBranch(PrevBB);
1550 TII->insertBranch(PrevBB,
MBB,
nullptr, NewPriorCond, Dl);
1564 if (TII->isUnconditionalTailCall(TailCall)) {
1567 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1569 bool PredAnalyzable =
1570 !TII->analyzeBranch(*Pred, PredTBB, PredFBB, PredCond,
true);
1573 if (PredAnalyzable && !PredCond.
empty() && PredTBB ==
MBB &&
1574 PredTBB != PredFBB) {
1578 if (TII->canMakeTailCallConditional(PredCond, TailCall)) {
1582 TII->replaceBranchWithTailCall(*Pred, PredCond, TailCall);
1592 if (!PredsChanged.
empty()) {
1593 NumTailCalls += PredsChanged.
size();
1594 for (
auto &Pred : PredsChanged)
1602 if (!CurUnAnalyzable) {
1608 if (CurTBB && CurFBB && CurFBB ==
MBB && CurTBB !=
MBB) {
1610 if (!TII->reverseBranchCondition(NewCond)) {
1612 TII->removeBranch(*
MBB);
1613 TII->insertBranch(*
MBB, CurFBB, CurTBB, NewCond, Dl);
1616 goto ReoptimizeBlock;
1622 if (CurTBB && CurCond.
empty() && !CurFBB &&
1629 TII->removeBranch(*
MBB);
1645 if (PredHasNoFallThrough || !PriorUnAnalyzable ||
1650 PriorTBB !=
MBB && PriorFBB !=
MBB) {
1653 "Bad branch analysis");
1656 assert(!PriorFBB &&
"Machine CFG out of date!");
1660 TII->removeBranch(PrevBB);
1661 TII->insertBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, PrevDl);
1666 bool DidChange =
false;
1667 bool HasBranchToSelf =
false;
1673 HasBranchToSelf =
true;
1683 assert((*SI)->isEHPad() &&
"Bad CFG");
1689 MachineBasicBlock *NewCurTBB =
nullptr, *NewCurFBB =
nullptr;
1691 bool NewCurUnAnalyzable = TII->analyzeBranch(
1692 *PMBB, NewCurTBB, NewCurFBB, NewCurCond,
true);
1693 if (!NewCurUnAnalyzable && NewCurTBB && NewCurTBB == NewCurFBB) {
1695 TII->removeBranch(*PMBB);
1697 TII->insertBranch(*PMBB, NewCurTBB,
nullptr, NewCurCond,
1707 MJTI->ReplaceMBBInJumpTables(
MBB, CurTBB);
1711 if (!HasBranchToSelf)
return MadeChange;
1717 TII->insertBranch(*
MBB, CurTBB,
nullptr, CurCond, Dl);
1735 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1738 !TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond,
true) &&
1739 (PredTBB ==
MBB || PredFBB ==
MBB) &&
1740 (!CurFallsThru || !CurTBB || !CurFBB) &&
1755 TII->insertBranch(*
MBB, NextBB,
nullptr, CurCond,
DebugLoc());
1759 goto ReoptimizeBlock;
1764 if (!CurFallsThru) {
1767 if (!CurUnAnalyzable) {
1768 for (MachineBasicBlock *SuccBB : {CurFBB, CurTBB}) {
1777 if (SuccBB !=
MBB && &*SuccPrev !=
MBB &&
1778 !SuccPrev->canFallThrough()) {
1781 goto ReoptimizeBlock;
1807 MachineBasicBlock *PrevTBB =
nullptr, *PrevFBB =
nullptr;
1810 if (FallThrough != MF.
end() && !FallThrough->isEHPad() &&
1811 !FallThrough->isInlineAsmBrIndirectTarget() &&
1812 !TII->analyzeBranch(PrevBB, PrevTBB, PrevFBB, PrevCond,
true) &&
1828bool BranchFolder::HoistCommonCode(MachineFunction &MF) {
1829 bool MadeChange =
false;
1831 MadeChange |= HoistCommonCodeInSuccs(&
MBB);
1841 if (SuccBB != TrueBB)
1846template <
class Container>
1849 if (
Reg.isPhysical()) {
1871 if (!
TII->isUnpredicatedTerminator(*
Loc))
1912 if (!MO.isReg() || MO.isUse())
1933 bool DontMoveAcrossStore =
true;
1934 if (!PI->isSafeToMove(DontMoveAcrossStore) ||
TII->isPredicated(*PI))
1949 if (
Reg.isPhysical()) {
1961bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *
MBB) {
1962 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
1980 SmallSet<Register, 4>
Uses, Defs;
1986 bool HasDups =
false;
1987 SmallSet<Register, 4> ActiveDefsSet, AllDefsSet;
1993 while (TIB != TIE && FIB != FIE) {
1997 if (TIB == TIE || FIB == FIE)
2003 if (TII->isPredicated(*TIB))
2007 if (!TII->isSafeToMove(*TIB,
TBB, MF))
2012 for (MachineOperand &MO : TIB->operands()) {
2014 if (MO.isRegMask()) {
2031 if (Defs.
count(
Reg) && !MO.isDead()) {
2046 }
else if (!ActiveDefsSet.
count(
Reg)) {
2053 if (MO.isKill() &&
Uses.count(
Reg))
2056 MO.setIsKill(
false);
2062 bool DontMoveAcrossStore =
true;
2063 if (!TIB->isSafeToMove(DontMoveAcrossStore))
2067 for (
const MachineOperand &MO : TIB->all_uses()) {
2077 for (MCRegAliasIterator AI(
Reg, TRI,
true); AI.isValid(); ++AI)
2078 ActiveDefsSet.
erase(*AI);
2085 for (
const MachineOperand &MO : TIB->all_defs()) {
2112 MachineInstrBuilder MIRBuilder(*
MBB->
getParent(), Loc);
2114 assert(DI->isDebugInstr() &&
"Expected a debug instruction");
2115 if (DI->isDebugRef()) {
2116 const TargetInstrInfo *TII =
2118 const MCInstrDesc &DBGV = TII->
get(TargetOpcode::DBG_VALUE);
2120 DI->getDebugVariable(), DI->getDebugExpression());
2125 if (DI->isDebugPHI()) {
2126 DI->eraseFromParent();
2130 if (!DI->isDebugLabel())
2131 DI->setDebugValueUndef();
2132 DI->moveBefore(&*Loc);
2144 while (FI != FE && FI->isDebugInstr())
2145 HoistAndKillDbgInstr(FI++);
2148 if (TI->isDebugInstr()) {
2149 HoistAndKillDbgInstr(TI);
2154 assert(FI != FE &&
"Unexpected end of FBB range");
2157 assert(!TI->isPseudoProbe() &&
"Unexpected pseudo probe in range");
2161 "Expected non-debug lockstep");
2166 TI->moveBefore(&*Loc);
2171 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)
Analysis pass which computes a MachineDominatorTree.
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()