54#define DEBUG_TYPE "basicblock-utils"
58 cl::desc(
"Set the maximum path length when checking whether a basic block "
59 "is followed by a block that either has a terminating "
60 "deoptimizing call or is terminated with an unreachable"));
65 bool KeepOneInputPHIs) {
66 for (
auto *BB : BBs) {
71 Succ->removePredecessor(BB, KeepOneInputPHIs);
72 if (Updates && UniqueSuccessors.
insert(Succ).second)
73 Updates->
push_back({DominatorTree::Delete, BB, Succ});
77 while (!BB->empty()) {
86 BB->back().eraseFromParent();
90 isa<UnreachableInst>(BB->getTerminator()) &&
91 "The successor list of BB isn't empty before "
92 "applying corresponding DTU updates.");
97 bool KeepOneInputPHIs) {
102 bool KeepOneInputPHIs) {
106 assert(Dead.size() == BBs.
size() &&
"Duplicating blocks?");
107 for (
auto *BB : Dead)
109 assert(Dead.count(Pred) &&
"All predecessors must be dead!");
122 BB->eraseFromParent();
126 bool KeepOneInputPHIs) {
134 std::vector<BasicBlock*> DeadBlocks;
136 if (!Reachable.
count(&BB))
137 DeadBlocks.push_back(&BB);
142 return !DeadBlocks.empty();
147 if (!isa<PHINode>(BB->
begin()))
151 if (PN->getIncomingValue(0) != PN)
152 PN->replaceAllUsesWith(PN->getIncomingValue(0));
159 PN->eraseFromParent();
172 bool Changed =
false;
173 for (
unsigned i = 0, e = PHIs.
size(); i != e; ++i)
174 if (
PHINode *PN = dyn_cast_or_null<PHINode>(PHIs[i].
operator Value*()))
183 bool PredecessorWithTwoSuccessors,
190 if (!PredBB)
return false;
193 if (PredBB == BB)
return false;
208 unsigned FallThruPath;
209 if (PredecessorWithTwoSuccessors) {
210 if (!(PredBB_BI = dyn_cast<BranchInst>(PTI)))
216 FallThruPath = PredBB_BI->
getSuccessor(0) == BB ? 0 : 1;
229 if (isa<PHINode>(BB->
front())) {
231 if (!isa<PHINode>(PN.getIncomingValue(0)) ||
232 cast<PHINode>(PN.getIncomingValue(0))->getParent() != BB)
233 IncomingValues.
push_back(PN.getIncomingValue(0));
238 assert(!DTU &&
"cannot use both DT and DTU for updates");
242 assert(BBNode &&
"PredNode unreachable but BBNode reachable?");
244 C->setIDom(PredNode);
249 std::vector<DominatorTree::UpdateType> Updates;
251 assert(!DT &&
"cannot use both DT and DTU for updates");
256 Updates.reserve(Updates.size() + 2 *
succ_size(BB) + 1);
265 if (!SuccsOfPredBB.
contains(SuccOfBB))
266 if (SeenSuccs.
insert(SuccOfBB).second)
267 Updates.push_back({DominatorTree::Insert, PredBB, SuccOfBB});
270 if (SeenSuccs.
insert(SuccOfBB).second)
271 Updates.push_back({DominatorTree::Delete, BB, SuccOfBB});
272 Updates.push_back({DominatorTree::Delete, PredBB, BB});
292 if (PredecessorWithTwoSuccessors) {
329 "successors should have been transferred to PredBB");
342 assert(!MergeBlocks.
empty() &&
"MergeBlocks should not be empty");
344 bool BlocksHaveBeenMerged =
false;
345 while (!MergeBlocks.
empty()) {
348 if (Dest && (!L || L->contains(Dest))) {
353 "Expecting BB to be unique predecessor of the Dest block");
354 MergeBlocks.
erase(Dest);
355 BlocksHaveBeenMerged =
true;
357 MergeBlocks.
erase(BB);
359 MergeBlocks.
erase(BB);
361 return BlocksHaveBeenMerged;
391 if (isa<DbgLabelRecord>(DR)) {
401 if (DVR.
getType() == DbgVariableRecord::LocationType::Declare) {
413 auto R = VariableSet.
insert(Key);
435 for (
auto &DVR : ToBeRemoved)
436 DVR->eraseFromParent();
438 return !ToBeRemoved.
empty();
450 DVI->getExpression(),
451 DVI->getDebugLoc()->getInlinedAt());
452 auto R = VariableSet.
insert(Key);
458 if (
auto *DAI = dyn_cast<DbgAssignIntrinsic>(DVI)) {
477 for (
auto &Instr : ToBeRemoved)
478 Instr->eraseFromParent();
480 return !ToBeRemoved.
empty();
508 for (
auto &
I : *BB) {
510 if (DVR.getType() == DbgVariableRecord::LocationType::Declare)
513 DVR.getDebugLoc()->getInlinedAt());
514 auto VMI = VariableMap.
find(Key);
517 bool IsDbgValueKind =
523 if (VMI == VariableMap.
end() || VMI->second.first != Values ||
524 VMI->second.second != DVR.getExpression()) {
526 VariableMap[Key] = {Values, DVR.getExpression()};
528 VariableMap[Key] = {Values,
nullptr};
539 for (
auto *DVR : ToBeRemoved)
540 DVR->eraseFromParent();
542 return !ToBeRemoved.
empty();
553 DVR.getDebugLoc().getInlinedAt());
558 for (
auto &
I : *BB) {
560 if (!DVR.isDbgValue() && !DVR.isDbgAssign())
562 bool IsDbgValueKind =
565 if (!SeenDefForAggregate.
contains(Aggregate)) {
566 bool IsKill = DVR.isKillLocation() && IsDbgValueKind;
568 SeenDefForAggregate.
insert(Aggregate);
569 }
else if (DVR.isDbgAssign()) {
577 DVR->eraseFromParent();
579 return !ToBeRemoved.
empty();
590 for (
auto &
I : *BB) {
593 DVI->getDebugLoc()->getInlinedAt());
594 auto VMI = VariableMap.
find(Key);
595 auto *DAI = dyn_cast<DbgAssignIntrinsic>(DVI);
603 if (VMI == VariableMap.
end() || VMI->second.first != Values ||
604 VMI->second.second != DVI->getExpression()) {
609 VariableMap[Key] = {Values, DVI->getExpression()};
611 VariableMap[Key] = {Values,
nullptr};
622 for (
auto &Instr : ToBeRemoved)
623 Instr->eraseFromParent();
625 return !ToBeRemoved.
empty();
657 DVI->getDebugLoc()->getInlinedAt());
662 for (
auto &
I : *BB) {
666 auto *DAI = dyn_cast<DbgAssignIntrinsic>(DVI);
669 if (!SeenDefForAggregate.
contains(Aggregate)) {
672 SeenDefForAggregate.
insert(Aggregate);
680 DAI->eraseFromParent();
682 return !ToBeRemoved.
empty();
686 bool MadeChanges =
false;
713 I.replaceAllUsesWith(V);
716 if (
I.hasName() && !V->hasName())
720 BI = BI->eraseFromParent();
725 assert(
I->getParent() ==
nullptr &&
726 "ReplaceInstWithInst: Instruction already inserted into basic block!");
730 if (!
I->getDebugLoc())
731 I->setDebugLoc(BI->getDebugLoc());
748 VisitedBlocks.
insert(BB).second) {
764 const Twine &BBName) {
787 assert(SP == BB &&
"CFG broken");
796 "Should have a single succ!");
801 if (
auto *
II = dyn_cast<InvokeInst>(TI))
802 II->setUnwindDest(Succ);
803 else if (
auto *CS = dyn_cast<CatchSwitchInst>(TI))
804 CS->setUnwindDest(Succ);
805 else if (
auto *CR = dyn_cast<CleanupReturnInst>(TI))
806 CR->setUnwindDest(Succ);
825 if (PN.getIncomingBlock(BBIdx) != OldPred)
826 BBIdx = PN.getBasicBlockIndex(OldPred);
828 assert(BBIdx != -1 &&
"Invalid PHI Index!");
829 PN.setIncomingBlock(BBIdx, NewPred);
835 PHINode *LandingPadReplacement,
837 const Twine &BBName) {
840 if (!LandingPadReplacement && !PadInst->
isEHPad())
848 if (
Options.PreserveLoopSimplify && LI) {
849 if (
Loop *BBLoop = LI->getLoopFor(BB)) {
863 if (LI->getLoopFor(
P) != BBLoop) {
886 if (LandingPadReplacement) {
887 auto *NewLP = OriginalPad->
clone();
889 NewLP->insertBefore(Terminator);
892 Value *ParentPad =
nullptr;
893 if (
auto *FuncletPad = dyn_cast<FuncletPadInst>(PadInst))
894 ParentPad = FuncletPad->getParentPad();
895 else if (
auto *CatchSwitch = dyn_cast<CatchSwitchInst>(PadInst))
896 ParentPad = CatchSwitch->getParentPad();
897 else if (
auto *CleanupPad = dyn_cast<CleanupPadInst>(PadInst))
898 ParentPad = CleanupPad->getParentPad();
899 else if (
auto *LandingPad = dyn_cast<LandingPadInst>(PadInst))
900 ParentPad = LandingPad->getParent();
917 Updates.
push_back({DominatorTree::Insert, BB, NewBB});
918 Updates.
push_back({DominatorTree::Insert, NewBB, Succ});
919 Updates.
push_back({DominatorTree::Delete, BB, Succ});
925 MSSAU->applyUpdates(Updates, *DT);
927 MSSAU->getMemorySSA()->verifyMemorySSA();
932 if (
Loop *BBLoop = LI->getLoopFor(BB)) {
935 if (
Loop *SuccLoop = LI->getLoopFor(Succ)) {
936 if (BBLoop == SuccLoop) {
938 SuccLoop->addBasicBlockToLoop(NewBB, *LI);
939 }
else if (BBLoop->contains(SuccLoop)) {
941 BBLoop->addBasicBlockToLoop(NewBB, *LI);
942 }
else if (SuccLoop->contains(BBLoop)) {
944 SuccLoop->addBasicBlockToLoop(NewBB, *LI);
950 assert(SuccLoop->getHeader() == Succ &&
951 "Should not create irreducible loops!");
952 if (
Loop *
P = SuccLoop->getParentLoop())
953 P->addBasicBlockToLoop(NewBB, *LI);
959 if (!BBLoop->contains(Succ)) {
960 assert(!BBLoop->contains(NewBB) &&
961 "Split point for loop exit is contained in loop!");
968 if (!LoopPreds.
empty()) {
970 Succ, LoopPreds,
"split", DT, LI, MSSAU,
Options.PreserveLCSSA);
986 "SplitBB has non-PHI nodes!");
990 int Idx = PN.getBasicBlockIndex(SplitBB);
991 assert(
Idx >= 0 &&
"Invalid Block Index");
992 Value *V = PN.getIncomingValue(
Idx);
996 if (
const PHINode *VP = dyn_cast<PHINode>(V))
997 if (VP->getParent() == SplitBB)
1010 PN.setIncomingValue(
Idx, NewPN);
1017 unsigned NumBroken = 0;
1033 DomTreeUpdater LocalDTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);
1035 DTU ? DTU : (DT ? &LocalDTU :
nullptr), LI, MSSAU,
1039 while (isa<PHINode>(SplitIt) || SplitIt->isEHPad()) {
1041 assert(SplitIt != SplitPt->getParent()->end());
1043 std::string
Name = BBName.
str();
1051 L->addBasicBlockToLoop(New, *LI);
1057 Updates.
push_back({DominatorTree::Insert, Old, New});
1060 if (UniqueSuccessorsOfOld.
insert(SuccessorOfOld).second) {
1061 Updates.
push_back({DominatorTree::Insert, New, SuccessorOfOld});
1062 Updates.
push_back({DominatorTree::Delete, Old, SuccessorOfOld});
1069 std::vector<DomTreeNode *> Children(OldNode->begin(), OldNode->end());
1088 return SplitBlockImpl(Old, SplitPt,
nullptr, DT, LI, MSSAU, BBName,
1095 return SplitBlockImpl(Old, SplitPt, DTU,
nullptr, LI, MSSAU, BBName,
1102 const Twine &BBName) {
1105 while (isa<PHINode>(SplitIt) || SplitIt->isEHPad())
1107 std::string
Name = BBName.
str();
1116 L->addBasicBlockToLoop(New, *LI);
1123 DTUpdates.
push_back({DominatorTree::Insert, New, Old});
1126 if (UniquePredecessorsOfOld.
insert(PredecessorOfOld).second) {
1127 DTUpdates.
push_back({DominatorTree::Insert, PredecessorOfOld, New});
1128 DTUpdates.
push_back({DominatorTree::Delete, PredecessorOfOld, Old});
1150 bool PreserveLCSSA,
bool &HasLoopExit) {
1164 Updates.
push_back({DominatorTree::Insert, NewBB, OldBB});
1166 for (
auto *Pred : Preds)
1167 if (UniquePreds.
insert(Pred).second) {
1168 Updates.
push_back({DominatorTree::Insert, Pred, NewBB});
1169 Updates.
push_back({DominatorTree::Delete, Pred, OldBB});
1193 assert(DT &&
"DT should be available to update LoopInfo!");
1198 bool IsLoopEntry = !!L;
1199 bool SplitMakesNewLoopHeader =
false;
1211 if (!PL->contains(OldBB))
1218 if (L->contains(Pred))
1219 IsLoopEntry =
false;
1221 SplitMakesNewLoopHeader =
true;
1233 Loop *InnermostPredLoop =
nullptr;
1238 while (PredLoop && !PredLoop->contains(OldBB))
1242 if (PredLoop && PredLoop->contains(OldBB) &&
1243 (!InnermostPredLoop ||
1244 InnermostPredLoop->
getLoopDepth() < PredLoop->getLoopDepth()))
1245 InnermostPredLoop = PredLoop;
1249 if (InnermostPredLoop)
1252 L->addBasicBlockToLoop(NewBB, *LI);
1253 if (SplitMakesNewLoopHeader)
1254 L->moveToHeader(NewBB);
1270 Value *InVal =
nullptr;
1313 if (PredSet.
count(IncomingBB)) {
1342 std::string NewName = std::string(Suffix) +
".split-lp";
1345 DTU, DT, LI, MSSAU, PreserveLCSSA);
1369 OldLatch = L->getLoopLatch();
1378 assert(!isa<IndirectBrInst>(Pred->getTerminator()) &&
1379 "Cannot split an edge from an IndirectBrInst");
1380 Pred->getTerminator()->replaceSuccessorWith(BB, NewBB);
1387 if (Preds.
empty()) {
1394 bool HasLoopExit =
false;
1398 if (!Preds.
empty()) {
1405 if (NewLatch != OldLatch) {
1423 bool PreserveLCSSA) {
1425 MSSAU, PreserveLCSSA);
1432 bool PreserveLCSSA) {
1434 nullptr, LI, MSSAU, PreserveLCSSA);
1460 assert(!isa<IndirectBrInst>(Pred->getTerminator()) &&
1461 "Cannot split an edge from an IndirectBrInst");
1462 Pred->getTerminator()->replaceUsesOfWith(OrigBB, NewBB1);
1465 bool HasLoopExit =
false;
1467 PreserveLCSSA, HasLoopExit);
1477 if (Pred == NewBB1)
continue;
1479 "Cannot split an edge from an IndirectBrInst");
1485 if (!NewBB2Preds.
empty()) {
1498 NewBB2Pred->getTerminator()->replaceUsesOfWith(OrigBB, NewBB2);
1501 HasLoopExit =
false;
1503 PreserveLCSSA, HasLoopExit);
1523 "Split cannot be applied if LPad is token type. Otherwise an "
1524 "invalid PHINode of token type would be created.");
1541 const char *Suffix1,
const char *Suffix2,
1545 bool PreserveLCSSA) {
1547 NewBBs, DTU,
nullptr, LI, MSSAU,
1564 if (
BitCastInst *BCI = dyn_cast<BitCastInst>(V)) {
1567 V = BCI->getOperand(0);
1568 NewBC = BCI->
clone();
1575 V = EVI->getOperand(0);
1576 NewEV = EVI->
clone();
1586 if (
PHINode *PN = dyn_cast<PHINode>(V)) {
1587 if (PN->getParent() == BB) {
1589 NewEV->
setOperand(0, PN->getIncomingValueForBlock(Pred));
1591 NewBC->
setOperand(0, PN->getIncomingValueForBlock(Pred));
1593 Op = PN->getIncomingValueForBlock(Pred);
1604 DTU->
applyUpdates({{DominatorTree::Delete, Pred, BB}});
1606 return cast<ReturnInst>(NewRet);
1616 Cond, SplitBefore, &ThenBlock,
nullptr,
1618 false, BranchWeights, DTU, LI);
1629 Cond, SplitBefore,
nullptr, &ElseBlock,
1631 Unreachable, BranchWeights, DTU, LI);
1643 Cond, SplitBefore, &ThenBlock, &ElseBlock,
false,
1644 false, BranchWeights, DTU, LI);
1652 BasicBlock **ElseBlock,
bool UnreachableThen,
bool UnreachableElse,
1654 assert((ThenBlock || ElseBlock) &&
1655 "At least one branch block must be created");
1656 assert((!UnreachableThen || !UnreachableElse) &&
1657 "Split block tail must be reachable");
1664 Updates.
reserve(4 + 2 * UniqueOrigSuccessors.
size());
1671 bool ThenToTailEdge =
false;
1672 bool ElseToTailEdge =
false;
1691 BB->getTerminator()->
setDebugLoc(SplitBefore->getDebugLoc());
1697 handleBlock(ThenBlock, UnreachableThen, TrueBlock, ThenToTailEdge);
1698 handleBlock(ElseBlock, UnreachableElse, FalseBlock, ElseToTailEdge);
1703 HeadNewTerm->
setMetadata(LLVMContext::MD_prof, BranchWeights);
1707 Updates.
emplace_back(DominatorTree::Insert, Head, TrueBlock);
1708 Updates.
emplace_back(DominatorTree::Insert, Head, FalseBlock);
1713 for (
BasicBlock *UniqueOrigSuccessor : UniqueOrigSuccessors)
1715 for (
BasicBlock *UniqueOrigSuccessor : UniqueOrigSuccessors)
1716 Updates.
emplace_back(DominatorTree::Delete, Head, UniqueOrigSuccessor);
1723 L->addBasicBlockToLoop(TrueBlock, *LI);
1725 L->addBasicBlockToLoop(FalseBlock, *LI);
1726 L->addBasicBlockToLoop(
Tail, *LI);
1731std::pair<Instruction*, Value*>
1737 auto *Ty =
End->getType();
1739 const unsigned Bitwidth =
DL.getTypeSizeInBits(Ty);
1744 Builder.
CreateAdd(
IV, ConstantInt::get(Ty, 1),
IV->getName() +
".next",
1745 true, Bitwidth != 2);
1747 IV->getName() +
".check");
1752 IV->addIncoming(ConstantInt::get(Ty, 0), LoopPred);
1753 IV->addIncoming(IVNext, LoopBody);
1764 if (EC.isScalable()) {
1767 auto [BodyIP, Index] =
1775 unsigned Num = EC.getFixedValue();
1776 for (
unsigned Idx = 0;
Idx < Num; ++
Idx) {
1778 Func(IRB, ConstantInt::get(IndexTy,
Idx));
1789 if (!isa<ConstantInt>(EVL)) {
1796 unsigned Num = cast<ConstantInt>(EVL)->getZExtValue();
1797 for (
unsigned Idx = 0;
Idx < Num; ++
Idx) {
1799 Func(IRB, ConstantInt::get(Ty,
Idx));
1830 if (!Pred1Br || !Pred2Br)
1882 if (!BI)
return nullptr;
1899 if (NewCond->
hasOneUse() && isa<CmpInst>(NewCond)) {
1900 CmpInst *CI = cast<CmpInst>(NewCond);
1910 for (
auto &BB :
F) {
1911 auto *Term = BB.getTerminator();
1912 if (!(isa<ReturnInst>(Term) || isa<UnreachableInst>(Term) ||
1913 isa<BranchInst>(Term)))
1922 if (!Src.getParent()->isPresplitCoroutine())
1924 if (
auto *SW = dyn_cast<SwitchInst>(Src.getTerminator()))
1925 if (
auto *
Intr = dyn_cast<IntrinsicInst>(SW->getCondition()))
1926 return Intr->getIntrinsicID() == Intrinsic::coro_suspend &&
1927 SW->getDefaultDest() == &Dest;
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static BasicBlock * SplitBlockPredecessorsImpl(BasicBlock *BB, ArrayRef< BasicBlock * > Preds, const char *Suffix, DomTreeUpdater *DTU, DominatorTree *DT, LoopInfo *LI, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
static bool removeRedundantDbgInstrsUsingBackwardScan(BasicBlock *BB)
static BasicBlock * SplitBlockImpl(BasicBlock *Old, BasicBlock::iterator SplitPt, DomTreeUpdater *DTU, DominatorTree *DT, LoopInfo *LI, MemorySSAUpdater *MSSAU, const Twine &BBName, bool Before)
static void UpdatePHINodes(BasicBlock *OrigBB, BasicBlock *NewBB, ArrayRef< BasicBlock * > Preds, BranchInst *BI, bool HasLoopExit)
Update the PHI nodes in OrigBB to include the values coming from NewBB.
static bool removeUndefDbgAssignsFromEntryBlock(BasicBlock *BB)
Remove redundant undef dbg.assign intrinsic from an entry block using a forward scan.
static bool DbgVariableRecordsRemoveRedundantDbgInstrsUsingForwardScan(BasicBlock *BB)
Remove redundant dbg.value instructions using a forward scan.
static void UpdateAnalysisInformation(BasicBlock *OldBB, BasicBlock *NewBB, ArrayRef< BasicBlock * > Preds, DomTreeUpdater *DTU, DominatorTree *DT, LoopInfo *LI, MemorySSAUpdater *MSSAU, bool PreserveLCSSA, bool &HasLoopExit)
Update DominatorTree, LoopInfo, and LCCSA analysis information.
static bool DbgVariableRecordsRemoveUndefDbgAssignsFromEntryBlock(BasicBlock *BB)
static bool DbgVariableRecordsRemoveRedundantDbgInstrsUsingBackwardScan(BasicBlock *BB)
Remove redundant instructions within sequences of consecutive dbg.value instructions.
static bool removeRedundantDbgInstrsUsingForwardScan(BasicBlock *BB)
static void SplitLandingPadPredecessorsImpl(BasicBlock *OrigBB, ArrayRef< BasicBlock * > Preds, const char *Suffix1, const char *Suffix2, SmallVectorImpl< BasicBlock * > &NewBBs, DomTreeUpdater *DTU, DominatorTree *DT, LoopInfo *LI, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
static cl::opt< unsigned > MaxDeoptOrUnreachableSuccessorCheckDepth("max-deopt-or-unreachable-succ-check-depth", cl::init(8), cl::Hidden, cl::desc("Set the maximum path length when checking whether a basic block " "is followed by a block that either has a terminating " "deoptimizing call or is terminated with an unreachable"))
BlockVerifier::State From
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
uint64_t IntrinsicInst * II
const SmallVectorImpl< MachineOperand > & Cond
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
static const uint32_t IV[8]
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
bool empty() const
empty - Check if the array is empty.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
const LandingPadInst * getLandingPadInst() const
Return the landingpad instruction associated with the landing pad.
const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
const Instruction * getFirstNonPHI() const
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
const Instruction & front() const
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
bool isEntryBlock() const
Return true if this is the entry block of the containing function.
BasicBlock * splitBasicBlock(iterator I, const Twine &BBName="", bool Before=false)
Split the basic block into two basic blocks at the specified instruction.
const BasicBlock * getUniqueSuccessor() const
Return the successor of this block if it has a unique successor.
const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const CallInst * getTerminatingDeoptimizeCall() const
Returns the call instruction calling @llvm.experimental.deoptimize prior to the terminating return in...
const BasicBlock * getUniquePredecessor() const
Return the predecessor of this block if it has a unique predecessor block.
const BasicBlock * getSingleSuccessor() const
Return the successor of this block if it has a single successor.
const Function * getParent() const
Return the enclosing method, or null if none.
const Instruction * getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
InstListType::iterator iterator
Instruction iterators...
LLVMContext & getContext() const
Get the context in which this basic block lives.
bool IsNewDbgInfoFormat
Flag recording whether or not this block stores debug-info in the form of intrinsic instructions (fal...
bool isLandingPad() const
Return true if this basic block is a landing pad.
bool isEHPad() const
Return true if this basic block is an exception handling block.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
bool canSplitPredecessors() const
void splice(BasicBlock::iterator ToIt, BasicBlock *FromBB)
Transfer all instructions from FromBB to this basic block at ToIt.
const Instruction & back() const
void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs=false)
Update PHI nodes in this BasicBlock before removal of predecessor Pred.
This class represents a no-op cast from one type to another.
Conditional or Unconditional Branch instruction.
void setCondition(Value *V)
void swapSuccessors()
Swap the successors of this branch instruction.
bool isConditional() const
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
BasicBlock * getSuccessor(unsigned i) const
bool isUnconditional() const
void setSuccessor(unsigned idx, BasicBlock *NewSucc)
Value * getCondition() const
static CleanupPadInst * Create(Value *ParentPad, ArrayRef< Value * > Args={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupReturnInst * Create(Value *CleanupPad, BasicBlock *UnwindBB=nullptr, InsertPosition InsertBefore=nullptr)
This class is the base class for the comparison instructions.
void setPredicate(Predicate P)
Set the predicate for this instruction to the specified value.
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
This class represents an Operation in the Expression.
This represents the llvm.dbg.assign instruction.
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
This represents the llvm.dbg.value instruction.
bool isKillLocation() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LocationType getType() const
DIExpression * getExpression() const
DILocalVariable * getVariable() const
Identifies a unique instance of a variable.
iterator find(const_arg_type_t< KeyT > Val)
Implements a dense probed hash-table based set.
iterator_range< iterator > children()
void deleteBB(BasicBlock *DelBB)
Delete DelBB.
DomTreeNodeBase< NodeT > * getRootNode()
getRootNode - This returns the entry node for the CFG of the function.
void changeImmediateDominator(DomTreeNodeBase< NodeT > *N, DomTreeNodeBase< NodeT > *NewIDom)
changeImmediateDominator - This method is used to update the dominator tree information when a node's...
DomTreeNodeBase< NodeT > * addNewBlock(NodeT *BB, NodeT *DomBB)
Add a new node to the dominator tree information.
void splitBlock(NodeT *NewBB)
splitBlock - BB is split and now it has one successor.
DomTreeNodeBase< NodeT > * setNewRoot(NodeT *BB)
Add a new node to the forward dominator tree and make it a new root.
void eraseNode(NodeT *BB)
eraseNode - Removes a node from the dominator tree.
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
bool isReachableFromEntry(const Use &U) const
Provide an overload for a Use.
DomTreeT & getDomTree()
Flush DomTree updates and return DomTree.
void applyUpdates(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
void flush()
Apply all pending updates to available trees and flush all BasicBlocks awaiting deletion.
bool hasDomTree() const
Returns true if it holds a DomTreeT.
void recalculate(FuncT &F)
Notify DTU that the entry block was replaced.
Module * getParent()
Get the module that this global value is contained inside of...
Common base class shared among various IRBuilders.
PHINode * CreatePHI(Type *Ty, unsigned NumReservedValues, const Twine &Name="")
Value * CreateNot(Value *V, const Twine &Name="")
Value * CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name="")
BranchInst * CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False, MDNode *BranchWeights=nullptr, MDNode *Unpredictable=nullptr)
Create a conditional 'br Cond, TrueDest, FalseDest' instruction.
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Value * CreateElementCount(Type *DstType, ElementCount EC)
Create an expression which evaluates to the number of elements in EC at runtime.
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
void moveBeforePreserving(Instruction *MovePos)
Perform a moveBefore operation, while signalling that the caller intends to preserve the original ord...
unsigned getNumSuccessors() const LLVM_READONLY
Return the number of successors that this instruction has.
void insertBefore(Instruction *InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified instruction.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
bool isEHPad() const
Return true if the instruction is a variety of EH-block.
InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
bool mayHaveSideEffects() const LLVM_READONLY
Return true if the instruction may have side effects.
void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
bool isSpecialTerminator() const
InstListType::iterator insertInto(BasicBlock *ParentBB, InstListType::iterator It)
Inserts an unlinked instruction into ParentBB at position It and returns the iterator of the inserted...
This is an important class for using LLVM in a threaded context.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
BlockT * getLoopLatch() const
If there is a single latch block for this loop, return it.
unsigned getLoopDepth() const
Return the nesting level of this loop.
void addBasicBlockToLoop(BlockT *NewBB, LoopInfoBase< BlockT, LoopT > &LI)
This method is used by other analyses to update loop information.
LoopT * getParentLoop() const
Return the parent loop if it exists or nullptr for top level loops.
void removeBlock(BlockT *BB)
This method completely removes BB from all data structures, including all of the Loop objects it is n...
bool isLoopHeader(const BlockT *BB) const
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Represents a single loop in the control flow graph.
Provides a lazy, caching interface for making common memory aliasing information queries,...
void invalidateCachedPredecessors()
Clears the PredIteratorCache info.
void removeInstruction(Instruction *InstToRemove)
Removes an instruction from the dependence analysis, updating the dependence of instructions that pre...
MemorySSA * getMemorySSA() const
Get handle on MemorySSA.
void moveAllAfterSpliceBlocks(BasicBlock *From, BasicBlock *To, Instruction *Start)
From block was spliced into From and To.
void applyUpdates(ArrayRef< CFGUpdate > Updates, DominatorTree &DT, bool UpdateDTFirst=false)
Apply CFG updates, analogous with the DT edge updates.
void moveAllAfterMergeBlocks(BasicBlock *From, BasicBlock *To, Instruction *Start)
From block was merged into To.
void moveToPlace(MemoryUseOrDef *What, BasicBlock *BB, MemorySSA::InsertionPlace Where)
void wireOldPredecessorsToNewImmediatePredecessor(BasicBlock *Old, BasicBlock *New, ArrayRef< BasicBlock * > Preds, bool IdenticalEdgesWereMerged=true)
A new empty BasicBlock (New) now branches directly to Old.
void verifyMemorySSA(VerificationLevel=VerificationLevel::Fast) const
Verify that MemorySSA is self consistent (IE definitions dominate all uses, uses appear in the right ...
MemoryUseOrDef * getMemoryAccess(const Instruction *I) const
Given a memory Mod/Ref'ing instruction, get the MemorySSA access associated with it.
Class that has the common methods + fields of memory uses/defs.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
void removeIncomingValueIf(function_ref< bool(unsigned)> Predicate, bool DeletePHIIfEmpty=true)
Remove all incoming values for which the predicate returns true.
Value * removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty=true)
Remove an incoming value.
Value * getIncomingValueForBlock(const BasicBlock *BB) const
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Return a value (possibly void), from a function.
Implements a dense probed hash-table based set with some number of buckets stored inline.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Provides information about what library functions are available for the current target.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
std::string str() const
Return the twine contents as a std::string.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isTokenTy() const
Return true if this is 'token'.
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
void setOperand(unsigned i, Value *Val)
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
void setName(const Twine &Name)
Change the name of the value.
bool hasOneUse() const
Return true if there is exactly one use of this value.
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
StringRef getName() const
Return a constant reference to the value's name.
void takeName(Value *V)
Transfer the name from V to this value.
std::pair< iterator, bool > insert(const ValueT &V)
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
const ParentTy * getParent() const
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
@ C
The default llvm calling convention, compatible with C.
AssignmentInstRange getAssignmentInsts(DIAssignID *ID)
Return a range of instructions (typically just one) that have ID as an attachment.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
void ReplaceInstWithInst(BasicBlock *BB, BasicBlock::iterator &BI, Instruction *I)
Replace the instruction specified by BI with the instruction specified by I.
iterator_range< df_ext_iterator< T, SetTy > > depth_first_ext(const T &G, SetTy &S)
bool RemoveRedundantDbgInstrs(BasicBlock *BB)
Try to remove redundant dbg.value instructions from given basic block.
bool succ_empty(const Instruction *I)
bool IsBlockFollowedByDeoptOrUnreachable(const BasicBlock *BB)
Check if we can prove that all paths starting from this block converge to a block that either has a @...
BranchInst * GetIfCondition(BasicBlock *BB, BasicBlock *&IfTrue, BasicBlock *&IfFalse)
Check whether BB is the merge point of a if-region.
unsigned GetSuccessorNumber(const BasicBlock *BB, const BasicBlock *Succ)
Search for the specified successor of basic block BB and return its position in the terminator instru...
auto pred_end(const MachineBasicBlock *BB)
void detachDeadBlocks(ArrayRef< BasicBlock * > BBs, SmallVectorImpl< DominatorTree::UpdateType > *Updates, bool KeepOneInputPHIs=false)
Replace contents of every block in BBs with single unreachable instruction.
bool hasOnlySimpleTerminator(const Function &F)
auto successors(const MachineBasicBlock *BB)
ReturnInst * FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB, BasicBlock *Pred, DomTreeUpdater *DTU=nullptr)
This method duplicates the specified return instruction into a predecessor which ends in an unconditi...
BasicBlock * splitBlockBefore(BasicBlock *Old, BasicBlock::iterator SplitPt, DomTreeUpdater *DTU, LoopInfo *LI, MemorySSAUpdater *MSSAU, const Twine &BBName="")
Split the specified block at the specified instruction SplitPt.
Instruction * SplitBlockAndInsertIfElse(Value *Cond, BasicBlock::iterator SplitBefore, bool Unreachable, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, BasicBlock *ElseBlock=nullptr)
Similar to SplitBlockAndInsertIfThen, but the inserted block is on the false path of the branch.
auto pred_size(const MachineBasicBlock *BB)
void DeleteDeadBlock(BasicBlock *BB, DomTreeUpdater *DTU=nullptr, bool KeepOneInputPHIs=false)
Delete the specified block, which must have no predecessors.
void ReplaceInstWithValue(BasicBlock::iterator &BI, Value *V)
Replace all uses of an instruction (specified by BI) with a value, then remove and delete the origina...
BasicBlock * SplitKnownCriticalEdge(Instruction *TI, unsigned SuccNum, const CriticalEdgeSplittingOptions &Options=CriticalEdgeSplittingOptions(), const Twine &BBName="")
If it is known that an edge is critical, SplitKnownCriticalEdge can be called directly,...
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
bool DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr)
Examine each PHI in the given block and delete it if it is dead.
auto reverse(ContainerTy &&C)
void InvertBranch(BranchInst *PBI, IRBuilderBase &Builder)
bool EliminateUnreachableBlocks(Function &F, DomTreeUpdater *DTU=nullptr, bool KeepOneInputPHIs=false)
Delete all basic blocks from F that are not reachable from its entry node.
bool MergeBlockSuccessorsIntoGivenBlocks(SmallPtrSetImpl< BasicBlock * > &MergeBlocks, Loop *L=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr)
Merge block(s) sucessors, if possible.
void SplitBlockAndInsertIfThenElse(Value *Cond, BasicBlock::iterator SplitBefore, Instruction **ThenTerm, Instruction **ElseTerm, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr)
SplitBlockAndInsertIfThenElse is similar to SplitBlockAndInsertIfThen, but also creates the ElseBlock...
void SplitBlockAndInsertForEachLane(ElementCount EC, Type *IndexTy, Instruction *InsertBefore, std::function< void(IRBuilderBase &, Value *)> Func)
Utility function for performing a given action on each lane of a vector with EC elements.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
BasicBlock * ehAwareSplitEdge(BasicBlock *BB, BasicBlock *Succ, LandingPadInst *OriginalPad=nullptr, PHINode *LandingPadReplacement=nullptr, const CriticalEdgeSplittingOptions &Options=CriticalEdgeSplittingOptions(), const Twine &BBName="")
Split the edge connect the specficed blocks in the case that Succ is an Exception Handling Block.
auto succ_size(const MachineBasicBlock *BB)
SmallVector< ValueTypeFromRangeType< R >, Size > to_vector(R &&Range)
Given a range of type R, iterate the entire range and return a SmallVector with elements of the vecto...
void SplitLandingPadPredecessors(BasicBlock *OrigBB, ArrayRef< BasicBlock * > Preds, const char *Suffix, const char *Suffix2, SmallVectorImpl< BasicBlock * > &NewBBs, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, bool PreserveLCSSA=false)
This method transforms the landing pad, OrigBB, by introducing two new basic blocks into the function...
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
BasicBlock * SplitBlockPredecessors(BasicBlock *BB, ArrayRef< BasicBlock * > Preds, const char *Suffix, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, bool PreserveLCSSA=false)
This method introduces at least one new basic block into the function and moves some of the predecess...
bool VerifyMemorySSA
Enables verification of MemorySSA.
RNSuccIterator< NodeRef, BlockT, RegionT > succ_end(NodeRef Node)
void createPHIsForSplitLoopExit(ArrayRef< BasicBlock * > Preds, BasicBlock *SplitBB, BasicBlock *DestBB)
When a loop exit edge is split, LCSSA form may require new PHIs in the new exit block.
bool MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, MemoryDependenceResults *MemDep=nullptr, bool PredecessorWithTwoSuccessors=false, DominatorTree *DT=nullptr)
Attempts to merge a block into its predecessor, if possible.
bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
std::pair< Instruction *, Value * > SplitBlockAndInsertSimpleForLoop(Value *End, Instruction *SplitBefore)
Insert a for (int i = 0; i < End; i++) loop structure (with the exception that End is assumed > 0,...
DWARFExpression::Operation Op
BasicBlock * SplitCriticalEdge(Instruction *TI, unsigned SuccNum, const CriticalEdgeSplittingOptions &Options=CriticalEdgeSplittingOptions(), const Twine &BBName="")
If this edge is a critical edge, insert a new node to split the critical edge.
bool FoldSingleEntryPHINodes(BasicBlock *BB, MemoryDependenceResults *MemDep=nullptr)
We know that BB has one predecessor.
bool isCriticalEdge(const Instruction *TI, unsigned SuccNum, bool AllowIdenticalEdges=false)
Return true if the specified edge is a critical edge.
unsigned SplitAllCriticalEdges(Function &F, const CriticalEdgeSplittingOptions &Options=CriticalEdgeSplittingOptions())
Loop over all of the edges in the CFG, breaking critical edges as they are found.
void updatePhiNodes(BasicBlock *DestBB, BasicBlock *OldPred, BasicBlock *NewPred, PHINode *Until=nullptr)
Replaces all uses of OldPred with the NewPred block in all PHINodes in a block.
auto pred_begin(const MachineBasicBlock *BB)
bool isPresplitCoroSuspendExitEdge(const BasicBlock &Src, const BasicBlock &Dest)
BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="", bool Before=false)
Split the specified block at the specified instruction.
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
bool RecursivelyDeleteDeadPHINode(PHINode *PN, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr)
If the specified value is an effectively dead PHI node, due to being a def-use chain of single-use no...
Instruction * SplitBlockAndInsertIfThen(Value *Cond, BasicBlock::iterator SplitBefore, bool Unreachable, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, BasicBlock *ThenBlock=nullptr)
Split the containing block at the specified instruction - everything before SplitBefore stays in the ...
void DeleteDeadBlocks(ArrayRef< BasicBlock * > BBs, DomTreeUpdater *DTU=nullptr, bool KeepOneInputPHIs=false)
Delete the specified blocks from BB.
BasicBlock * SplitEdge(BasicBlock *From, BasicBlock *To, DominatorTree *DT=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="")
Split the edge connecting the specified blocks, and return the newly created basic block between From...
void setUnwindEdgeTo(Instruction *TI, BasicBlock *Succ)
Sets the unwind edge of an instruction to a particular successor.
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Option class for critical edge splitting.
CriticalEdgeSplittingOptions & setPreserveLCSSA()