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");
86 cl::desc(
"Override common-code hoisting in the BranchFolding pass"));
93 cl::desc(
"Override basic-block reordering in the BranchFolding pass"));
98 cl::desc(
"Max number of predecessors to consider tail merging"),
104 cl::desc(
"Min number of instructions to consider tail merging"),
111 bool EnableCommonHoist;
112 bool EnableBasicBlockReordering;
117 explicit BranchFolderLegacy(
bool EnableCommonHoist =
true,
118 bool EnableBasicBlockReordering =
true)
120 EnableBasicBlockReordering(EnableBasicBlockReordering) {}
124 void getAnalysisUsage(AnalysisUsage &AU)
const override {
125 AU.
addRequired<MachineBlockFrequencyInfoWrapperPass>();
126 AU.
addRequired<MachineBranchProbabilityInfoWrapperPass>();
133 MachineFunctionProperties getRequiredProperties()
const override {
134 return MachineFunctionProperties().setNoPHIs();
140char BranchFolderLegacy::ID = 0;
150 bool EnableTailMerge =
151 !MF.getTarget().requiresStructuredCFG() && this->EnableTailMerge;
155 .getCachedResult<ProfileSummaryAnalysis>(
156 *MF.getFunction().getParent());
159 "ProfileSummaryAnalysis is required for BranchFoldingPass",
false);
163 BranchFolder Folder(EnableTailMerge,
true, MBBFreqInfo, MBPI,
165 Folder.setBasicBlockReordering(
true);
166 if (Folder.OptimizeFunction(MF, MF.getSubtarget().getInstrInfo(),
167 MF.getSubtarget().getRegisterInfo()))
177 TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
182 MBFIWrapper MBBFreqInfo(
183 getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI());
185 EnableTailMerge, EnableCommonHoist, MBBFreqInfo,
186 getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI(),
187 &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI());
188 Folder.setBasicBlockReordering(EnableBasicBlockReordering);
197 : EnableHoistCommonCode(CommonHoist), EnableBasicBlockReordering(
true),
198 MinCommonTailLength(MinTailLength), MBBFreqInfo(FreqInfo), MBPI(ProbInfo),
202 EnableTailMerge = DefaultEnableTailMerge;
205 EnableTailMerge =
true;
208 EnableTailMerge =
false;
214 assert(
MBB->pred_empty() &&
"MBB must be dead!");
219 while (!
MBB->succ_empty())
220 MBB->removeSuccessor(
MBB->succ_end()-1);
223 TriedMerging.erase(
MBB);
227 if (
MI.shouldUpdateAdditionalCallInfo())
234 EHScopeMembership.erase(
MBB);
241 if (!tii)
return false;
243 TriedMerging.clear();
246 AfterBlockPlacement = AfterPlacement;
252 if (MinCommonTailLength == 0) {
255 : TII->getTailMergeSize(MF);
258 UpdateLiveIns = MRI.
tracksLiveness() && TRI->trackLivenessAfterRegAlloc(MF);
260 MRI.invalidateLiveness();
266 EnableHoistCommonCode =
269 EnableBasicBlockReordering =
272 bool MadeChange =
false;
277 bool MadeChangeThisIteration =
true;
278 while (MadeChangeThisIteration) {
279 MadeChangeThisIteration = TailMergeBlocks(MF);
282 if (!AfterBlockPlacement || MadeChangeThisIteration)
283 MadeChangeThisIteration |= OptimizeBranches(MF);
284 if (EnableHoistCommonCode)
285 MadeChangeThisIteration |= HoistCommonCode(MF);
286 MadeChange |= MadeChangeThisIteration;
300 if (!
Op.isJTI())
continue;
303 JTIsLive.
set(
Op.getIndex());
309 for (
unsigned i = 0, e = JTIsLive.
size(); i != e; ++i)
310 if (!JTIsLive.
test(i)) {
324 unsigned Hash =
MI.getOpcode();
325 for (
unsigned i = 0, e =
MI.getNumOperands(); i != e; ++i) {
331 unsigned OperandHash = 0;
332 switch (
Op.getType()) {
334 OperandHash =
Op.getReg().id();
337 OperandHash =
Op.getImm();
340 OperandHash =
Op.getMBB()->getNumber();
345 OperandHash =
Op.getIndex();
351 OperandHash =
Op.getOffset();
357 Hash += ((OperandHash << 3) |
Op.getType()) << (i & 31);
373 return !(
MI.isDebugInstr() ||
MI.isCFIInstruction());
382 while (
I !=
MBB->begin()) {
403 unsigned TailLen = 0;
407 if (MBBI1 == MBB1->
end() || MBBI2 == MBB2->
end())
409 if (!MBBI1->isIdenticalTo(*MBBI2) ||
415 MBBI1->isInlineAsm()) {
433 MachineBasicBlock &OldMBB = *OldInst->getParent();
435 LiveRegs.addLiveOuts(OldMBB);
440 LiveRegs.stepBackward(*
I);
441 }
while (
I != OldInst);
446 for (MachineBasicBlock::RegisterMaskPair
P : NewDest.
liveins()) {
450 "Can only handle full register.");
451 MCRegister
Reg =
P.PhysReg;
452 if (!LiveRegs.available(*MRI,
Reg))
455 BuildMI(OldMBB, OldInst,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
Reg);
459 TII->ReplaceTailWithBranchTo(OldInst, &NewDest);
466 if (!TII->isLegalToSplitMBBAt(CurMBB, BBI1))
483 NewMBB->
splice(NewMBB->
end(), &CurMBB, BBI1, CurMBB.
end());
487 if (MachineLoop *
ML = MLI->getLoopFor(&CurMBB))
488 ML->addBasicBlockToLoop(NewMBB, *MLI);
491 MBBFreqInfo.setBlockFreq(NewMBB, MBBFreqInfo.getBlockFreq(&CurMBB));
497 const auto &EHScopeI = EHScopeMembership.find(&CurMBB);
498 if (EHScopeI != EHScopeMembership.end()) {
499 auto n = EHScopeI->second;
500 EHScopeMembership[NewMBB] = n;
511 for (;
I !=
E; ++
I) {
516 else if (
I->mayLoadOrStore())
537 if (
I != MF->
end() && !
TII->analyzeBranch(*CurMBB,
TBB, FBB,
Cond,
true)) {
539 if (
TBB == NextBB && !
Cond.empty() && !FBB) {
540 if (!
TII->reverseBranchCondition(
Cond)) {
541 TII->removeBranch(*CurMBB);
542 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
Cond, dl);
547 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
552BranchFolder::MergePotentialsElt::operator<(
const MergePotentialsElt &o)
const {
553 if (getHash() <
o.getHash())
555 if (getHash() >
o.getHash())
557 if (getBlock()->getNumber() <
o.getBlock()->getNumber())
559 if (getBlock()->getNumber() >
o.getBlock()->getNumber())
570 unsigned NumTerms = 0;
572 if (
I ==
MBB->begin()) {
577 if (!
I->isTerminator())
break;
587 if (!
MBB->succ_empty())
591 return !(
MBB->back().isReturn() ||
MBB->back().isIndirectBranch());
612 unsigned MinCommonTailLength,
unsigned &CommonTailLen,
621 if (!EHScopeMembership.
empty()) {
622 auto EHScope1 = EHScopeMembership.
find(MBB1);
623 assert(EHScope1 != EHScopeMembership.
end());
624 auto EHScope2 = EHScopeMembership.
find(MBB2);
625 assert(EHScope2 != EHScopeMembership.
end());
626 if (EHScope1->second != EHScope2->second)
631 if (CommonTailLen == 0)
635 << CommonTailLen <<
'\n');
645 bool FullBlockTail1 = I1 == MBB1->
begin();
646 bool FullBlockTail2 = I2 == MBB2->
begin();
653 if ((MBB1 == PredBB || MBB2 == PredBB) &&
654 (!AfterPlacement || MBB1->
succ_size() == 1)) {
657 if (CommonTailLen > NumTerms)
666 if (FullBlockTail1 && FullBlockTail2 &&
683 if (AfterPlacement && FullBlockTail1 && FullBlockTail2) {
685 if (!
MBB->succ_empty() && !
MBB->canFallThrough())
689 return (
MBB != &*MF->
begin()) && std::prev(
I)->canFallThrough();
691 if (!BothFallThrough(MBB1) || !BothFallThrough(MBB2))
700 unsigned EffectiveTailLen = CommonTailLen;
701 if (SuccBB && MBB1 != PredBB && MBB2 != PredBB &&
702 (MBB1->
succ_size() == 1 || !AfterPlacement) &&
708 if (EffectiveTailLen >= MinCommonTailLength)
717 return EffectiveTailLen >= 2 && OptForSize &&
718 (FullBlockTail1 || FullBlockTail2);
721unsigned BranchFolder::ComputeSameTails(
unsigned CurHash,
722 unsigned MinCommonTailLength,
723 MachineBasicBlock *SuccBB,
724 MachineBasicBlock *PredBB) {
725 unsigned maxCommonTailLength = 0
U;
728 MPIterator HighestMPIter = std::prev(MergePotentials.end());
729 for (MPIterator CurMPIter = std::prev(MergePotentials.end()),
730 B = MergePotentials.begin();
731 CurMPIter !=
B && CurMPIter->getHash() == CurHash; --CurMPIter) {
732 for (MPIterator
I = std::prev(CurMPIter);
I->getHash() == CurHash; --
I) {
733 unsigned CommonTailLen;
736 CommonTailLen, TrialBBI1, TrialBBI2,
739 AfterBlockPlacement, MBBFreqInfo, PSI)) {
740 if (CommonTailLen > maxCommonTailLength) {
742 maxCommonTailLength = CommonTailLen;
743 HighestMPIter = CurMPIter;
744 SameTails.push_back(SameTailElt(CurMPIter, TrialBBI1));
746 if (HighestMPIter == CurMPIter &&
747 CommonTailLen == maxCommonTailLength)
748 SameTails.push_back(SameTailElt(
I, TrialBBI2));
754 return maxCommonTailLength;
757void BranchFolder::RemoveBlocksWithHash(
unsigned CurHash,
758 MachineBasicBlock *SuccBB,
759 MachineBasicBlock *PredBB,
761 MPIterator CurMPIter,
B;
762 for (CurMPIter = std::prev(MergePotentials.end()),
763 B = MergePotentials.begin();
764 CurMPIter->getHash() == CurHash; --CurMPIter) {
766 MachineBasicBlock *CurMBB = CurMPIter->getBlock();
767 if (SuccBB && CurMBB != PredBB)
768 FixTail(CurMBB, SuccBB, TII, BranchDL);
772 if (CurMPIter->getHash() != CurHash)
774 MergePotentials.erase(CurMPIter, MergePotentials.end());
777bool BranchFolder::CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
778 MachineBasicBlock *SuccBB,
779 unsigned maxCommonTailLength,
780 unsigned &commonTailIndex) {
782 unsigned TimeEstimate = ~0
U;
783 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
785 if (SameTails[i].getBlock() == PredBB) {
792 SameTails[i].getTailStartPos());
793 if (t <= TimeEstimate) {
800 SameTails[commonTailIndex].getTailStartPos();
801 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
804 << maxCommonTailLength);
811 MachineBasicBlock *newMBB = SplitMBBAt(*
MBB, BBI, BB);
817 SameTails[commonTailIndex].setBlock(newMBB);
818 SameTails[commonTailIndex].setTailStartPos(newMBB->
begin());
843 unsigned CommonTailLen = 0;
844 for (
auto E =
MBB->end(); MBBIStartPos !=
E; ++MBBIStartPos)
852 while (CommonTailLen--) {
853 assert(
MBBI != MBBIE &&
"Reached BB end within common tail length!");
864 assert(MBBICommon != MBBIECommon &&
865 "Reached BB end within common tail length!");
866 assert(MBBICommon->isIdenticalTo(*
MBBI) &&
"Expected matching MIIs!");
869 if (MBBICommon->mayLoadOrStore())
870 MBBICommon->cloneMergedMemRefs(*
MBB->getParent(), {&*MBBICommon, &*MBBI});
880void BranchFolder::mergeCommonTails(
unsigned commonTailIndex) {
881 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
883 std::vector<MachineBasicBlock::iterator> NextCommonInsts(SameTails.size());
884 for (
unsigned int i = 0 ; i != SameTails.size() ; ++i) {
885 if (i != commonTailIndex) {
886 NextCommonInsts[i] = SameTails[i].getTailStartPos();
890 "MBB is not a common tail only block");
894 for (
auto &
MI : *
MBB) {
898 for (
unsigned int i = 0 ; i < NextCommonInsts.size() ; i++) {
899 if (i == commonTailIndex)
902 auto &Pos = NextCommonInsts[i];
903 assert(Pos != SameTails[i].getBlock()->
end() &&
904 "Reached BB end within common tail");
907 assert(Pos != SameTails[i].getBlock()->
end() &&
908 "Reached BB end within common tail");
910 assert(
MI.isIdenticalTo(*Pos) &&
"Expected matching MIIs!");
912 NextCommonInsts[i] = ++Pos;
918 LivePhysRegs NewLiveIns(*TRI);
926 LiveRegs.addLiveOuts(*Pred);
929 if (!LiveRegs.available(*MRI,
Reg))
935 return NewLiveIns.contains(SReg) && !MRI->isReserved(SReg);
940 BuildMI(*Pred, InsertBefore,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
959bool BranchFolder::TryTailMergeBlocks(MachineBasicBlock *SuccBB,
960 MachineBasicBlock *PredBB,
961 unsigned MinCommonTailLength) {
962 bool MadeChange =
false;
965 dbgs() <<
"\nTryTailMergeBlocks: ";
966 for (
unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
968 << (i ==
e - 1 ?
"" :
", ");
976 dbgs() <<
"Looking for common tails of at least " << MinCommonTailLength
977 <<
" instruction" << (MinCommonTailLength == 1 ?
"" :
"s") <<
'\n';
982#if LLVM_ENABLE_DEBUGLOC_TRACKING_ORIGIN
985 std::sort(MergePotentials.begin(), MergePotentials.end());
991 while (MergePotentials.size() > 1) {
992 unsigned CurHash = MergePotentials.back().getHash();
993 const DebugLoc &BranchDL = MergePotentials.back().getBranchDebugLoc();
997 unsigned maxCommonTailLength = ComputeSameTails(CurHash,
1003 if (SameTails.empty()) {
1004 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
1012 MachineBasicBlock *EntryBB =
1013 &MergePotentials.front().getBlock()->getParent()->front();
1014 unsigned commonTailIndex = SameTails.size();
1017 if (SameTails.size() == 2 &&
1018 SameTails[0].getBlock()->isLayoutSuccessor(SameTails[1].getBlock()) &&
1019 SameTails[1].tailIsWholeBlock() && !SameTails[1].getBlock()->isEHPad())
1020 commonTailIndex = 1;
1021 else if (SameTails.size() == 2 &&
1022 SameTails[1].getBlock()->isLayoutSuccessor(
1023 SameTails[0].getBlock()) &&
1024 SameTails[0].tailIsWholeBlock() &&
1025 !SameTails[0].getBlock()->isEHPad())
1026 commonTailIndex = 0;
1030 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
1031 MachineBasicBlock *
MBB = SameTails[i].getBlock();
1033 SameTails[i].tailIsWholeBlock())
1035 if (
MBB == PredBB) {
1036 commonTailIndex = i;
1039 if (SameTails[i].tailIsWholeBlock())
1040 commonTailIndex = i;
1044 if (commonTailIndex == SameTails.size() ||
1045 (SameTails[commonTailIndex].getBlock() == PredBB &&
1046 !SameTails[commonTailIndex].tailIsWholeBlock())) {
1049 if (!CreateCommonTailOnlyBlock(PredBB, SuccBB,
1050 maxCommonTailLength, commonTailIndex)) {
1051 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
1056 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
1059 setCommonTailEdgeWeights(*
MBB);
1063 mergeCommonTails(commonTailIndex);
1069 for (
unsigned int i=0, e = SameTails.size(); i != e; ++i) {
1070 if (commonTailIndex == i)
1073 << (i == e - 1 ?
"" :
", "));
1075 replaceTailWithBranchTo(SameTails[i].getTailStartPos(), *
MBB);
1077 MergePotentials.erase(SameTails[i].getMPIter());
1088 bool MadeChange =
false;
1089 if (!EnableTailMerge)
1094 MergePotentials.clear();
1095 for (MachineBasicBlock &
MBB : MF) {
1106 for (
const MergePotentialsElt &Elt : MergePotentials)
1107 TriedMerging.insert(Elt.getBlock());
1110 if (MergePotentials.size() >= 2)
1111 MadeChange |= TryTailMergeBlocks(
nullptr,
nullptr, MinCommonTailLength);
1134 if (
I->pred_size() < 2)
continue;
1135 SmallPtrSet<MachineBasicBlock *, 8> UniquePreds;
1136 MachineBasicBlock *IBB = &*
I;
1137 MachineBasicBlock *PredBB = &*std::prev(
I);
1138 MergePotentials.clear();
1151 if (AfterBlockPlacement && MLI) {
1152 ML = MLI->getLoopFor(IBB);
1153 if (
ML && IBB ==
ML->getHeader())
1157 for (MachineBasicBlock *PBB :
I->predecessors()) {
1161 if (TriedMerging.count(PBB))
1169 if (!UniquePreds.
insert(PBB).second)
1174 if (PBB->hasEHPadSuccessor() || PBB->mayHaveInlineAsmBr())
1180 if (AfterBlockPlacement && MLI)
1181 if (
ML != MLI->getLoopFor(PBB))
1184 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
1186 if (!TII->analyzeBranch(*PBB,
TBB, FBB,
Cond,
true)) {
1190 if (!
Cond.empty() &&
TBB == IBB) {
1191 if (TII->reverseBranchCondition(NewCond))
1195 auto Next = ++PBB->getIterator();
1196 if (
Next != MF.end())
1202 DebugLoc dl = PBB->findBranchDebugLoc();
1203 if (
TBB && (
Cond.empty() || FBB)) {
1204 TII->removeBranch(*PBB);
1207 TII->insertBranch(*PBB, (
TBB == IBB) ? FBB :
TBB,
nullptr,
1211 MergePotentials.push_back(
1219 for (MergePotentialsElt &Elt : MergePotentials)
1220 TriedMerging.insert(Elt.getBlock());
1222 if (MergePotentials.size() >= 2)
1223 MadeChange |= TryTailMergeBlocks(IBB, PredBB, MinCommonTailLength);
1227 PredBB = &*std::prev(
I);
1228 if (MergePotentials.size() == 1 &&
1229 MergePotentials.begin()->getBlock() != PredBB)
1230 FixTail(MergePotentials.begin()->getBlock(), IBB, TII,
1231 MergePotentials.begin()->getBranchDebugLoc());
1237void BranchFolder::setCommonTailEdgeWeights(MachineBasicBlock &TailMBB) {
1239 BlockFrequency AccumulatedMBBFreq;
1244 for (
const auto &Src : SameTails) {
1245 const MachineBasicBlock *SrcMBB = Src.getBlock();
1246 BlockFrequency BlockFreq = MBBFreqInfo.getBlockFreq(SrcMBB);
1247 AccumulatedMBBFreq += BlockFreq;
1254 auto EdgeFreq = EdgeFreqLs.begin();
1257 SuccI != SuccE; ++SuccI, ++EdgeFreq)
1258 *EdgeFreq += BlockFreq * MBPI.getEdgeProbability(SrcMBB, *SuccI);
1261 MBBFreqInfo.setBlockFreq(&TailMBB, AccumulatedMBBFreq);
1267 std::accumulate(EdgeFreqLs.begin(), EdgeFreqLs.end(), BlockFrequency(0))
1269 auto EdgeFreq = EdgeFreqLs.begin();
1271 if (SumEdgeFreq > 0) {
1273 SuccI != SuccE; ++SuccI, ++EdgeFreq) {
1275 EdgeFreq->getFrequency(), SumEdgeFreq);
1286 bool MadeChange =
false;
1293 for (MachineBasicBlock &
MBB :
1295 MadeChange |= OptimizeBlock(&
MBB);
1300 RemoveDeadBlock(&
MBB);
1312 return MBB->getFirstNonDebugInstr(
true) ==
MBB->end();
1320 return I->isBranch();
1329 assert(MBB1 && MBB2 &&
"Unknown MachineBasicBlock");
1337 if (MBB1I == MBB1->
end() || MBB2I == MBB2->
end())
1345 return MBB2I->isCall() && !MBB1I->isCall();
1353 if (
MI.isDebugInstr()) {
1354 TII->duplicate(PredMBB, InsertBefore,
MI);
1355 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to pred: "
1365 if (
MI.isDebugInstr()) {
1366 TII->duplicate(SuccMBB, InsertBefore,
MI);
1367 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to succ: "
1397 return !CurCond.
empty() &&
1400 return LHS.isIdenticalTo(
RHS);
1404bool BranchFolder::OptimizeBlock(MachineBasicBlock *
MBB) {
1405 bool MadeChange =
false;
1413 bool SameEHScope =
true;
1414 if (!EHScopeMembership.empty() && FallThrough != MF.
end()) {
1415 auto MBBEHScope = EHScopeMembership.find(
MBB);
1416 assert(MBBEHScope != EHScopeMembership.end());
1417 auto FallThroughEHScope = EHScopeMembership.find(&*FallThrough);
1418 assert(FallThroughEHScope != EHScopeMembership.end());
1419 SameEHScope = MBBEHScope->second == FallThroughEHScope->second;
1424 MachineBasicBlock *CurTBB =
nullptr, *CurFBB =
nullptr;
1426 bool CurUnAnalyzable =
1427 TII->analyzeBranch(*
MBB, CurTBB, CurFBB, CurCond,
true);
1439 if (FallThrough == MF.
end()) {
1441 }
else if (FallThrough->isEHPad()) {
1457 if (*SI != &*FallThrough && !FallThrough->isSuccessor(*SI)) {
1458 assert((*SI)->isEHPad() &&
"Bad CFG");
1459 FallThrough->copySuccessor(
MBB, SI);
1464 MJTI->ReplaceMBBInJumpTables(
MBB, &*FallThrough);
1474 MachineBasicBlock *PriorTBB =
nullptr, *PriorFBB =
nullptr;
1476 bool PriorUnAnalyzable =
1477 TII->analyzeBranch(PrevBB, PriorTBB, PriorFBB, PriorCond,
true);
1478 if (!PriorUnAnalyzable) {
1482 if (PriorTBB && PriorTBB == PriorFBB) {
1484 TII->removeBranch(PrevBB);
1486 if (PriorTBB !=
MBB)
1487 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1490 goto ReoptimizeBlock;
1504 <<
"From MBB: " << *
MBB);
1506 if (!PrevBB.
empty()) {
1512 while (PrevBBIter != PrevBB.
begin() && MBBIter !=
MBB->
end()
1513 && PrevBBIter->isDebugInstr() && MBBIter->isDebugInstr()) {
1514 if (!MBBIter->isIdenticalTo(*PrevBBIter))
1516 MachineInstr &DuplicateDbg = *MBBIter;
1517 ++MBBIter; -- PrevBBIter;
1531 if (PriorTBB ==
MBB && !PriorFBB) {
1532 TII->removeBranch(PrevBB);
1535 goto ReoptimizeBlock;
1540 if (PriorFBB ==
MBB) {
1542 TII->removeBranch(PrevBB);
1543 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1546 goto ReoptimizeBlock;
1552 if (PriorTBB ==
MBB) {
1554 if (!TII->reverseBranchCondition(NewPriorCond)) {
1556 TII->removeBranch(PrevBB);
1557 TII->insertBranch(PrevBB, PriorFBB,
nullptr, NewPriorCond, Dl);
1560 goto ReoptimizeBlock;
1572 TII->removeBranch(PrevBB);
1576 goto ReoptimizeBlock;
1590 bool DoTransform =
true;
1597 if (FallThrough == --MF.
end() &&
1599 DoTransform =
false;
1604 if (!TII->reverseBranchCondition(NewPriorCond)) {
1606 <<
"To make fallthrough to: " << *PriorTBB <<
"\n");
1609 TII->removeBranch(PrevBB);
1610 TII->insertBranch(PrevBB,
MBB,
nullptr, NewPriorCond, Dl);
1624 if (TII->isUnconditionalTailCall(TailCall)) {
1627 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1629 bool PredAnalyzable =
1630 !TII->analyzeBranch(*Pred, PredTBB, PredFBB, PredCond,
true);
1633 if (PredAnalyzable && !PredCond.
empty() && PredTBB ==
MBB &&
1634 PredTBB != PredFBB) {
1638 if (TII->canMakeTailCallConditional(PredCond, TailCall)) {
1642 TII->replaceBranchWithTailCall(*Pred, PredCond, TailCall);
1652 if (!PredsChanged.
empty()) {
1653 NumTailCalls += PredsChanged.
size();
1654 for (
auto &Pred : PredsChanged)
1662 if (!CurUnAnalyzable) {
1668 if (CurTBB && CurFBB && CurFBB ==
MBB && CurTBB !=
MBB) {
1670 if (!TII->reverseBranchCondition(NewCond)) {
1672 TII->removeBranch(*
MBB);
1673 TII->insertBranch(*
MBB, CurFBB, CurTBB, NewCond, Dl);
1676 goto ReoptimizeBlock;
1682 if (CurTBB && CurCond.
empty() && !CurFBB &&
1689 TII->removeBranch(*
MBB);
1705 if (PredHasNoFallThrough || !PriorUnAnalyzable ||
1710 PriorTBB !=
MBB && PriorFBB !=
MBB) {
1713 "Bad branch analysis");
1716 assert(!PriorFBB &&
"Machine CFG out of date!");
1720 TII->removeBranch(PrevBB);
1721 TII->insertBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, PrevDl);
1726 bool DidChange =
false;
1727 bool HasBranchToSelf =
false;
1733 HasBranchToSelf =
true;
1743 assert((*SI)->isEHPad() &&
"Bad CFG");
1749 MachineBasicBlock *NewCurTBB =
nullptr, *NewCurFBB =
nullptr;
1751 bool NewCurUnAnalyzable = TII->analyzeBranch(
1752 *PMBB, NewCurTBB, NewCurFBB, NewCurCond,
true);
1753 if (!NewCurUnAnalyzable && NewCurTBB && NewCurTBB == NewCurFBB) {
1755 TII->removeBranch(*PMBB);
1757 TII->insertBranch(*PMBB, NewCurTBB,
nullptr, NewCurCond,
1767 MJTI->ReplaceMBBInJumpTables(
MBB, CurTBB);
1771 if (!HasBranchToSelf)
return MadeChange;
1777 TII->insertBranch(*
MBB, CurTBB,
nullptr, CurCond, Dl);
1795 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1798 !TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond,
true) &&
1799 (PredTBB ==
MBB || PredFBB ==
MBB) &&
1800 (!CurFallsThru || !CurTBB || !CurFBB) &&
1815 TII->insertBranch(*
MBB, NextBB,
nullptr, CurCond,
DebugLoc());
1819 goto ReoptimizeBlock;
1824 if (!CurFallsThru) {
1827 if (!CurUnAnalyzable) {
1828 for (MachineBasicBlock *SuccBB : {CurFBB, CurTBB}) {
1837 if (SuccBB !=
MBB && &*SuccPrev !=
MBB &&
1838 !SuccPrev->canFallThrough()) {
1841 goto ReoptimizeBlock;
1867 MachineBasicBlock *PrevTBB =
nullptr, *PrevFBB =
nullptr;
1870 if (FallThrough != MF.
end() && !FallThrough->isEHPad() &&
1871 !FallThrough->isInlineAsmBrIndirectTarget() &&
1872 !TII->analyzeBranch(PrevBB, PrevTBB, PrevFBB, PrevCond,
true) &&
1889 bool MadeChange =
false;
1891 MadeChange |= HoistCommonCodeInSuccs(&
MBB);
1901 if (SuccBB != TrueBB)
1906template <
class Container>
1909 if (
Reg.isPhysical()) {
1931 if (!
TII->isUnpredicatedTerminator(*
Loc))
1972 if (!MO.isReg() || MO.isUse())
1993 bool DontMoveAcrossStore =
true;
1994 if (!PI->isSafeToMove(DontMoveAcrossStore) ||
TII->isPredicated(*PI))
2009 if (
Reg.isPhysical()) {
2021bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *
MBB) {
2022 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
2040 SmallSet<Register, 4>
Uses, Defs;
2046 bool HasDups =
false;
2047 SmallSet<Register, 4> ActiveDefsSet, AllDefsSet;
2053 while (TIB != TIE && FIB != FIE) {
2057 if (TIB == TIE || FIB == FIE)
2063 if (TII->isPredicated(*TIB))
2067 if (!TII->isSafeToMove(*TIB,
TBB, MF))
2072 for (MachineOperand &MO : TIB->operands()) {
2074 if (MO.isRegMask()) {
2091 if (Defs.
count(
Reg) && !MO.isDead()) {
2106 }
else if (!ActiveDefsSet.
count(
Reg)) {
2113 if (MO.isKill() &&
Uses.count(
Reg))
2116 MO.setIsKill(
false);
2122 bool DontMoveAcrossStore =
true;
2123 if (!TIB->isSafeToMove(DontMoveAcrossStore))
2127 for (
const MachineOperand &MO : TIB->all_uses()) {
2137 for (MCRegAliasIterator AI(
Reg, TRI,
true); AI.isValid(); ++AI)
2138 ActiveDefsSet.
erase(*AI);
2145 for (
const MachineOperand &MO : TIB->all_defs()) {
2172 MachineInstrBuilder MIRBuilder(*
MBB->
getParent(), Loc);
2174 assert(DI->isDebugInstr() &&
"Expected a debug instruction");
2175 if (DI->isDebugRef()) {
2176 const TargetInstrInfo *TII =
2178 const MCInstrDesc &DBGV = TII->
get(TargetOpcode::DBG_VALUE);
2180 DI->getDebugVariable(), DI->getDebugExpression());
2185 if (DI->isDebugPHI()) {
2186 DI->eraseFromParent();
2190 if (!DI->isDebugLabel())
2191 DI->setDebugValueUndef();
2192 DI->moveBefore(&*Loc);
2204 while (FI != FE && FI->isDebugInstr())
2205 HoistAndKillDbgInstr(FI++);
2208 if (TI->isDebugInstr()) {
2209 HoistAndKillDbgInstr(TI);
2214 assert(FI != FE &&
"Unexpected end of FBB range");
2217 assert(!TI->isPseudoProbe() &&
"Unexpected pseudo probe in range");
2221 "Expected non-debug lockstep");
2230 TI->moveBefore(&*Loc);
2235 FBB->
erase(FBB->begin(), FIB);
2245 bool EnableBasicBlockReordering) {
2246 return new BranchFolderLegacy(EnableCommonHoist, EnableBasicBlockReordering);
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 cl::opt< cl::boolOrDefault > FlagEnableHoistCommonCode("branch-folder-hoist-common-code", cl::init(cl::boolOrDefault::BOU_UNSET), cl::Hidden, cl::desc("Override common-code hoisting in the BranchFolding pass"))
static void mergeUndefFlag(MachineInstr &Merged, const MachineInstr &Other)
Ensure undef flag is preserved only when it is present in both instructions.
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 cl::opt< cl::boolOrDefault > FlagEnableTailMerge("enable-tail-merge", cl::init(cl::boolOrDefault::BOU_UNSET), cl::Hidden)
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< unsigned > TailMergeSize("tail-merge-size", cl::desc("Min number of instructions to consider tail merging"), cl::init(3), cl::Hidden)
static bool areConditionalsEqual(ArrayRef< MachineOperand > CurCond, ArrayRef< MachineOperand > PriorCond)
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 cl::opt< cl::boolOrDefault > FlagEnableBlockReordering("branch-folder-reorder-blocks", cl::init(cl::boolOrDefault::BOU_UNSET), cl::Hidden, cl::desc("Override basic-block reordering in the BranchFolding pass"))
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()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
Check if the array is empty.
LLVM Basic Block Representation.
bool test(unsigned Idx) const
Returns true if bit Idx is set.
BitVector & set()
Set all bits in the bitvector.
size_type size() const
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)
FunctionPass class - This class is used to implement most global optimizations.
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...
unsigned getNumOperands() const
Retuns the total number of operands.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI MachineInstrBundleIterator< MachineInstr > 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()
@ 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.
LLVM_ABI FunctionPass * createBranchFolder(bool EnableCommonHoist=true, bool EnableBasicBlockReordering=true)
createBranchFolder - Create the BranchFolder pass, optionally disabling the common-code hoisting and/...
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...
DWARFExpression::Operation Op
LLVM_ABI void computeAndAddLiveIns(LivePhysRegs &LiveRegs, MachineBasicBlock &MBB)
Convenience function combining computeLiveIns() and addLiveIns().
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
LLVM_ABI 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.
bool equal(L &&LRange, R &&RRange)
Wrapper function around std::equal to detect if pair-wise elements between two ranges are the same.
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.
LLVM_ABI void addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs)
Adds registers contained in LiveRegs to the block live-in list of MBB.
LLVM_ABI DenseMap< const MachineBasicBlock *, int > getEHScopeMembership(const MachineFunction &MF)
static constexpr LaneBitmask getAll()