48#include "llvm/Config/llvm-config.h"
70#define DEBUG_TYPE "branch-folder"
72STATISTIC(NumDeadBlocks,
"Number of dead blocks removed");
73STATISTIC(NumBranchOpts,
"Number of branches optimized");
74STATISTIC(NumTailMerge ,
"Number of block tails merged");
75STATISTIC(NumHoist ,
"Number of times common instructions are hoisted");
76STATISTIC(NumTailCalls,
"Number of tail calls optimized");
87 cl::desc(
"Override common-code hoisting in the BranchFolding pass"));
94 cl::desc(
"Override basic-block reordering in the BranchFolding pass"));
99 cl::desc(
"Max number of predecessors to consider tail merging"),
105 cl::desc(
"Min number of instructions to consider tail merging"),
112 bool EnableCommonHoist;
113 bool EnableBasicBlockReordering;
118 explicit BranchFolderLegacy(
bool EnableCommonHoist =
true,
119 bool EnableBasicBlockReordering =
true)
121 EnableBasicBlockReordering(EnableBasicBlockReordering) {}
123 bool runOnMachineFunction(MachineFunction &MF)
override;
125 void getAnalysisUsage(AnalysisUsage &AU)
const override {
126 AU.
addRequired<MachineBlockFrequencyInfoWrapperPass>();
127 AU.
addRequired<MachineBranchProbabilityInfoWrapperPass>();
134 MachineFunctionProperties getRequiredProperties()
const override {
135 return MachineFunctionProperties().setNoPHIs();
141char BranchFolderLegacy::ID = 0;
151 bool EnableTailMerge =
152 !MF.getTarget().requiresStructuredCFG() && this->EnableTailMerge;
156 .getCachedResult<ProfileSummaryAnalysis>(
157 *MF.getFunction().getParent());
160 "ProfileSummaryAnalysis is required for BranchFoldingPass",
false);
164 BranchFolder Folder(EnableTailMerge,
true, MBBFreqInfo, MBPI,
166 Folder.setBasicBlockReordering(
true);
167 if (Folder.OptimizeFunction(MF, MF.getSubtarget().getInstrInfo(),
168 MF.getSubtarget().getRegisterInfo()))
178 TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
183 MBFIWrapper MBBFreqInfo(
184 getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI());
186 EnableTailMerge, EnableCommonHoist, MBBFreqInfo,
187 getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI(),
188 &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI());
189 Folder.setBasicBlockReordering(EnableBasicBlockReordering);
198 : EnableHoistCommonCode(CommonHoist), EnableBasicBlockReordering(
true),
199 MinCommonTailLength(MinTailLength), MBBFreqInfo(FreqInfo), MBPI(ProbInfo),
203 EnableTailMerge = DefaultEnableTailMerge;
206 EnableTailMerge =
true;
209 EnableTailMerge =
false;
215 assert(
MBB->pred_empty() &&
"MBB must be dead!");
220 while (!
MBB->succ_empty())
221 MBB->removeSuccessor(
MBB->succ_end()-1);
224 TriedMerging.erase(
MBB);
228 if (
MI.shouldUpdateAdditionalCallInfo())
235 EHScopeMembership.erase(
MBB);
242 if (!tii)
return false;
244 TriedMerging.clear();
247 AfterBlockPlacement = AfterPlacement;
253 if (MinCommonTailLength == 0) {
256 : TII->getTailMergeSize(MF);
259 UpdateLiveIns = MRI.
tracksLiveness() && TRI->trackLivenessAfterRegAlloc(MF);
261 MRI.invalidateLiveness();
267 EnableHoistCommonCode =
270 EnableBasicBlockReordering =
273 bool MadeChange =
false;
278 bool MadeChangeThisIteration =
true;
279 while (MadeChangeThisIteration) {
280 MadeChangeThisIteration = TailMergeBlocks(MF);
283 if (!AfterBlockPlacement || MadeChangeThisIteration)
284 MadeChangeThisIteration |= OptimizeBranches(MF);
285 if (EnableHoistCommonCode)
286 MadeChangeThisIteration |= HoistCommonCode(MF);
287 MadeChange |= MadeChangeThisIteration;
301 if (!
Op.isJTI())
continue;
304 JTIsLive.
set(
Op.getIndex());
310 for (
unsigned i = 0, e = JTIsLive.
size(); i != e; ++i)
311 if (!JTIsLive.
test(i)) {
325 unsigned Hash =
MI.getOpcode();
326 for (
unsigned i = 0, e =
MI.getNumOperands(); i != e; ++i) {
332 unsigned OperandHash = 0;
333 switch (
Op.getType()) {
335 OperandHash =
Op.getReg().id();
338 OperandHash =
Op.getImm();
341 OperandHash =
Op.getMBB()->getNumber();
346 OperandHash =
Op.getIndex();
352 OperandHash =
Op.getOffset();
358 Hash += ((OperandHash << 3) |
Op.getType()) << (i & 31);
374 return !(
MI.isDebugInstr() ||
MI.isCFIInstruction());
383 while (
I !=
MBB->begin()) {
404 unsigned TailLen = 0;
408 if (MBBI1 == MBB1->
end() || MBBI2 == MBB2->
end())
410 if (!MBBI1->isIdenticalTo(*MBBI2) ||
416 MBBI1->isInlineAsm()) {
434 MachineBasicBlock &OldMBB = *OldInst->getParent();
436 LiveRegs.addLiveOuts(OldMBB);
441 LiveRegs.stepBackward(*
I);
442 }
while (
I != OldInst);
447 for (MachineBasicBlock::RegisterMaskPair
P : NewDest.
liveins()) {
451 "Can only handle full register.");
452 MCRegister
Reg =
P.PhysReg;
453 if (!LiveRegs.available(*MRI,
Reg))
456 BuildMI(OldMBB, OldInst,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
Reg);
460 TII->ReplaceTailWithBranchTo(OldInst, &NewDest);
467 if (!TII->isLegalToSplitMBBAt(CurMBB, BBI1))
470 MachineFunction &MF = *CurMBB.
getParent();
484 NewMBB->
splice(NewMBB->
end(), &CurMBB, BBI1, CurMBB.
end());
488 if (MachineLoop *
ML = MLI->getLoopFor(&CurMBB))
489 ML->addBasicBlockToLoop(NewMBB, *MLI);
492 MBBFreqInfo.setBlockFreq(NewMBB, MBBFreqInfo.getBlockFreq(&CurMBB));
498 const auto &EHScopeI = EHScopeMembership.find(&CurMBB);
499 if (EHScopeI != EHScopeMembership.end()) {
500 auto n = EHScopeI->second;
501 EHScopeMembership[NewMBB] = n;
512 for (;
I !=
E; ++
I) {
517 else if (
I->mayLoadOrStore())
538 if (
I != MF->
end() && !
TII->analyzeBranch(*CurMBB,
TBB, FBB,
Cond,
true)) {
540 if (
TBB == NextBB && !
Cond.empty() && !FBB) {
541 if (!
TII->reverseBranchCondition(
Cond)) {
542 TII->removeBranch(*CurMBB);
543 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
Cond, dl);
548 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
553BranchFolder::MergePotentialsElt::operator<(
const MergePotentialsElt &o)
const {
554 if (getHash() <
o.getHash())
556 if (getHash() >
o.getHash())
558 if (getBlock()->getNumber() <
o.getBlock()->getNumber())
560 if (getBlock()->getNumber() >
o.getBlock()->getNumber())
571 unsigned NumTerms = 0;
573 if (
I ==
MBB->begin()) {
578 if (!
I->isTerminator())
break;
588 if (!
MBB->succ_empty())
592 return !(
MBB->back().isReturn() ||
MBB->back().isIndirectBranch());
613 unsigned MinCommonTailLength,
unsigned &CommonTailLen,
622 if (!EHScopeMembership.
empty()) {
623 auto EHScope1 = EHScopeMembership.
find(MBB1);
624 assert(EHScope1 != EHScopeMembership.
end());
625 auto EHScope2 = EHScopeMembership.
find(MBB2);
626 assert(EHScope2 != EHScopeMembership.
end());
627 if (EHScope1->second != EHScope2->second)
632 if (CommonTailLen == 0)
636 << CommonTailLen <<
'\n');
646 bool FullBlockTail1 = I1 == MBB1->
begin();
647 bool FullBlockTail2 = I2 == MBB2->
begin();
654 if ((MBB1 == PredBB || MBB2 == PredBB) &&
655 (!AfterPlacement || MBB1->
succ_size() == 1)) {
658 if (CommonTailLen > NumTerms)
667 if (FullBlockTail1 && FullBlockTail2 &&
684 if (AfterPlacement && FullBlockTail1 && FullBlockTail2) {
686 if (!
MBB->succ_empty() && !
MBB->canFallThrough())
690 return (
MBB != &*MF->
begin()) && std::prev(
I)->canFallThrough();
692 if (!BothFallThrough(MBB1) || !BothFallThrough(MBB2))
701 unsigned EffectiveTailLen = CommonTailLen;
702 if (SuccBB && MBB1 != PredBB && MBB2 != PredBB &&
703 (MBB1->
succ_size() == 1 || !AfterPlacement) &&
709 if (EffectiveTailLen >= MinCommonTailLength)
718 return EffectiveTailLen >= 2 && OptForSize &&
719 (FullBlockTail1 || FullBlockTail2);
722unsigned BranchFolder::ComputeSameTails(
unsigned CurHash,
723 unsigned MinCommonTailLength,
724 MachineBasicBlock *SuccBB,
725 MachineBasicBlock *PredBB) {
726 unsigned maxCommonTailLength = 0
U;
729 MPIterator HighestMPIter = std::prev(MergePotentials.end());
730 for (MPIterator CurMPIter = std::prev(MergePotentials.end()),
731 B = MergePotentials.begin();
732 CurMPIter !=
B && CurMPIter->getHash() == CurHash; --CurMPIter) {
733 for (MPIterator
I = std::prev(CurMPIter);
I->getHash() == CurHash; --
I) {
734 unsigned CommonTailLen;
737 CommonTailLen, TrialBBI1, TrialBBI2,
740 AfterBlockPlacement, MBBFreqInfo, PSI)) {
741 if (CommonTailLen > maxCommonTailLength) {
743 maxCommonTailLength = CommonTailLen;
744 HighestMPIter = CurMPIter;
745 SameTails.push_back(SameTailElt(CurMPIter, TrialBBI1));
747 if (HighestMPIter == CurMPIter &&
748 CommonTailLen == maxCommonTailLength)
749 SameTails.push_back(SameTailElt(
I, TrialBBI2));
755 return maxCommonTailLength;
758void BranchFolder::RemoveBlocksWithHash(
unsigned CurHash,
759 MachineBasicBlock *SuccBB,
760 MachineBasicBlock *PredBB,
762 MPIterator CurMPIter,
B;
763 for (CurMPIter = std::prev(MergePotentials.end()),
764 B = MergePotentials.begin();
765 CurMPIter->getHash() == CurHash; --CurMPIter) {
767 MachineBasicBlock *CurMBB = CurMPIter->getBlock();
768 if (SuccBB && CurMBB != PredBB)
769 FixTail(CurMBB, SuccBB, TII, BranchDL);
773 if (CurMPIter->getHash() != CurHash)
775 MergePotentials.erase(CurMPIter, MergePotentials.end());
778bool BranchFolder::CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
779 MachineBasicBlock *SuccBB,
780 unsigned maxCommonTailLength,
781 unsigned &commonTailIndex) {
783 unsigned TimeEstimate = ~0
U;
784 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
786 if (SameTails[i].getBlock() == PredBB) {
793 SameTails[i].getTailStartPos());
794 if (t <= TimeEstimate) {
801 SameTails[commonTailIndex].getTailStartPos();
802 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
805 << maxCommonTailLength);
812 MachineBasicBlock *newMBB = SplitMBBAt(*
MBB, BBI, BB);
818 SameTails[commonTailIndex].setBlock(newMBB);
819 SameTails[commonTailIndex].setTailStartPos(newMBB->
begin());
844 unsigned CommonTailLen = 0;
845 for (
auto E =
MBB->end(); MBBIStartPos !=
E; ++MBBIStartPos)
853 while (CommonTailLen--) {
854 assert(
MBBI != MBBIE &&
"Reached BB end within common tail length!");
865 assert(MBBICommon != MBBIECommon &&
866 "Reached BB end within common tail length!");
867 assert(MBBICommon->isIdenticalTo(*
MBBI) &&
"Expected matching MIIs!");
870 if (MBBICommon->mayLoadOrStore())
871 MBBICommon->cloneMergedMemRefs(*
MBB->getParent(), {&*MBBICommon, &*MBBI});
881void BranchFolder::mergeCommonTails(
unsigned commonTailIndex) {
882 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
884 std::vector<MachineBasicBlock::iterator> NextCommonInsts(SameTails.size());
885 for (
unsigned int i = 0 ; i != SameTails.size() ; ++i) {
886 if (i != commonTailIndex) {
887 NextCommonInsts[i] = SameTails[i].getTailStartPos();
891 "MBB is not a common tail only block");
895 for (
auto &
MI : *
MBB) {
899 for (
unsigned int i = 0 ; i < NextCommonInsts.size() ; i++) {
900 if (i == commonTailIndex)
903 auto &Pos = NextCommonInsts[i];
904 assert(Pos != SameTails[i].getBlock()->
end() &&
905 "Reached BB end within common tail");
908 assert(Pos != SameTails[i].getBlock()->
end() &&
909 "Reached BB end within common tail");
911 assert(
MI.isIdenticalTo(*Pos) &&
"Expected matching MIIs!");
913 NextCommonInsts[i] = ++Pos;
919 LivePhysRegs NewLiveIns(*TRI);
927 LiveRegs.addLiveOuts(*Pred);
930 if (!LiveRegs.available(*MRI,
Reg))
936 return NewLiveIns.contains(SReg) && !MRI->isReserved(SReg);
941 BuildMI(*Pred, InsertBefore,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
960bool BranchFolder::TryTailMergeBlocks(MachineBasicBlock *SuccBB,
961 MachineBasicBlock *PredBB,
962 unsigned MinCommonTailLength) {
963 bool MadeChange =
false;
966 dbgs() <<
"\nTryTailMergeBlocks: ";
967 for (
unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
969 << (i ==
e - 1 ?
"" :
", ");
977 dbgs() <<
"Looking for common tails of at least " << MinCommonTailLength
978 <<
" instruction" << (MinCommonTailLength == 1 ?
"" :
"s") <<
'\n';
983#if LLVM_ENABLE_DEBUGLOC_TRACKING_ORIGIN
986 std::sort(MergePotentials.begin(), MergePotentials.end());
992 while (MergePotentials.size() > 1) {
993 unsigned CurHash = MergePotentials.back().getHash();
994 const DebugLoc &BranchDL = MergePotentials.back().getBranchDebugLoc();
998 unsigned maxCommonTailLength = ComputeSameTails(CurHash,
1004 if (SameTails.empty()) {
1005 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
1013 MachineBasicBlock *EntryBB =
1014 &MergePotentials.front().getBlock()->getParent()->front();
1015 unsigned commonTailIndex = SameTails.size();
1018 if (SameTails.size() == 2 &&
1019 SameTails[0].getBlock()->isLayoutSuccessor(SameTails[1].getBlock()) &&
1020 SameTails[1].tailIsWholeBlock() && !SameTails[1].getBlock()->isEHPad())
1021 commonTailIndex = 1;
1022 else if (SameTails.size() == 2 &&
1023 SameTails[1].getBlock()->isLayoutSuccessor(
1024 SameTails[0].getBlock()) &&
1025 SameTails[0].tailIsWholeBlock() &&
1026 !SameTails[0].getBlock()->isEHPad())
1027 commonTailIndex = 0;
1031 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
1032 MachineBasicBlock *
MBB = SameTails[i].getBlock();
1034 SameTails[i].tailIsWholeBlock())
1036 if (
MBB == PredBB) {
1037 commonTailIndex = i;
1040 if (SameTails[i].tailIsWholeBlock())
1041 commonTailIndex = i;
1045 if (commonTailIndex == SameTails.size() ||
1046 (SameTails[commonTailIndex].getBlock() == PredBB &&
1047 !SameTails[commonTailIndex].tailIsWholeBlock())) {
1050 if (!CreateCommonTailOnlyBlock(PredBB, SuccBB,
1051 maxCommonTailLength, commonTailIndex)) {
1052 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
1057 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
1060 setCommonTailEdgeWeights(*
MBB);
1064 mergeCommonTails(commonTailIndex);
1070 for (
unsigned int i=0, e = SameTails.size(); i != e; ++i) {
1071 if (commonTailIndex == i)
1074 << (i == e - 1 ?
"" :
", "));
1076 replaceTailWithBranchTo(SameTails[i].getTailStartPos(), *
MBB);
1078 MergePotentials.erase(SameTails[i].getMPIter());
1088bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
1089 bool MadeChange =
false;
1090 if (!EnableTailMerge)
1095 MergePotentials.clear();
1096 for (MachineBasicBlock &
MBB : MF) {
1107 for (
const MergePotentialsElt &Elt : MergePotentials)
1108 TriedMerging.insert(Elt.getBlock());
1111 if (MergePotentials.size() >= 2)
1112 MadeChange |= TryTailMergeBlocks(
nullptr,
nullptr, MinCommonTailLength);
1135 if (
I->pred_size() < 2)
continue;
1136 SmallPtrSet<MachineBasicBlock *, 8> UniquePreds;
1137 MachineBasicBlock *IBB = &*
I;
1138 MachineBasicBlock *PredBB = &*std::prev(
I);
1139 MergePotentials.clear();
1152 if (AfterBlockPlacement && MLI) {
1153 ML = MLI->getLoopFor(IBB);
1154 if (
ML && IBB ==
ML->getHeader())
1158 for (MachineBasicBlock *PBB :
I->predecessors()) {
1162 if (TriedMerging.count(PBB))
1170 if (!UniquePreds.
insert(PBB).second)
1175 if (PBB->hasEHPadSuccessor() || PBB->mayHaveInlineAsmBr())
1181 if (AfterBlockPlacement && MLI)
1182 if (
ML != MLI->getLoopFor(PBB))
1185 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
1187 if (!TII->analyzeBranch(*PBB,
TBB, FBB,
Cond,
true)) {
1191 if (!
Cond.empty() &&
TBB == IBB) {
1192 if (TII->reverseBranchCondition(NewCond))
1196 auto Next = ++PBB->getIterator();
1197 if (
Next != MF.end())
1203 DebugLoc dl = PBB->findBranchDebugLoc();
1204 if (
TBB && (
Cond.empty() || FBB)) {
1205 TII->removeBranch(*PBB);
1208 TII->insertBranch(*PBB, (
TBB == IBB) ? FBB :
TBB,
nullptr,
1212 MergePotentials.push_back(
1220 for (MergePotentialsElt &Elt : MergePotentials)
1221 TriedMerging.insert(Elt.getBlock());
1223 if (MergePotentials.size() >= 2)
1224 MadeChange |= TryTailMergeBlocks(IBB, PredBB, MinCommonTailLength);
1228 PredBB = &*std::prev(
I);
1229 if (MergePotentials.size() == 1 &&
1230 MergePotentials.begin()->getBlock() != PredBB)
1231 FixTail(MergePotentials.begin()->getBlock(), IBB, TII,
1232 MergePotentials.begin()->getBranchDebugLoc());
1238void BranchFolder::setCommonTailEdgeWeights(MachineBasicBlock &TailMBB) {
1240 BlockFrequency AccumulatedMBBFreq;
1245 for (
const auto &Src : SameTails) {
1246 const MachineBasicBlock *SrcMBB = Src.getBlock();
1247 BlockFrequency BlockFreq = MBBFreqInfo.getBlockFreq(SrcMBB);
1248 AccumulatedMBBFreq += BlockFreq;
1255 auto EdgeFreq = EdgeFreqLs.begin();
1258 SuccI != SuccE; ++SuccI, ++EdgeFreq)
1259 *EdgeFreq += BlockFreq * MBPI.getEdgeProbability(SrcMBB, *SuccI);
1262 MBBFreqInfo.setBlockFreq(&TailMBB, AccumulatedMBBFreq);
1268 std::accumulate(EdgeFreqLs.begin(), EdgeFreqLs.end(), BlockFrequency(0))
1270 auto EdgeFreq = EdgeFreqLs.begin();
1272 if (SumEdgeFreq > 0) {
1274 SuccI != SuccE; ++SuccI, ++EdgeFreq) {
1276 EdgeFreq->getFrequency(), SumEdgeFreq);
1286bool BranchFolder::OptimizeBranches(MachineFunction &MF) {
1287 bool MadeChange =
false;
1294 for (MachineBasicBlock &
MBB :
1296 MadeChange |= OptimizeBlock(&
MBB);
1301 RemoveDeadBlock(&
MBB);
1313 return MBB->getFirstNonDebugInstr(
true) ==
MBB->end();
1321 return I->isBranch();
1330 assert(MBB1 && MBB2 &&
"Unknown MachineBasicBlock");
1338 if (MBB1I == MBB1->
end() || MBB2I == MBB2->
end())
1346 return MBB2I->isCall() && !MBB1I->isCall();
1354 if (
MI.isDebugInstr()) {
1355 TII->duplicate(PredMBB, InsertBefore,
MI);
1356 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to pred: "
1366 if (
MI.isDebugInstr()) {
1367 TII->duplicate(SuccMBB, InsertBefore,
MI);
1368 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to succ: "
1398 return !CurCond.
empty() &&
1401 return LHS.isIdenticalTo(
RHS);
1405bool BranchFolder::OptimizeBlock(MachineBasicBlock *
MBB) {
1406 bool MadeChange =
false;
1414 bool SameEHScope =
true;
1415 if (!EHScopeMembership.empty() && FallThrough != MF.
end()) {
1416 auto MBBEHScope = EHScopeMembership.find(
MBB);
1417 assert(MBBEHScope != EHScopeMembership.end());
1418 auto FallThroughEHScope = EHScopeMembership.find(&*FallThrough);
1419 assert(FallThroughEHScope != EHScopeMembership.end());
1420 SameEHScope = MBBEHScope->second == FallThroughEHScope->second;
1425 MachineBasicBlock *CurTBB =
nullptr, *CurFBB =
nullptr;
1427 bool CurUnAnalyzable =
1428 TII->analyzeBranch(*
MBB, CurTBB, CurFBB, CurCond,
true);
1440 if (FallThrough == MF.
end()) {
1442 }
else if (FallThrough->isEHPad()) {
1458 if (*SI != &*FallThrough && !FallThrough->isSuccessor(*SI)) {
1459 assert((*SI)->isEHPad() &&
"Bad CFG");
1460 FallThrough->copySuccessor(
MBB, SI);
1465 MJTI->ReplaceMBBInJumpTables(
MBB, &*FallThrough);
1475 MachineBasicBlock *PriorTBB =
nullptr, *PriorFBB =
nullptr;
1477 bool PriorUnAnalyzable =
1478 TII->analyzeBranch(PrevBB, PriorTBB, PriorFBB, PriorCond,
true);
1479 if (!PriorUnAnalyzable) {
1483 if (PriorTBB && PriorTBB == PriorFBB) {
1485 TII->removeBranch(PrevBB);
1487 if (PriorTBB !=
MBB)
1488 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1491 goto ReoptimizeBlock;
1505 <<
"From MBB: " << *
MBB);
1507 if (!PrevBB.
empty()) {
1513 while (PrevBBIter != PrevBB.
begin() && MBBIter !=
MBB->
end()
1514 && PrevBBIter->isDebugInstr() && MBBIter->isDebugInstr()) {
1515 if (!MBBIter->isIdenticalTo(*PrevBBIter))
1517 MachineInstr &DuplicateDbg = *MBBIter;
1518 ++MBBIter; -- PrevBBIter;
1532 if (PriorTBB ==
MBB && !PriorFBB) {
1533 TII->removeBranch(PrevBB);
1536 goto ReoptimizeBlock;
1541 if (PriorFBB ==
MBB) {
1543 TII->removeBranch(PrevBB);
1544 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1547 goto ReoptimizeBlock;
1553 if (PriorTBB ==
MBB) {
1555 if (!TII->reverseBranchCondition(NewPriorCond)) {
1557 TII->removeBranch(PrevBB);
1558 TII->insertBranch(PrevBB, PriorFBB,
nullptr, NewPriorCond, Dl);
1561 goto ReoptimizeBlock;
1573 TII->removeBranch(PrevBB);
1577 goto ReoptimizeBlock;
1591 bool DoTransform =
true;
1598 if (FallThrough == --MF.
end() &&
1600 DoTransform =
false;
1605 if (!TII->reverseBranchCondition(NewPriorCond)) {
1607 <<
"To make fallthrough to: " << *PriorTBB <<
"\n");
1610 TII->removeBranch(PrevBB);
1611 TII->insertBranch(PrevBB,
MBB,
nullptr, NewPriorCond, Dl);
1625 if (TII->isUnconditionalTailCall(TailCall)) {
1628 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1630 bool PredAnalyzable =
1631 !TII->analyzeBranch(*Pred, PredTBB, PredFBB, PredCond,
true);
1634 if (PredAnalyzable && !PredCond.
empty() && PredTBB ==
MBB &&
1635 PredTBB != PredFBB) {
1639 if (TII->canMakeTailCallConditional(PredCond, TailCall)) {
1643 TII->replaceBranchWithTailCall(*Pred, PredCond, TailCall);
1653 if (!PredsChanged.
empty()) {
1654 NumTailCalls += PredsChanged.
size();
1655 for (
auto &Pred : PredsChanged)
1663 if (!CurUnAnalyzable) {
1669 if (CurTBB && CurFBB && CurFBB ==
MBB && CurTBB !=
MBB) {
1671 if (!TII->reverseBranchCondition(NewCond)) {
1673 TII->removeBranch(*
MBB);
1674 TII->insertBranch(*
MBB, CurFBB, CurTBB, NewCond, Dl);
1677 goto ReoptimizeBlock;
1683 if (CurTBB && CurCond.
empty() && !CurFBB &&
1690 TII->removeBranch(*
MBB);
1706 if (PredHasNoFallThrough || !PriorUnAnalyzable ||
1711 PriorTBB !=
MBB && PriorFBB !=
MBB) {
1714 "Bad branch analysis");
1717 assert(!PriorFBB &&
"Machine CFG out of date!");
1721 TII->removeBranch(PrevBB);
1722 TII->insertBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, PrevDl);
1727 bool DidChange =
false;
1728 bool HasBranchToSelf =
false;
1734 HasBranchToSelf =
true;
1744 assert((*SI)->isEHPad() &&
"Bad CFG");
1750 MachineBasicBlock *NewCurTBB =
nullptr, *NewCurFBB =
nullptr;
1752 bool NewCurUnAnalyzable = TII->analyzeBranch(
1753 *PMBB, NewCurTBB, NewCurFBB, NewCurCond,
true);
1754 if (!NewCurUnAnalyzable && NewCurTBB && NewCurTBB == NewCurFBB) {
1756 TII->removeBranch(*PMBB);
1758 TII->insertBranch(*PMBB, NewCurTBB,
nullptr, NewCurCond,
1768 MJTI->ReplaceMBBInJumpTables(
MBB, CurTBB);
1772 if (!HasBranchToSelf)
return MadeChange;
1778 TII->insertBranch(*
MBB, CurTBB,
nullptr, CurCond, Dl);
1796 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1799 !TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond,
true) &&
1800 (PredTBB ==
MBB || PredFBB ==
MBB) &&
1801 (!CurFallsThru || !CurTBB || !CurFBB) &&
1816 TII->insertBranch(*
MBB, NextBB,
nullptr, CurCond,
DebugLoc());
1820 goto ReoptimizeBlock;
1825 if (!CurFallsThru) {
1828 if (!CurUnAnalyzable) {
1829 for (MachineBasicBlock *SuccBB : {CurFBB, CurTBB}) {
1838 if (SuccBB !=
MBB && &*SuccPrev !=
MBB &&
1839 !SuccPrev->canFallThrough()) {
1842 goto ReoptimizeBlock;
1868 MachineBasicBlock *PrevTBB =
nullptr, *PrevFBB =
nullptr;
1871 if (FallThrough != MF.
end() && !FallThrough->isEHPad() &&
1872 !FallThrough->isInlineAsmBrIndirectTarget() &&
1873 !TII->analyzeBranch(PrevBB, PrevTBB, PrevFBB, PrevCond,
true) &&
1889bool BranchFolder::HoistCommonCode(MachineFunction &MF) {
1890 bool MadeChange =
false;
1892 MadeChange |= HoistCommonCodeInSuccs(&
MBB);
1902 if (SuccBB != TrueBB)
1907template <
class Container>
1910 if (
Reg.isPhysical()) {
1932 if (!
TII->isUnpredicatedTerminator(*
Loc))
1973 if (!MO.isReg() || MO.isUse())
1994 bool DontMoveAcrossStore =
true;
1995 if (!PI->isSafeToMove(DontMoveAcrossStore) ||
TII->isPredicated(*PI))
2010 if (
Reg.isPhysical()) {
2022bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *
MBB) {
2023 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
2041 SmallSet<Register, 4>
Uses, Defs;
2047 bool HasDups =
false;
2048 SmallSet<Register, 4> ActiveDefsSet, AllDefsSet;
2054 while (TIB != TIE && FIB != FIE) {
2058 if (TIB == TIE || FIB == FIE)
2064 if (TII->isPredicated(*TIB))
2068 if (!TII->isSafeToMove(*TIB,
TBB, MF))
2073 for (MachineOperand &MO : TIB->operands()) {
2075 if (MO.isRegMask()) {
2092 if (Defs.
count(
Reg) && !MO.isDead()) {
2107 }
else if (!ActiveDefsSet.
count(
Reg)) {
2114 if (MO.isKill() &&
Uses.count(
Reg))
2117 MO.setIsKill(
false);
2123 bool DontMoveAcrossStore =
true;
2124 if (!TIB->isSafeToMove(DontMoveAcrossStore))
2128 for (
const MachineOperand &MO : TIB->all_uses()) {
2138 for (MCRegAliasIterator AI(
Reg, TRI,
true); AI.isValid(); ++AI)
2139 ActiveDefsSet.
erase(*AI);
2146 for (
const MachineOperand &MO : TIB->all_defs()) {
2173 MachineInstrBuilder MIRBuilder(*
MBB->
getParent(), Loc);
2175 assert(DI->isDebugInstr() &&
"Expected a debug instruction");
2176 if (DI->isDebugRef()) {
2177 const TargetInstrInfo *TII =
2179 const MCInstrDesc &DBGV = TII->
get(TargetOpcode::DBG_VALUE);
2181 DI->getDebugVariable(), DI->getDebugExpression());
2186 if (DI->isDebugPHI()) {
2187 DI->eraseFromParent();
2191 if (!DI->isDebugLabel())
2192 DI->setDebugValueUndef();
2193 DI->moveBefore(&*Loc);
2205 while (FI != FE && FI->isDebugInstr())
2206 HoistAndKillDbgInstr(FI++);
2209 if (TI->isDebugInstr()) {
2210 HoistAndKillDbgInstr(TI);
2215 assert(FI != FE &&
"Unexpected end of FBB range");
2218 assert(!TI->isPseudoProbe() &&
"Unexpected pseudo probe in range");
2222 "Expected non-debug lockstep");
2231 TI->moveBefore(&*Loc);
2236 FBB->
erase(FBB->begin(), FIB);
2246 bool EnableBasicBlockReordering) {
2247 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()
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.
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()