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) {}
122 bool runOnMachineFunction(MachineFunction &MF)
override;
124 void getAnalysisUsage(AnalysisUsage &AU)
const override {
125 AU.
addRequired<MachineBlockFrequencyInfoWrapperPass>();
126 AU.
addRequired<MachineBranchProbabilityInfoWrapperPass>();
132 MachineFunctionProperties getRequiredProperties()
const override {
133 return MachineFunctionProperties().setNoPHIs();
139char BranchFolderLegacy::ID = 0;
149 bool EnableTailMerge =
150 !MF.getTarget().requiresStructuredCFG() && this->EnableTailMerge;
154 .getCachedResult<ProfileSummaryAnalysis>(
155 *MF.getFunction().getParent());
158 "ProfileSummaryAnalysis is required for BranchFoldingPass",
false);
162 BranchFolder Folder(EnableTailMerge,
true, MBBFreqInfo, MBPI,
164 Folder.setBasicBlockReordering(
true);
165 if (Folder.OptimizeFunction(MF, MF.getSubtarget().getInstrInfo(),
166 MF.getSubtarget().getRegisterInfo()))
176 TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
181 MBFIWrapper MBBFreqInfo(
182 getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI());
184 EnableTailMerge, EnableCommonHoist, MBBFreqInfo,
185 getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI(),
186 &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI());
187 Folder.setBasicBlockReordering(EnableBasicBlockReordering);
196 : EnableHoistCommonCode(CommonHoist), EnableBasicBlockReordering(
true),
197 MinCommonTailLength(MinTailLength), MBBFreqInfo(FreqInfo), MBPI(ProbInfo),
201 EnableTailMerge = DefaultEnableTailMerge;
204 EnableTailMerge =
true;
207 EnableTailMerge =
false;
213 assert(
MBB->pred_empty() &&
"MBB must be dead!");
218 while (!
MBB->succ_empty())
219 MBB->removeSuccessor(
MBB->succ_end()-1);
222 TriedMerging.erase(
MBB);
226 if (
MI.shouldUpdateAdditionalCallInfo())
233 EHScopeMembership.erase(
MBB);
240 if (!tii)
return false;
242 TriedMerging.clear();
245 AfterBlockPlacement = AfterPlacement;
251 if (MinCommonTailLength == 0) {
254 : TII->getTailMergeSize(MF);
257 UpdateLiveIns = MRI.
tracksLiveness() && TRI->trackLivenessAfterRegAlloc(MF);
259 MRI.invalidateLiveness();
265 EnableHoistCommonCode =
268 EnableBasicBlockReordering =
271 bool MadeChange =
false;
276 bool MadeChangeThisIteration =
true;
277 while (MadeChangeThisIteration) {
278 MadeChangeThisIteration = TailMergeBlocks(MF);
281 if (!AfterBlockPlacement || MadeChangeThisIteration)
282 MadeChangeThisIteration |= OptimizeBranches(MF);
283 if (EnableHoistCommonCode)
284 MadeChangeThisIteration |= HoistCommonCode(MF);
285 MadeChange |= MadeChangeThisIteration;
299 if (!
Op.isJTI())
continue;
302 JTIsLive.
set(
Op.getIndex());
308 for (
unsigned i = 0, e = JTIsLive.
size(); i != e; ++i)
309 if (!JTIsLive.
test(i)) {
323 unsigned Hash =
MI.getOpcode();
324 for (
unsigned i = 0, e =
MI.getNumOperands(); i != e; ++i) {
330 unsigned OperandHash = 0;
331 switch (
Op.getType()) {
333 OperandHash =
Op.getReg().id();
336 OperandHash =
Op.getImm();
339 OperandHash =
Op.getMBB()->getNumber();
344 OperandHash =
Op.getIndex();
350 OperandHash =
Op.getOffset();
356 Hash += ((OperandHash << 3) |
Op.getType()) << (i & 31);
372 return !(
MI.isDebugInstr() ||
MI.isCFIInstruction());
381 while (
I !=
MBB->begin()) {
402 unsigned TailLen = 0;
406 if (MBBI1 == MBB1->
end() || MBBI2 == MBB2->
end())
408 if (!MBBI1->isIdenticalTo(*MBBI2) ||
414 MBBI1->isInlineAsm()) {
432 MachineBasicBlock &OldMBB = *OldInst->getParent();
434 LiveRegs.addLiveOuts(OldMBB);
439 LiveRegs.stepBackward(*
I);
440 }
while (
I != OldInst);
445 for (MachineBasicBlock::RegisterMaskPair
P : NewDest.
liveins()) {
449 "Can only handle full register.");
450 MCRegister
Reg =
P.PhysReg;
451 if (!LiveRegs.available(*MRI,
Reg))
454 BuildMI(OldMBB, OldInst,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
Reg);
458 TII->ReplaceTailWithBranchTo(OldInst, &NewDest);
465 if (!TII->isLegalToSplitMBBAt(CurMBB, BBI1))
468 MachineFunction &MF = *CurMBB.
getParent();
482 NewMBB->
splice(NewMBB->
end(), &CurMBB, BBI1, CurMBB.
end());
486 if (MachineLoop *
ML = MLI->getLoopFor(&CurMBB))
487 ML->addBasicBlockToLoop(NewMBB, *MLI);
490 MBBFreqInfo.setBlockFreq(NewMBB, MBBFreqInfo.getBlockFreq(&CurMBB));
496 const auto &EHScopeI = EHScopeMembership.find(&CurMBB);
497 if (EHScopeI != EHScopeMembership.end()) {
498 auto n = EHScopeI->second;
499 EHScopeMembership[NewMBB] = n;
510 for (;
I !=
E; ++
I) {
515 else if (
I->mayLoadOrStore())
536 if (
I != MF->
end() && !
TII->analyzeBranch(*CurMBB,
TBB, FBB,
Cond,
true)) {
538 if (
TBB == NextBB && !
Cond.empty() && !FBB) {
539 if (!
TII->reverseBranchCondition(
Cond)) {
540 TII->removeBranch(*CurMBB);
541 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
Cond, dl);
546 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
551BranchFolder::MergePotentialsElt::operator<(
const MergePotentialsElt &o)
const {
552 if (getHash() <
o.getHash())
554 if (getHash() >
o.getHash())
556 if (getBlock()->getNumber() <
o.getBlock()->getNumber())
558 if (getBlock()->getNumber() >
o.getBlock()->getNumber())
569 unsigned NumTerms = 0;
571 if (
I ==
MBB->begin()) {
576 if (!
I->isTerminator())
break;
586 if (!
MBB->succ_empty())
590 return !(
MBB->back().isReturn() ||
MBB->back().isIndirectBranch());
611 unsigned MinCommonTailLength,
unsigned &CommonTailLen,
620 if (!EHScopeMembership.
empty()) {
621 auto EHScope1 = EHScopeMembership.
find(MBB1);
622 assert(EHScope1 != EHScopeMembership.
end());
623 auto EHScope2 = EHScopeMembership.
find(MBB2);
624 assert(EHScope2 != EHScopeMembership.
end());
625 if (EHScope1->second != EHScope2->second)
630 if (CommonTailLen == 0)
634 << CommonTailLen <<
'\n');
644 bool FullBlockTail1 = I1 == MBB1->
begin();
645 bool FullBlockTail2 = I2 == MBB2->
begin();
652 if ((MBB1 == PredBB || MBB2 == PredBB) &&
653 (!AfterPlacement || MBB1->
succ_size() == 1)) {
656 if (CommonTailLen > NumTerms)
665 if (FullBlockTail1 && FullBlockTail2 &&
682 if (AfterPlacement && FullBlockTail1 && FullBlockTail2) {
684 if (!
MBB->succ_empty() && !
MBB->canFallThrough())
688 return (
MBB != &*MF->
begin()) && std::prev(
I)->canFallThrough();
690 if (!BothFallThrough(MBB1) || !BothFallThrough(MBB2))
699 unsigned EffectiveTailLen = CommonTailLen;
700 if (SuccBB && MBB1 != PredBB && MBB2 != PredBB &&
701 (MBB1->
succ_size() == 1 || !AfterPlacement) &&
707 if (EffectiveTailLen >= MinCommonTailLength)
716 return EffectiveTailLen >= 2 && OptForSize &&
717 (FullBlockTail1 || FullBlockTail2);
720unsigned BranchFolder::ComputeSameTails(
unsigned CurHash,
721 unsigned MinCommonTailLength,
722 MachineBasicBlock *SuccBB,
723 MachineBasicBlock *PredBB) {
724 unsigned maxCommonTailLength = 0
U;
727 MPIterator HighestMPIter = std::prev(MergePotentials.end());
728 for (MPIterator CurMPIter = std::prev(MergePotentials.end()),
729 B = MergePotentials.begin();
730 CurMPIter !=
B && CurMPIter->getHash() == CurHash; --CurMPIter) {
731 for (MPIterator
I = std::prev(CurMPIter);
I->getHash() == CurHash; --
I) {
732 unsigned CommonTailLen;
735 CommonTailLen, TrialBBI1, TrialBBI2,
738 AfterBlockPlacement, MBBFreqInfo, PSI)) {
739 if (CommonTailLen > maxCommonTailLength) {
741 maxCommonTailLength = CommonTailLen;
742 HighestMPIter = CurMPIter;
743 SameTails.push_back(SameTailElt(CurMPIter, TrialBBI1));
745 if (HighestMPIter == CurMPIter &&
746 CommonTailLen == maxCommonTailLength)
747 SameTails.push_back(SameTailElt(
I, TrialBBI2));
753 return maxCommonTailLength;
756void BranchFolder::RemoveBlocksWithHash(
unsigned CurHash,
757 MachineBasicBlock *SuccBB,
758 MachineBasicBlock *PredBB,
760 MPIterator CurMPIter,
B;
761 for (CurMPIter = std::prev(MergePotentials.end()),
762 B = MergePotentials.begin();
763 CurMPIter->getHash() == CurHash; --CurMPIter) {
765 MachineBasicBlock *CurMBB = CurMPIter->getBlock();
766 if (SuccBB && CurMBB != PredBB)
767 FixTail(CurMBB, SuccBB, TII, BranchDL);
771 if (CurMPIter->getHash() != CurHash)
773 MergePotentials.erase(CurMPIter, MergePotentials.end());
776bool BranchFolder::CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
777 MachineBasicBlock *SuccBB,
778 unsigned maxCommonTailLength,
779 unsigned &commonTailIndex) {
781 unsigned TimeEstimate = ~0
U;
782 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
784 if (SameTails[i].getBlock() == PredBB) {
791 SameTails[i].getTailStartPos());
792 if (t <= TimeEstimate) {
799 SameTails[commonTailIndex].getTailStartPos();
800 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
803 << maxCommonTailLength);
810 MachineBasicBlock *newMBB = SplitMBBAt(*
MBB, BBI, BB);
816 SameTails[commonTailIndex].setBlock(newMBB);
817 SameTails[commonTailIndex].setTailStartPos(newMBB->
begin());
842 unsigned CommonTailLen = 0;
843 for (
auto E =
MBB->end(); MBBIStartPos !=
E; ++MBBIStartPos)
851 while (CommonTailLen--) {
852 assert(
MBBI != MBBIE &&
"Reached BB end within common tail length!");
863 assert(MBBICommon != MBBIECommon &&
864 "Reached BB end within common tail length!");
865 assert(MBBICommon->isIdenticalTo(*
MBBI) &&
"Expected matching MIIs!");
868 if (MBBICommon->mayLoadOrStore())
869 MBBICommon->cloneMergedMemRefs(*
MBB->getParent(), {&*MBBICommon, &*MBBI});
879void BranchFolder::mergeCommonTails(
unsigned commonTailIndex) {
880 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
882 std::vector<MachineBasicBlock::iterator> NextCommonInsts(SameTails.size());
883 for (
unsigned int i = 0 ; i != SameTails.size() ; ++i) {
884 if (i != commonTailIndex) {
885 NextCommonInsts[i] = SameTails[i].getTailStartPos();
889 "MBB is not a common tail only block");
893 for (
auto &
MI : *
MBB) {
897 for (
unsigned int i = 0 ; i < NextCommonInsts.size() ; i++) {
898 if (i == commonTailIndex)
901 auto &Pos = NextCommonInsts[i];
902 assert(Pos != SameTails[i].getBlock()->
end() &&
903 "Reached BB end within common tail");
906 assert(Pos != SameTails[i].getBlock()->
end() &&
907 "Reached BB end within common tail");
909 assert(
MI.isIdenticalTo(*Pos) &&
"Expected matching MIIs!");
911 NextCommonInsts[i] = ++Pos;
917 LivePhysRegs NewLiveIns(*TRI);
925 LiveRegs.addLiveOuts(*Pred);
928 if (!LiveRegs.available(*MRI,
Reg))
934 return NewLiveIns.contains(SReg) && !MRI->isReserved(SReg);
939 BuildMI(*Pred, InsertBefore,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
958bool BranchFolder::TryTailMergeBlocks(MachineBasicBlock *SuccBB,
959 MachineBasicBlock *PredBB,
960 unsigned MinCommonTailLength) {
961 bool MadeChange =
false;
964 dbgs() <<
"\nTryTailMergeBlocks: ";
965 for (
unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
967 << (i ==
e - 1 ?
"" :
", ");
975 dbgs() <<
"Looking for common tails of at least " << MinCommonTailLength
976 <<
" instruction" << (MinCommonTailLength == 1 ?
"" :
"s") <<
'\n';
981#if LLVM_ENABLE_DEBUGLOC_TRACKING_ORIGIN
984 std::sort(MergePotentials.begin(), MergePotentials.end());
990 while (MergePotentials.size() > 1) {
991 unsigned CurHash = MergePotentials.back().getHash();
992 const DebugLoc &BranchDL = MergePotentials.back().getBranchDebugLoc();
996 unsigned maxCommonTailLength = ComputeSameTails(CurHash,
1002 if (SameTails.empty()) {
1003 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
1011 MachineBasicBlock *EntryBB =
1012 &MergePotentials.front().getBlock()->getParent()->front();
1013 unsigned commonTailIndex = SameTails.size();
1016 if (SameTails.size() == 2 &&
1017 SameTails[0].getBlock()->isLayoutSuccessor(SameTails[1].getBlock()) &&
1018 SameTails[1].tailIsWholeBlock() && !SameTails[1].getBlock()->isEHPad())
1019 commonTailIndex = 1;
1020 else if (SameTails.size() == 2 &&
1021 SameTails[1].getBlock()->isLayoutSuccessor(
1022 SameTails[0].getBlock()) &&
1023 SameTails[0].tailIsWholeBlock() &&
1024 !SameTails[0].getBlock()->isEHPad())
1025 commonTailIndex = 0;
1029 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
1030 MachineBasicBlock *
MBB = SameTails[i].getBlock();
1032 SameTails[i].tailIsWholeBlock())
1034 if (
MBB == PredBB) {
1035 commonTailIndex = i;
1038 if (SameTails[i].tailIsWholeBlock())
1039 commonTailIndex = i;
1043 if (commonTailIndex == SameTails.size() ||
1044 (SameTails[commonTailIndex].getBlock() == PredBB &&
1045 !SameTails[commonTailIndex].tailIsWholeBlock())) {
1048 if (!CreateCommonTailOnlyBlock(PredBB, SuccBB,
1049 maxCommonTailLength, commonTailIndex)) {
1050 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
1055 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
1058 setCommonTailEdgeWeights(*
MBB);
1062 mergeCommonTails(commonTailIndex);
1068 for (
unsigned int i=0, e = SameTails.size(); i != e; ++i) {
1069 if (commonTailIndex == i)
1072 << (i == e - 1 ?
"" :
", "));
1074 replaceTailWithBranchTo(SameTails[i].getTailStartPos(), *
MBB);
1076 MergePotentials.erase(SameTails[i].getMPIter());
1086bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
1087 bool MadeChange =
false;
1088 if (!EnableTailMerge)
1093 MergePotentials.clear();
1094 for (MachineBasicBlock &
MBB : MF) {
1105 for (
const MergePotentialsElt &Elt : MergePotentials)
1106 TriedMerging.insert(Elt.getBlock());
1109 if (MergePotentials.size() >= 2)
1110 MadeChange |= TryTailMergeBlocks(
nullptr,
nullptr, MinCommonTailLength);
1133 if (
I->pred_size() < 2)
continue;
1134 SmallPtrSet<MachineBasicBlock *, 8> UniquePreds;
1135 MachineBasicBlock *IBB = &*
I;
1136 MachineBasicBlock *PredBB = &*std::prev(
I);
1137 MergePotentials.clear();
1150 if (AfterBlockPlacement && MLI) {
1151 ML = MLI->getLoopFor(IBB);
1152 if (
ML && IBB ==
ML->getHeader())
1156 for (MachineBasicBlock *PBB :
I->predecessors()) {
1160 if (TriedMerging.count(PBB))
1168 if (!UniquePreds.
insert(PBB).second)
1173 if (PBB->hasEHPadSuccessor() || PBB->mayHaveInlineAsmBr())
1179 if (AfterBlockPlacement && MLI)
1180 if (
ML != MLI->getLoopFor(PBB))
1183 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
1185 if (!TII->analyzeBranch(*PBB,
TBB, FBB,
Cond,
true)) {
1189 if (!
Cond.empty() &&
TBB == IBB) {
1190 if (TII->reverseBranchCondition(NewCond))
1194 auto Next = ++PBB->getIterator();
1195 if (
Next != MF.end())
1201 DebugLoc dl = PBB->findBranchDebugLoc();
1202 if (
TBB && (
Cond.empty() || FBB)) {
1203 TII->removeBranch(*PBB);
1206 TII->insertBranch(*PBB, (
TBB == IBB) ? FBB :
TBB,
nullptr,
1210 MergePotentials.push_back(
1218 for (MergePotentialsElt &Elt : MergePotentials)
1219 TriedMerging.insert(Elt.getBlock());
1221 if (MergePotentials.size() >= 2)
1222 MadeChange |= TryTailMergeBlocks(IBB, PredBB, MinCommonTailLength);
1226 PredBB = &*std::prev(
I);
1227 if (MergePotentials.size() == 1 &&
1228 MergePotentials.begin()->getBlock() != PredBB)
1229 FixTail(MergePotentials.begin()->getBlock(), IBB, TII,
1230 MergePotentials.begin()->getBranchDebugLoc());
1236void BranchFolder::setCommonTailEdgeWeights(MachineBasicBlock &TailMBB) {
1238 BlockFrequency AccumulatedMBBFreq;
1243 for (
const auto &Src : SameTails) {
1244 const MachineBasicBlock *SrcMBB = Src.getBlock();
1245 BlockFrequency BlockFreq = MBBFreqInfo.getBlockFreq(SrcMBB);
1246 AccumulatedMBBFreq += BlockFreq;
1253 auto EdgeFreq = EdgeFreqLs.begin();
1256 SuccI != SuccE; ++SuccI, ++EdgeFreq)
1257 *EdgeFreq += BlockFreq * MBPI.getEdgeProbability(SrcMBB, *SuccI);
1260 MBBFreqInfo.setBlockFreq(&TailMBB, AccumulatedMBBFreq);
1266 std::accumulate(EdgeFreqLs.begin(), EdgeFreqLs.end(), BlockFrequency(0))
1268 auto EdgeFreq = EdgeFreqLs.begin();
1270 if (SumEdgeFreq > 0) {
1272 SuccI != SuccE; ++SuccI, ++EdgeFreq) {
1274 EdgeFreq->getFrequency(), SumEdgeFreq);
1284bool BranchFolder::OptimizeBranches(MachineFunction &MF) {
1285 bool MadeChange =
false;
1292 for (MachineBasicBlock &
MBB :
1294 MadeChange |= OptimizeBlock(&
MBB);
1299 RemoveDeadBlock(&
MBB);
1311 return MBB->getFirstNonDebugInstr(
true) ==
MBB->end();
1319 return I->isBranch();
1328 assert(MBB1 && MBB2 &&
"Unknown MachineBasicBlock");
1336 if (MBB1I == MBB1->
end() || MBB2I == MBB2->
end())
1344 return MBB2I->isCall() && !MBB1I->isCall();
1352 if (
MI.isDebugInstr()) {
1353 TII->duplicate(PredMBB, InsertBefore,
MI);
1354 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to pred: "
1364 if (
MI.isDebugInstr()) {
1365 TII->duplicate(SuccMBB, InsertBefore,
MI);
1366 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to succ: "
1394bool BranchFolder::OptimizeBlock(MachineBasicBlock *
MBB) {
1395 bool MadeChange =
false;
1403 bool SameEHScope =
true;
1404 if (!EHScopeMembership.empty() && FallThrough != MF.
end()) {
1405 auto MBBEHScope = EHScopeMembership.find(
MBB);
1406 assert(MBBEHScope != EHScopeMembership.end());
1407 auto FallThroughEHScope = EHScopeMembership.find(&*FallThrough);
1408 assert(FallThroughEHScope != EHScopeMembership.end());
1409 SameEHScope = MBBEHScope->second == FallThroughEHScope->second;
1414 MachineBasicBlock *CurTBB =
nullptr, *CurFBB =
nullptr;
1416 bool CurUnAnalyzable =
1417 TII->analyzeBranch(*
MBB, CurTBB, CurFBB, CurCond,
true);
1429 if (FallThrough == MF.
end()) {
1431 }
else if (FallThrough->isEHPad()) {
1447 if (*SI != &*FallThrough && !FallThrough->isSuccessor(*SI)) {
1448 assert((*SI)->isEHPad() &&
"Bad CFG");
1449 FallThrough->copySuccessor(
MBB, SI);
1454 MJTI->ReplaceMBBInJumpTables(
MBB, &*FallThrough);
1464 MachineBasicBlock *PriorTBB =
nullptr, *PriorFBB =
nullptr;
1466 bool PriorUnAnalyzable =
1467 TII->analyzeBranch(PrevBB, PriorTBB, PriorFBB, PriorCond,
true);
1468 if (!PriorUnAnalyzable) {
1472 if (PriorTBB && PriorTBB == PriorFBB) {
1474 TII->removeBranch(PrevBB);
1476 if (PriorTBB !=
MBB)
1477 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1480 goto ReoptimizeBlock;
1494 <<
"From MBB: " << *
MBB);
1496 if (!PrevBB.
empty()) {
1502 while (PrevBBIter != PrevBB.
begin() && MBBIter !=
MBB->
end()
1503 && PrevBBIter->isDebugInstr() && MBBIter->isDebugInstr()) {
1504 if (!MBBIter->isIdenticalTo(*PrevBBIter))
1506 MachineInstr &DuplicateDbg = *MBBIter;
1507 ++MBBIter; -- PrevBBIter;
1521 if (PriorTBB ==
MBB && !PriorFBB) {
1522 TII->removeBranch(PrevBB);
1525 goto ReoptimizeBlock;
1530 if (PriorFBB ==
MBB) {
1532 TII->removeBranch(PrevBB);
1533 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1536 goto ReoptimizeBlock;
1542 if (PriorTBB ==
MBB) {
1544 if (!TII->reverseBranchCondition(NewPriorCond)) {
1546 TII->removeBranch(PrevBB);
1547 TII->insertBranch(PrevBB, PriorFBB,
nullptr, NewPriorCond, Dl);
1550 goto ReoptimizeBlock;
1565 bool DoTransform =
true;
1572 if (FallThrough == --MF.
end() &&
1574 DoTransform =
false;
1579 if (!TII->reverseBranchCondition(NewPriorCond)) {
1581 <<
"To make fallthrough to: " << *PriorTBB <<
"\n");
1584 TII->removeBranch(PrevBB);
1585 TII->insertBranch(PrevBB,
MBB,
nullptr, NewPriorCond, Dl);
1599 if (TII->isUnconditionalTailCall(TailCall)) {
1602 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1604 bool PredAnalyzable =
1605 !TII->analyzeBranch(*Pred, PredTBB, PredFBB, PredCond,
true);
1608 if (PredAnalyzable && !PredCond.
empty() && PredTBB ==
MBB &&
1609 PredTBB != PredFBB) {
1613 if (TII->canMakeTailCallConditional(PredCond, TailCall)) {
1617 TII->replaceBranchWithTailCall(*Pred, PredCond, TailCall);
1627 if (!PredsChanged.
empty()) {
1628 NumTailCalls += PredsChanged.
size();
1629 for (
auto &Pred : PredsChanged)
1637 if (!CurUnAnalyzable) {
1643 if (CurTBB && CurFBB && CurFBB ==
MBB && CurTBB !=
MBB) {
1645 if (!TII->reverseBranchCondition(NewCond)) {
1647 TII->removeBranch(*
MBB);
1648 TII->insertBranch(*
MBB, CurFBB, CurTBB, NewCond, Dl);
1651 goto ReoptimizeBlock;
1657 if (CurTBB && CurCond.
empty() && !CurFBB &&
1664 TII->removeBranch(*
MBB);
1680 if (PredHasNoFallThrough || !PriorUnAnalyzable ||
1685 PriorTBB !=
MBB && PriorFBB !=
MBB) {
1688 "Bad branch analysis");
1691 assert(!PriorFBB &&
"Machine CFG out of date!");
1695 TII->removeBranch(PrevBB);
1696 TII->insertBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, PrevDl);
1701 bool DidChange =
false;
1702 bool HasBranchToSelf =
false;
1708 HasBranchToSelf =
true;
1718 assert((*SI)->isEHPad() &&
"Bad CFG");
1724 MachineBasicBlock *NewCurTBB =
nullptr, *NewCurFBB =
nullptr;
1726 bool NewCurUnAnalyzable = TII->analyzeBranch(
1727 *PMBB, NewCurTBB, NewCurFBB, NewCurCond,
true);
1728 if (!NewCurUnAnalyzable && NewCurTBB && NewCurTBB == NewCurFBB) {
1730 TII->removeBranch(*PMBB);
1732 TII->insertBranch(*PMBB, NewCurTBB,
nullptr, NewCurCond,
1742 MJTI->ReplaceMBBInJumpTables(
MBB, CurTBB);
1746 if (!HasBranchToSelf)
return MadeChange;
1752 TII->insertBranch(*
MBB, CurTBB,
nullptr, CurCond, Dl);
1770 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1773 !TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond,
true) &&
1774 (PredTBB ==
MBB || PredFBB ==
MBB) &&
1775 (!CurFallsThru || !CurTBB || !CurFBB) &&
1790 TII->insertBranch(*
MBB, NextBB,
nullptr, CurCond,
DebugLoc());
1794 goto ReoptimizeBlock;
1799 if (!CurFallsThru) {
1802 if (!CurUnAnalyzable) {
1803 for (MachineBasicBlock *SuccBB : {CurFBB, CurTBB}) {
1812 if (SuccBB !=
MBB && &*SuccPrev !=
MBB &&
1813 !SuccPrev->canFallThrough()) {
1816 goto ReoptimizeBlock;
1842 MachineBasicBlock *PrevTBB =
nullptr, *PrevFBB =
nullptr;
1845 if (FallThrough != MF.
end() && !FallThrough->isEHPad() &&
1846 !FallThrough->isInlineAsmBrIndirectTarget() &&
1847 !TII->analyzeBranch(PrevBB, PrevTBB, PrevFBB, PrevCond,
true) &&
1863bool BranchFolder::HoistCommonCode(MachineFunction &MF) {
1864 bool MadeChange =
false;
1866 MadeChange |= HoistCommonCodeInSuccs(&
MBB);
1876 if (SuccBB != TrueBB)
1881template <
class Container>
1884 if (
Reg.isPhysical()) {
1906 if (!
TII->isUnpredicatedTerminator(*
Loc))
1947 if (!MO.isReg() || MO.isUse())
1968 bool DontMoveAcrossStore =
true;
1969 if (!PI->isSafeToMove(DontMoveAcrossStore) ||
TII->isPredicated(*PI))
1984 if (
Reg.isPhysical()) {
1996bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *
MBB) {
1997 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
2015 SmallSet<Register, 4>
Uses, Defs;
2021 bool HasDups =
false;
2022 SmallSet<Register, 4> ActiveDefsSet, AllDefsSet;
2028 while (TIB != TIE && FIB != FIE) {
2032 if (TIB == TIE || FIB == FIE)
2038 if (TII->isPredicated(*TIB))
2042 if (!TII->isSafeToMove(*TIB,
TBB, MF))
2047 for (MachineOperand &MO : TIB->operands()) {
2049 if (MO.isRegMask()) {
2066 if (Defs.
count(
Reg) && !MO.isDead()) {
2081 }
else if (!ActiveDefsSet.
count(
Reg)) {
2088 if (MO.isKill() &&
Uses.count(
Reg))
2091 MO.setIsKill(
false);
2097 bool DontMoveAcrossStore =
true;
2098 if (!TIB->isSafeToMove(DontMoveAcrossStore))
2102 for (
const MachineOperand &MO : TIB->all_uses()) {
2112 for (MCRegAliasIterator AI(
Reg, TRI,
true); AI.isValid(); ++AI)
2113 ActiveDefsSet.
erase(*AI);
2120 for (
const MachineOperand &MO : TIB->all_defs()) {
2147 MachineInstrBuilder MIRBuilder(*
MBB->
getParent(), Loc);
2149 assert(DI->isDebugInstr() &&
"Expected a debug instruction");
2150 if (DI->isDebugRef()) {
2151 const TargetInstrInfo *TII =
2153 const MCInstrDesc &DBGV = TII->
get(TargetOpcode::DBG_VALUE);
2155 DI->getDebugVariable(), DI->getDebugExpression());
2160 if (DI->isDebugPHI()) {
2161 DI->eraseFromParent();
2165 if (!DI->isDebugLabel())
2166 DI->setDebugValueUndef();
2167 DI->moveBefore(&*Loc);
2179 while (FI != FE && FI->isDebugInstr())
2180 HoistAndKillDbgInstr(FI++);
2183 if (TI->isDebugInstr()) {
2184 HoistAndKillDbgInstr(TI);
2189 assert(FI != FE &&
"Unexpected end of FBB range");
2192 assert(!TI->isPseudoProbe() &&
"Unexpected pseudo probe in range");
2196 "Expected non-debug lockstep");
2205 TI->moveBefore(&*Loc);
2210 FBB->
erase(FBB->begin(), FIB);
2220 bool EnableBasicBlockReordering) {
2221 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 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()
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()
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.
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.
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()