47#include "llvm/Config/llvm-config.h"
69#define DEBUG_TYPE "branch-folder"
71STATISTIC(NumDeadBlocks,
"Number of dead blocks removed");
72STATISTIC(NumBranchOpts,
"Number of branches optimized");
73STATISTIC(NumTailMerge ,
"Number of block tails merged");
74STATISTIC(NumHoist ,
"Number of times common instructions are hoisted");
75STATISTIC(NumTailCalls,
"Number of tail calls optimized");
83 cl::desc(
"Max number of predecessors to consider tail merging"),
89 cl::desc(
"Min number of instructions to consider tail merging"),
101 bool runOnMachineFunction(MachineFunction &MF)
override;
103 void getAnalysisUsage(AnalysisUsage &AU)
const override {
104 AU.
addRequired<MachineBlockFrequencyInfoWrapperPass>();
105 AU.
addRequired<MachineBranchProbabilityInfoWrapperPass>();
111 MachineFunctionProperties getRequiredProperties()
const override {
112 return MachineFunctionProperties().setNoPHIs();
118char BranchFolderLegacy::ID = 0;
128 bool EnableTailMerge =
129 !MF.getTarget().requiresStructuredCFG() && this->EnableTailMerge;
133 .getCachedResult<ProfileSummaryAnalysis>(
134 *MF.getFunction().getParent());
137 "ProfileSummaryAnalysis is required for BranchFoldingPass",
false);
141 BranchFolder Folder(EnableTailMerge,
true, MBBFreqInfo, MBPI,
143 if (Folder.OptimizeFunction(MF, MF.getSubtarget().getInstrInfo(),
144 MF.getSubtarget().getRegisterInfo()))
154 TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
159 MBFIWrapper MBBFreqInfo(
160 getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI());
162 EnableTailMerge,
true, MBBFreqInfo,
163 getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI(),
164 &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI());
173 : EnableHoistCommonCode(CommonHoist), MinCommonTailLength(MinTailLength),
174 MBBFreqInfo(FreqInfo), MBPI(ProbInfo), PSI(PSI) {
177 EnableTailMerge = DefaultEnableTailMerge;
185 assert(
MBB->pred_empty() &&
"MBB must be dead!");
190 while (!
MBB->succ_empty())
191 MBB->removeSuccessor(
MBB->succ_end()-1);
194 TriedMerging.erase(
MBB);
198 if (
MI.shouldUpdateAdditionalCallInfo())
203 EHScopeMembership.erase(
MBB);
212 if (!tii)
return false;
214 TriedMerging.clear();
217 AfterBlockPlacement = AfterPlacement;
223 if (MinCommonTailLength == 0) {
226 : TII->getTailMergeSize(MF);
229 UpdateLiveIns = MRI.
tracksLiveness() && TRI->trackLivenessAfterRegAlloc(MF);
231 MRI.invalidateLiveness();
233 bool MadeChange =
false;
238 bool MadeChangeThisIteration =
true;
239 while (MadeChangeThisIteration) {
240 MadeChangeThisIteration = TailMergeBlocks(MF);
243 if (!AfterBlockPlacement || MadeChangeThisIteration)
244 MadeChangeThisIteration |= OptimizeBranches(MF);
245 if (EnableHoistCommonCode)
246 MadeChangeThisIteration |= HoistCommonCode(MF);
247 MadeChange |= MadeChangeThisIteration;
261 if (!
Op.isJTI())
continue;
264 JTIsLive.
set(
Op.getIndex());
270 for (
unsigned i = 0, e = JTIsLive.
size(); i != e; ++i)
271 if (!JTIsLive.
test(i)) {
285 unsigned Hash =
MI.getOpcode();
286 for (
unsigned i = 0, e =
MI.getNumOperands(); i != e; ++i) {
292 unsigned OperandHash = 0;
293 switch (
Op.getType()) {
295 OperandHash =
Op.getReg().id();
298 OperandHash =
Op.getImm();
301 OperandHash =
Op.getMBB()->getNumber();
306 OperandHash =
Op.getIndex();
312 OperandHash =
Op.getOffset();
318 Hash += ((OperandHash << 3) |
Op.getType()) << (i & 31);
334 return !(
MI.isDebugInstr() ||
MI.isCFIInstruction());
343 while (
I !=
MBB->begin()) {
364 unsigned TailLen = 0;
368 if (MBBI1 == MBB1->
end() || MBBI2 == MBB2->
end())
370 if (!MBBI1->isIdenticalTo(*MBBI2) ||
376 MBBI1->isInlineAsm()) {
394 MachineBasicBlock &OldMBB = *OldInst->getParent();
396 LiveRegs.addLiveOuts(OldMBB);
401 LiveRegs.stepBackward(*
I);
402 }
while (
I != OldInst);
407 for (MachineBasicBlock::RegisterMaskPair
P : NewDest.
liveins()) {
411 "Can only handle full register.");
412 MCRegister
Reg =
P.PhysReg;
413 if (!LiveRegs.available(*MRI,
Reg))
416 BuildMI(OldMBB, OldInst,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
Reg);
420 TII->ReplaceTailWithBranchTo(OldInst, &NewDest);
427 if (!TII->isLegalToSplitMBBAt(CurMBB, BBI1))
430 MachineFunction &MF = *CurMBB.
getParent();
444 NewMBB->
splice(NewMBB->
end(), &CurMBB, BBI1, CurMBB.
end());
448 if (MachineLoop *
ML = MLI->getLoopFor(&CurMBB))
449 ML->addBasicBlockToLoop(NewMBB, *MLI);
452 MBBFreqInfo.setBlockFreq(NewMBB, MBBFreqInfo.getBlockFreq(&CurMBB));
458 const auto &EHScopeI = EHScopeMembership.find(&CurMBB);
459 if (EHScopeI != EHScopeMembership.end()) {
460 auto n = EHScopeI->second;
461 EHScopeMembership[NewMBB] = n;
472 for (;
I !=
E; ++
I) {
477 else if (
I->mayLoadOrStore())
498 if (
I != MF->
end() && !
TII->analyzeBranch(*CurMBB,
TBB, FBB,
Cond,
true)) {
500 if (
TBB == NextBB && !
Cond.empty() && !FBB) {
501 if (!
TII->reverseBranchCondition(
Cond)) {
502 TII->removeBranch(*CurMBB);
503 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
Cond, dl);
508 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
513BranchFolder::MergePotentialsElt::operator<(
const MergePotentialsElt &o)
const {
514 if (getHash() <
o.getHash())
516 if (getHash() >
o.getHash())
518 if (getBlock()->getNumber() <
o.getBlock()->getNumber())
520 if (getBlock()->getNumber() >
o.getBlock()->getNumber())
531 unsigned NumTerms = 0;
533 if (
I ==
MBB->begin()) {
538 if (!
I->isTerminator())
break;
548 if (!
MBB->succ_empty())
552 return !(
MBB->back().isReturn() ||
MBB->back().isIndirectBranch());
573 unsigned MinCommonTailLength,
unsigned &CommonTailLen,
582 if (!EHScopeMembership.
empty()) {
583 auto EHScope1 = EHScopeMembership.
find(MBB1);
584 assert(EHScope1 != EHScopeMembership.
end());
585 auto EHScope2 = EHScopeMembership.
find(MBB2);
586 assert(EHScope2 != EHScopeMembership.
end());
587 if (EHScope1->second != EHScope2->second)
592 if (CommonTailLen == 0)
596 << CommonTailLen <<
'\n');
606 bool FullBlockTail1 = I1 == MBB1->
begin();
607 bool FullBlockTail2 = I2 == MBB2->
begin();
614 if ((MBB1 == PredBB || MBB2 == PredBB) &&
615 (!AfterPlacement || MBB1->
succ_size() == 1)) {
618 if (CommonTailLen > NumTerms)
627 if (FullBlockTail1 && FullBlockTail2 &&
644 if (AfterPlacement && FullBlockTail1 && FullBlockTail2) {
646 if (!
MBB->succ_empty() && !
MBB->canFallThrough())
650 return (
MBB != &*MF->
begin()) && std::prev(
I)->canFallThrough();
652 if (!BothFallThrough(MBB1) || !BothFallThrough(MBB2))
661 unsigned EffectiveTailLen = CommonTailLen;
662 if (SuccBB && MBB1 != PredBB && MBB2 != PredBB &&
663 (MBB1->
succ_size() == 1 || !AfterPlacement) &&
669 if (EffectiveTailLen >= MinCommonTailLength)
678 return EffectiveTailLen >= 2 && OptForSize &&
679 (FullBlockTail1 || FullBlockTail2);
682unsigned BranchFolder::ComputeSameTails(
unsigned CurHash,
683 unsigned MinCommonTailLength,
684 MachineBasicBlock *SuccBB,
685 MachineBasicBlock *PredBB) {
686 unsigned maxCommonTailLength = 0
U;
689 MPIterator HighestMPIter = std::prev(MergePotentials.end());
690 for (MPIterator CurMPIter = std::prev(MergePotentials.end()),
691 B = MergePotentials.begin();
692 CurMPIter !=
B && CurMPIter->getHash() == CurHash; --CurMPIter) {
693 for (MPIterator
I = std::prev(CurMPIter);
I->getHash() == CurHash; --
I) {
694 unsigned CommonTailLen;
697 CommonTailLen, TrialBBI1, TrialBBI2,
700 AfterBlockPlacement, MBBFreqInfo, PSI)) {
701 if (CommonTailLen > maxCommonTailLength) {
703 maxCommonTailLength = CommonTailLen;
704 HighestMPIter = CurMPIter;
705 SameTails.push_back(SameTailElt(CurMPIter, TrialBBI1));
707 if (HighestMPIter == CurMPIter &&
708 CommonTailLen == maxCommonTailLength)
709 SameTails.push_back(SameTailElt(
I, TrialBBI2));
715 return maxCommonTailLength;
718void BranchFolder::RemoveBlocksWithHash(
unsigned CurHash,
719 MachineBasicBlock *SuccBB,
720 MachineBasicBlock *PredBB,
722 MPIterator CurMPIter,
B;
723 for (CurMPIter = std::prev(MergePotentials.end()),
724 B = MergePotentials.begin();
725 CurMPIter->getHash() == CurHash; --CurMPIter) {
727 MachineBasicBlock *CurMBB = CurMPIter->getBlock();
728 if (SuccBB && CurMBB != PredBB)
729 FixTail(CurMBB, SuccBB, TII, BranchDL);
733 if (CurMPIter->getHash() != CurHash)
735 MergePotentials.erase(CurMPIter, MergePotentials.end());
738bool BranchFolder::CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
739 MachineBasicBlock *SuccBB,
740 unsigned maxCommonTailLength,
741 unsigned &commonTailIndex) {
743 unsigned TimeEstimate = ~0
U;
744 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
746 if (SameTails[i].getBlock() == PredBB) {
753 SameTails[i].getTailStartPos());
754 if (t <= TimeEstimate) {
761 SameTails[commonTailIndex].getTailStartPos();
762 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
765 << maxCommonTailLength);
772 MachineBasicBlock *newMBB = SplitMBBAt(*
MBB, BBI, BB);
778 SameTails[commonTailIndex].setBlock(newMBB);
779 SameTails[commonTailIndex].setTailStartPos(newMBB->
begin());
795 unsigned CommonTailLen = 0;
796 for (
auto E =
MBB->end(); MBBIStartPos !=
E; ++MBBIStartPos)
804 while (CommonTailLen--) {
805 assert(
MBBI != MBBIE &&
"Reached BB end within common tail length!");
816 assert(MBBICommon != MBBIECommon &&
817 "Reached BB end within common tail length!");
818 assert(MBBICommon->isIdenticalTo(*
MBBI) &&
"Expected matching MIIs!");
821 if (MBBICommon->mayLoadOrStore())
822 MBBICommon->cloneMergedMemRefs(*
MBB->getParent(), {&*MBBICommon, &*MBBI});
824 for (
unsigned I = 0,
E = MBBICommon->getNumOperands();
I !=
E; ++
I) {
838void BranchFolder::mergeCommonTails(
unsigned commonTailIndex) {
839 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
841 std::vector<MachineBasicBlock::iterator> NextCommonInsts(SameTails.size());
842 for (
unsigned int i = 0 ; i != SameTails.size() ; ++i) {
843 if (i != commonTailIndex) {
844 NextCommonInsts[i] = SameTails[i].getTailStartPos();
848 "MBB is not a common tail only block");
852 for (
auto &
MI : *
MBB) {
856 for (
unsigned int i = 0 ; i < NextCommonInsts.size() ; i++) {
857 if (i == commonTailIndex)
860 auto &Pos = NextCommonInsts[i];
861 assert(Pos != SameTails[i].getBlock()->
end() &&
862 "Reached BB end within common tail");
865 assert(Pos != SameTails[i].getBlock()->
end() &&
866 "Reached BB end within common tail");
868 assert(
MI.isIdenticalTo(*Pos) &&
"Expected matching MIIs!");
870 NextCommonInsts[i] = ++Pos;
876 LivePhysRegs NewLiveIns(*TRI);
884 LiveRegs.addLiveOuts(*Pred);
887 if (!LiveRegs.available(*MRI,
Reg))
893 return NewLiveIns.contains(SReg) && !MRI->isReserved(SReg);
898 BuildMI(*Pred, InsertBefore,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
917bool BranchFolder::TryTailMergeBlocks(MachineBasicBlock *SuccBB,
918 MachineBasicBlock *PredBB,
919 unsigned MinCommonTailLength) {
920 bool MadeChange =
false;
923 dbgs() <<
"\nTryTailMergeBlocks: ";
924 for (
unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
926 << (i ==
e - 1 ?
"" :
", ");
934 dbgs() <<
"Looking for common tails of at least " << MinCommonTailLength
935 <<
" instruction" << (MinCommonTailLength == 1 ?
"" :
"s") <<
'\n';
940#if LLVM_ENABLE_DEBUGLOC_TRACKING_ORIGIN
943 std::sort(MergePotentials.begin(), MergePotentials.end());
949 while (MergePotentials.size() > 1) {
950 unsigned CurHash = MergePotentials.back().getHash();
951 const DebugLoc &BranchDL = MergePotentials.back().getBranchDebugLoc();
955 unsigned maxCommonTailLength = ComputeSameTails(CurHash,
961 if (SameTails.empty()) {
962 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
970 MachineBasicBlock *EntryBB =
971 &MergePotentials.front().getBlock()->getParent()->front();
972 unsigned commonTailIndex = SameTails.size();
975 if (SameTails.size() == 2 &&
976 SameTails[0].getBlock()->isLayoutSuccessor(SameTails[1].getBlock()) &&
977 SameTails[1].tailIsWholeBlock() && !SameTails[1].getBlock()->isEHPad())
979 else if (SameTails.size() == 2 &&
980 SameTails[1].getBlock()->isLayoutSuccessor(
981 SameTails[0].getBlock()) &&
982 SameTails[0].tailIsWholeBlock() &&
983 !SameTails[0].getBlock()->isEHPad())
988 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
989 MachineBasicBlock *
MBB = SameTails[i].getBlock();
991 SameTails[i].tailIsWholeBlock())
997 if (SameTails[i].tailIsWholeBlock())
1002 if (commonTailIndex == SameTails.size() ||
1003 (SameTails[commonTailIndex].getBlock() == PredBB &&
1004 !SameTails[commonTailIndex].tailIsWholeBlock())) {
1007 if (!CreateCommonTailOnlyBlock(PredBB, SuccBB,
1008 maxCommonTailLength, commonTailIndex)) {
1009 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
1014 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
1017 setCommonTailEdgeWeights(*
MBB);
1021 mergeCommonTails(commonTailIndex);
1027 for (
unsigned int i=0, e = SameTails.size(); i != e; ++i) {
1028 if (commonTailIndex == i)
1031 << (i == e - 1 ?
"" :
", "));
1033 replaceTailWithBranchTo(SameTails[i].getTailStartPos(), *
MBB);
1035 MergePotentials.erase(SameTails[i].getMPIter());
1045bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
1046 bool MadeChange =
false;
1047 if (!EnableTailMerge)
1052 MergePotentials.clear();
1053 for (MachineBasicBlock &
MBB : MF) {
1064 for (
const MergePotentialsElt &Elt : MergePotentials)
1065 TriedMerging.insert(Elt.getBlock());
1068 if (MergePotentials.size() >= 2)
1069 MadeChange |= TryTailMergeBlocks(
nullptr,
nullptr, MinCommonTailLength);
1092 if (
I->pred_size() < 2)
continue;
1093 SmallPtrSet<MachineBasicBlock *, 8> UniquePreds;
1094 MachineBasicBlock *IBB = &*
I;
1095 MachineBasicBlock *PredBB = &*std::prev(
I);
1096 MergePotentials.clear();
1109 if (AfterBlockPlacement && MLI) {
1110 ML = MLI->getLoopFor(IBB);
1111 if (
ML && IBB ==
ML->getHeader())
1115 for (MachineBasicBlock *PBB :
I->predecessors()) {
1119 if (TriedMerging.count(PBB))
1127 if (!UniquePreds.
insert(PBB).second)
1132 if (PBB->hasEHPadSuccessor() || PBB->mayHaveInlineAsmBr())
1138 if (AfterBlockPlacement && MLI)
1139 if (
ML != MLI->getLoopFor(PBB))
1142 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
1144 if (!TII->analyzeBranch(*PBB,
TBB, FBB,
Cond,
true)) {
1148 if (!
Cond.empty() &&
TBB == IBB) {
1149 if (TII->reverseBranchCondition(NewCond))
1153 auto Next = ++PBB->getIterator();
1154 if (
Next != MF.end())
1160 DebugLoc dl = PBB->findBranchDebugLoc();
1161 if (
TBB && (
Cond.empty() || FBB)) {
1162 TII->removeBranch(*PBB);
1165 TII->insertBranch(*PBB, (
TBB == IBB) ? FBB :
TBB,
nullptr,
1169 MergePotentials.push_back(
1177 for (MergePotentialsElt &Elt : MergePotentials)
1178 TriedMerging.insert(Elt.getBlock());
1180 if (MergePotentials.size() >= 2)
1181 MadeChange |= TryTailMergeBlocks(IBB, PredBB, MinCommonTailLength);
1185 PredBB = &*std::prev(
I);
1186 if (MergePotentials.size() == 1 &&
1187 MergePotentials.begin()->getBlock() != PredBB)
1188 FixTail(MergePotentials.begin()->getBlock(), IBB, TII,
1189 MergePotentials.begin()->getBranchDebugLoc());
1195void BranchFolder::setCommonTailEdgeWeights(MachineBasicBlock &TailMBB) {
1197 BlockFrequency AccumulatedMBBFreq;
1202 for (
const auto &Src : SameTails) {
1203 const MachineBasicBlock *SrcMBB = Src.getBlock();
1204 BlockFrequency BlockFreq = MBBFreqInfo.getBlockFreq(SrcMBB);
1205 AccumulatedMBBFreq += BlockFreq;
1212 auto EdgeFreq = EdgeFreqLs.begin();
1215 SuccI != SuccE; ++SuccI, ++EdgeFreq)
1216 *EdgeFreq += BlockFreq * MBPI.getEdgeProbability(SrcMBB, *SuccI);
1219 MBBFreqInfo.setBlockFreq(&TailMBB, AccumulatedMBBFreq);
1225 std::accumulate(EdgeFreqLs.begin(), EdgeFreqLs.end(), BlockFrequency(0))
1227 auto EdgeFreq = EdgeFreqLs.begin();
1229 if (SumEdgeFreq > 0) {
1231 SuccI != SuccE; ++SuccI, ++EdgeFreq) {
1233 EdgeFreq->getFrequency(), SumEdgeFreq);
1243bool BranchFolder::OptimizeBranches(MachineFunction &MF) {
1244 bool MadeChange =
false;
1251 for (MachineBasicBlock &
MBB :
1253 MadeChange |= OptimizeBlock(&
MBB);
1258 RemoveDeadBlock(&
MBB);
1270 return MBB->getFirstNonDebugInstr(
true) ==
MBB->end();
1278 return I->isBranch();
1287 assert(MBB1 && MBB2 &&
"Unknown MachineBasicBlock");
1295 if (MBB1I == MBB1->
end() || MBB2I == MBB2->
end())
1303 return MBB2I->isCall() && !MBB1I->isCall();
1311 if (
MI.isDebugInstr()) {
1312 TII->duplicate(PredMBB, InsertBefore,
MI);
1313 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to pred: "
1323 if (
MI.isDebugInstr()) {
1324 TII->duplicate(SuccMBB, InsertBefore,
MI);
1325 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to succ: "
1353bool BranchFolder::OptimizeBlock(MachineBasicBlock *
MBB) {
1354 bool MadeChange =
false;
1362 bool SameEHScope =
true;
1363 if (!EHScopeMembership.empty() && FallThrough != MF.
end()) {
1364 auto MBBEHScope = EHScopeMembership.find(
MBB);
1365 assert(MBBEHScope != EHScopeMembership.end());
1366 auto FallThroughEHScope = EHScopeMembership.find(&*FallThrough);
1367 assert(FallThroughEHScope != EHScopeMembership.end());
1368 SameEHScope = MBBEHScope->second == FallThroughEHScope->second;
1373 MachineBasicBlock *CurTBB =
nullptr, *CurFBB =
nullptr;
1375 bool CurUnAnalyzable =
1376 TII->analyzeBranch(*
MBB, CurTBB, CurFBB, CurCond,
true);
1388 if (FallThrough == MF.
end()) {
1390 }
else if (FallThrough->isEHPad()) {
1406 if (*SI != &*FallThrough && !FallThrough->isSuccessor(*SI)) {
1407 assert((*SI)->isEHPad() &&
"Bad CFG");
1408 FallThrough->copySuccessor(
MBB, SI);
1413 MJTI->ReplaceMBBInJumpTables(
MBB, &*FallThrough);
1423 MachineBasicBlock *PriorTBB =
nullptr, *PriorFBB =
nullptr;
1425 bool PriorUnAnalyzable =
1426 TII->analyzeBranch(PrevBB, PriorTBB, PriorFBB, PriorCond,
true);
1427 if (!PriorUnAnalyzable) {
1431 if (PriorTBB && PriorTBB == PriorFBB) {
1433 TII->removeBranch(PrevBB);
1435 if (PriorTBB !=
MBB)
1436 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1439 goto ReoptimizeBlock;
1453 <<
"From MBB: " << *
MBB);
1455 if (!PrevBB.
empty()) {
1461 while (PrevBBIter != PrevBB.
begin() && MBBIter !=
MBB->
end()
1462 && PrevBBIter->isDebugInstr() && MBBIter->isDebugInstr()) {
1463 if (!MBBIter->isIdenticalTo(*PrevBBIter))
1465 MachineInstr &DuplicateDbg = *MBBIter;
1466 ++MBBIter; -- PrevBBIter;
1480 if (PriorTBB ==
MBB && !PriorFBB) {
1481 TII->removeBranch(PrevBB);
1484 goto ReoptimizeBlock;
1489 if (PriorFBB ==
MBB) {
1491 TII->removeBranch(PrevBB);
1492 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1495 goto ReoptimizeBlock;
1501 if (PriorTBB ==
MBB) {
1503 if (!TII->reverseBranchCondition(NewPriorCond)) {
1505 TII->removeBranch(PrevBB);
1506 TII->insertBranch(PrevBB, PriorFBB,
nullptr, NewPriorCond, Dl);
1509 goto ReoptimizeBlock;
1524 bool DoTransform =
true;
1531 if (FallThrough == --MF.
end() &&
1533 DoTransform =
false;
1538 if (!TII->reverseBranchCondition(NewPriorCond)) {
1540 <<
"To make fallthrough to: " << *PriorTBB <<
"\n");
1543 TII->removeBranch(PrevBB);
1544 TII->insertBranch(PrevBB,
MBB,
nullptr, NewPriorCond, Dl);
1558 if (TII->isUnconditionalTailCall(TailCall)) {
1561 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1563 bool PredAnalyzable =
1564 !TII->analyzeBranch(*Pred, PredTBB, PredFBB, PredCond,
true);
1567 if (PredAnalyzable && !PredCond.
empty() && PredTBB ==
MBB &&
1568 PredTBB != PredFBB) {
1572 if (TII->canMakeTailCallConditional(PredCond, TailCall)) {
1576 TII->replaceBranchWithTailCall(*Pred, PredCond, TailCall);
1586 if (!PredsChanged.
empty()) {
1587 NumTailCalls += PredsChanged.
size();
1588 for (
auto &Pred : PredsChanged)
1596 if (!CurUnAnalyzable) {
1602 if (CurTBB && CurFBB && CurFBB ==
MBB && CurTBB !=
MBB) {
1604 if (!TII->reverseBranchCondition(NewCond)) {
1606 TII->removeBranch(*
MBB);
1607 TII->insertBranch(*
MBB, CurFBB, CurTBB, NewCond, Dl);
1610 goto ReoptimizeBlock;
1616 if (CurTBB && CurCond.
empty() && !CurFBB &&
1623 TII->removeBranch(*
MBB);
1639 if (PredHasNoFallThrough || !PriorUnAnalyzable ||
1644 PriorTBB !=
MBB && PriorFBB !=
MBB) {
1647 "Bad branch analysis");
1650 assert(!PriorFBB &&
"Machine CFG out of date!");
1654 TII->removeBranch(PrevBB);
1655 TII->insertBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, PrevDl);
1660 bool DidChange =
false;
1661 bool HasBranchToSelf =
false;
1667 HasBranchToSelf =
true;
1677 assert((*SI)->isEHPad() &&
"Bad CFG");
1683 MachineBasicBlock *NewCurTBB =
nullptr, *NewCurFBB =
nullptr;
1685 bool NewCurUnAnalyzable = TII->analyzeBranch(
1686 *PMBB, NewCurTBB, NewCurFBB, NewCurCond,
true);
1687 if (!NewCurUnAnalyzable && NewCurTBB && NewCurTBB == NewCurFBB) {
1689 TII->removeBranch(*PMBB);
1691 TII->insertBranch(*PMBB, NewCurTBB,
nullptr, NewCurCond,
1701 MJTI->ReplaceMBBInJumpTables(
MBB, CurTBB);
1705 if (!HasBranchToSelf)
return MadeChange;
1711 TII->insertBranch(*
MBB, CurTBB,
nullptr, CurCond, Dl);
1729 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1732 !TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond,
true) &&
1733 (PredTBB ==
MBB || PredFBB ==
MBB) &&
1734 (!CurFallsThru || !CurTBB || !CurFBB) &&
1749 TII->insertBranch(*
MBB, NextBB,
nullptr, CurCond,
DebugLoc());
1753 goto ReoptimizeBlock;
1758 if (!CurFallsThru) {
1761 if (!CurUnAnalyzable) {
1762 for (MachineBasicBlock *SuccBB : {CurFBB, CurTBB}) {
1771 if (SuccBB !=
MBB && &*SuccPrev !=
MBB &&
1772 !SuccPrev->canFallThrough()) {
1775 goto ReoptimizeBlock;
1801 MachineBasicBlock *PrevTBB =
nullptr, *PrevFBB =
nullptr;
1804 if (FallThrough != MF.
end() && !FallThrough->isEHPad() &&
1805 !FallThrough->isInlineAsmBrIndirectTarget() &&
1806 !TII->analyzeBranch(PrevBB, PrevTBB, PrevFBB, PrevCond,
true) &&
1822bool BranchFolder::HoistCommonCode(MachineFunction &MF) {
1823 bool MadeChange =
false;
1825 MadeChange |= HoistCommonCodeInSuccs(&
MBB);
1835 if (SuccBB != TrueBB)
1840template <
class Container>
1843 if (
Reg.isPhysical()) {
1865 if (!
TII->isUnpredicatedTerminator(*
Loc))
1906 if (!MO.isReg() || MO.isUse())
1927 bool DontMoveAcrossStore =
true;
1928 if (!PI->isSafeToMove(DontMoveAcrossStore) ||
TII->isPredicated(*PI))
1943 if (
Reg.isPhysical()) {
1955bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *
MBB) {
1956 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
1974 SmallSet<Register, 4>
Uses, Defs;
1980 bool HasDups =
false;
1981 SmallSet<Register, 4> ActiveDefsSet, AllDefsSet;
1987 while (TIB != TIE && FIB != FIE) {
1991 if (TIB == TIE || FIB == FIE)
1997 if (TII->isPredicated(*TIB))
2001 if (!TII->isSafeToMove(*TIB,
TBB, MF))
2006 for (MachineOperand &MO : TIB->operands()) {
2008 if (MO.isRegMask()) {
2025 if (Defs.
count(
Reg) && !MO.isDead()) {
2040 }
else if (!ActiveDefsSet.
count(
Reg)) {
2047 if (MO.isKill() &&
Uses.count(
Reg))
2050 MO.setIsKill(
false);
2056 bool DontMoveAcrossStore =
true;
2057 if (!TIB->isSafeToMove(DontMoveAcrossStore))
2061 for (
const MachineOperand &MO : TIB->all_uses()) {
2071 for (MCRegAliasIterator AI(
Reg, TRI,
true); AI.isValid(); ++AI)
2072 ActiveDefsSet.
erase(*AI);
2079 for (
const MachineOperand &MO : TIB->all_defs()) {
2106 MachineInstrBuilder MIRBuilder(*
MBB->
getParent(), Loc);
2108 assert(DI->isDebugInstr() &&
"Expected a debug instruction");
2109 if (DI->isDebugRef()) {
2110 const TargetInstrInfo *TII =
2112 const MCInstrDesc &DBGV = TII->
get(TargetOpcode::DBG_VALUE);
2114 DI->getDebugVariable(), DI->getDebugExpression());
2119 if (DI->isDebugPHI()) {
2120 DI->eraseFromParent();
2124 if (!DI->isDebugLabel())
2125 DI->setDebugValueUndef();
2126 DI->moveBefore(&*Loc);
2138 while (FI != FE && FI->isDebugInstr())
2139 HoistAndKillDbgInstr(FI++);
2142 if (TI->isDebugInstr()) {
2143 HoistAndKillDbgInstr(TI);
2148 assert(FI != FE &&
"Unexpected end of FBB range");
2151 assert(!TI->isPseudoProbe() &&
"Unexpected pseudo probe in range");
2155 "Expected non-debug lockstep");
2160 TI->moveBefore(&*Loc);
2165 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 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.
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()