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