xref: /openbsd-src/gnu/llvm/llvm/lib/IR/BasicBlock.cpp (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
109467b48Spatrick //===-- BasicBlock.cpp - Implement BasicBlock related methods -------------===//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick //
909467b48Spatrick // This file implements the BasicBlock class for the IR library.
1009467b48Spatrick //
1109467b48Spatrick //===----------------------------------------------------------------------===//
1209467b48Spatrick 
1309467b48Spatrick #include "llvm/IR/BasicBlock.h"
1409467b48Spatrick #include "SymbolTableListTraitsImpl.h"
1509467b48Spatrick #include "llvm/ADT/STLExtras.h"
16*d415bd75Srobert #include "llvm/ADT/Statistic.h"
1709467b48Spatrick #include "llvm/IR/CFG.h"
1809467b48Spatrick #include "llvm/IR/Constants.h"
1909467b48Spatrick #include "llvm/IR/Instructions.h"
2009467b48Spatrick #include "llvm/IR/IntrinsicInst.h"
2109467b48Spatrick #include "llvm/IR/LLVMContext.h"
2209467b48Spatrick #include "llvm/IR/Type.h"
2309467b48Spatrick 
2409467b48Spatrick using namespace llvm;
2509467b48Spatrick 
26*d415bd75Srobert #define DEBUG_TYPE "ir"
27*d415bd75Srobert STATISTIC(NumInstrRenumberings, "Number of renumberings across all blocks");
28*d415bd75Srobert 
getValueSymbolTable()2909467b48Spatrick ValueSymbolTable *BasicBlock::getValueSymbolTable() {
3009467b48Spatrick   if (Function *F = getParent())
3109467b48Spatrick     return F->getValueSymbolTable();
3209467b48Spatrick   return nullptr;
3309467b48Spatrick }
3409467b48Spatrick 
getContext() const3509467b48Spatrick LLVMContext &BasicBlock::getContext() const {
3609467b48Spatrick   return getType()->getContext();
3709467b48Spatrick }
3809467b48Spatrick 
invalidateParentIListOrdering(BasicBlock * BB)39097a140dSpatrick template <> void llvm::invalidateParentIListOrdering(BasicBlock *BB) {
40097a140dSpatrick   BB->invalidateOrders();
41097a140dSpatrick }
42097a140dSpatrick 
4309467b48Spatrick // Explicit instantiation of SymbolTableListTraits since some of the methods
4409467b48Spatrick // are not in the public header file...
4509467b48Spatrick template class llvm::SymbolTableListTraits<Instruction>;
4609467b48Spatrick 
BasicBlock(LLVMContext & C,const Twine & Name,Function * NewParent,BasicBlock * InsertBefore)4709467b48Spatrick BasicBlock::BasicBlock(LLVMContext &C, const Twine &Name, Function *NewParent,
4809467b48Spatrick                        BasicBlock *InsertBefore)
4909467b48Spatrick   : Value(Type::getLabelTy(C), Value::BasicBlockVal), Parent(nullptr) {
5009467b48Spatrick 
5109467b48Spatrick   if (NewParent)
5209467b48Spatrick     insertInto(NewParent, InsertBefore);
5309467b48Spatrick   else
5409467b48Spatrick     assert(!InsertBefore &&
5509467b48Spatrick            "Cannot insert block before another block with no function!");
5609467b48Spatrick 
5709467b48Spatrick   setName(Name);
5809467b48Spatrick }
5909467b48Spatrick 
insertInto(Function * NewParent,BasicBlock * InsertBefore)6009467b48Spatrick void BasicBlock::insertInto(Function *NewParent, BasicBlock *InsertBefore) {
6109467b48Spatrick   assert(NewParent && "Expected a parent");
6209467b48Spatrick   assert(!Parent && "Already has a parent");
6309467b48Spatrick 
6409467b48Spatrick   if (InsertBefore)
65*d415bd75Srobert     NewParent->insert(InsertBefore->getIterator(), this);
6609467b48Spatrick   else
67*d415bd75Srobert     NewParent->insert(NewParent->end(), this);
6809467b48Spatrick }
6909467b48Spatrick 
~BasicBlock()7009467b48Spatrick BasicBlock::~BasicBlock() {
71097a140dSpatrick   validateInstrOrdering();
72097a140dSpatrick 
7309467b48Spatrick   // If the address of the block is taken and it is being deleted (e.g. because
7409467b48Spatrick   // it is dead), this means that there is either a dangling constant expr
7509467b48Spatrick   // hanging off the block, or an undefined use of the block (source code
7609467b48Spatrick   // expecting the address of a label to keep the block alive even though there
7709467b48Spatrick   // is no indirect branch).  Handle these cases by zapping the BlockAddress
7809467b48Spatrick   // nodes.  There are no other possible uses at this point.
7909467b48Spatrick   if (hasAddressTaken()) {
8009467b48Spatrick     assert(!use_empty() && "There should be at least one blockaddress!");
8109467b48Spatrick     Constant *Replacement =
8209467b48Spatrick       ConstantInt::get(llvm::Type::getInt32Ty(getContext()), 1);
8309467b48Spatrick     while (!use_empty()) {
8409467b48Spatrick       BlockAddress *BA = cast<BlockAddress>(user_back());
8509467b48Spatrick       BA->replaceAllUsesWith(ConstantExpr::getIntToPtr(Replacement,
8609467b48Spatrick                                                        BA->getType()));
8709467b48Spatrick       BA->destroyConstant();
8809467b48Spatrick     }
8909467b48Spatrick   }
9009467b48Spatrick 
9109467b48Spatrick   assert(getParent() == nullptr && "BasicBlock still linked into the program!");
9209467b48Spatrick   dropAllReferences();
9309467b48Spatrick   InstList.clear();
9409467b48Spatrick }
9509467b48Spatrick 
setParent(Function * parent)9609467b48Spatrick void BasicBlock::setParent(Function *parent) {
9709467b48Spatrick   // Set Parent=parent, updating instruction symtab entries as appropriate.
9809467b48Spatrick   InstList.setSymTabObject(&Parent, parent);
9909467b48Spatrick }
10009467b48Spatrick 
10109467b48Spatrick iterator_range<filter_iterator<BasicBlock::const_iterator,
10209467b48Spatrick                                std::function<bool(const Instruction &)>>>
instructionsWithoutDebug(bool SkipPseudoOp) const10373471bf0Spatrick BasicBlock::instructionsWithoutDebug(bool SkipPseudoOp) const {
10473471bf0Spatrick   std::function<bool(const Instruction &)> Fn = [=](const Instruction &I) {
10573471bf0Spatrick     return !isa<DbgInfoIntrinsic>(I) &&
10673471bf0Spatrick            !(SkipPseudoOp && isa<PseudoProbeInst>(I));
10709467b48Spatrick   };
10809467b48Spatrick   return make_filter_range(*this, Fn);
10909467b48Spatrick }
11009467b48Spatrick 
11173471bf0Spatrick iterator_range<
11273471bf0Spatrick     filter_iterator<BasicBlock::iterator, std::function<bool(Instruction &)>>>
instructionsWithoutDebug(bool SkipPseudoOp)11373471bf0Spatrick BasicBlock::instructionsWithoutDebug(bool SkipPseudoOp) {
11473471bf0Spatrick   std::function<bool(Instruction &)> Fn = [=](Instruction &I) {
11573471bf0Spatrick     return !isa<DbgInfoIntrinsic>(I) &&
11673471bf0Spatrick            !(SkipPseudoOp && isa<PseudoProbeInst>(I));
11709467b48Spatrick   };
11809467b48Spatrick   return make_filter_range(*this, Fn);
11909467b48Spatrick }
12009467b48Spatrick 
12109467b48Spatrick filter_iterator<BasicBlock::const_iterator,
12209467b48Spatrick                 std::function<bool(const Instruction &)>>::difference_type
sizeWithoutDebug() const12309467b48Spatrick BasicBlock::sizeWithoutDebug() const {
12409467b48Spatrick   return std::distance(instructionsWithoutDebug().begin(),
12509467b48Spatrick                        instructionsWithoutDebug().end());
12609467b48Spatrick }
12709467b48Spatrick 
removeFromParent()12809467b48Spatrick void BasicBlock::removeFromParent() {
12909467b48Spatrick   getParent()->getBasicBlockList().remove(getIterator());
13009467b48Spatrick }
13109467b48Spatrick 
eraseFromParent()13209467b48Spatrick iplist<BasicBlock>::iterator BasicBlock::eraseFromParent() {
13309467b48Spatrick   return getParent()->getBasicBlockList().erase(getIterator());
13409467b48Spatrick }
13509467b48Spatrick 
moveBefore(BasicBlock * MovePos)13609467b48Spatrick void BasicBlock::moveBefore(BasicBlock *MovePos) {
137*d415bd75Srobert   MovePos->getParent()->splice(MovePos->getIterator(), getParent(),
138*d415bd75Srobert                                getIterator());
13909467b48Spatrick }
14009467b48Spatrick 
moveAfter(BasicBlock * MovePos)14109467b48Spatrick void BasicBlock::moveAfter(BasicBlock *MovePos) {
142*d415bd75Srobert   MovePos->getParent()->splice(++MovePos->getIterator(), getParent(),
14309467b48Spatrick                                getIterator());
14409467b48Spatrick }
14509467b48Spatrick 
getModule() const14609467b48Spatrick const Module *BasicBlock::getModule() const {
14709467b48Spatrick   return getParent()->getParent();
14809467b48Spatrick }
14909467b48Spatrick 
getTerminatingMustTailCall() const15009467b48Spatrick const CallInst *BasicBlock::getTerminatingMustTailCall() const {
15109467b48Spatrick   if (InstList.empty())
15209467b48Spatrick     return nullptr;
15309467b48Spatrick   const ReturnInst *RI = dyn_cast<ReturnInst>(&InstList.back());
15409467b48Spatrick   if (!RI || RI == &InstList.front())
15509467b48Spatrick     return nullptr;
15609467b48Spatrick 
15709467b48Spatrick   const Instruction *Prev = RI->getPrevNode();
15809467b48Spatrick   if (!Prev)
15909467b48Spatrick     return nullptr;
16009467b48Spatrick 
16109467b48Spatrick   if (Value *RV = RI->getReturnValue()) {
16209467b48Spatrick     if (RV != Prev)
16309467b48Spatrick       return nullptr;
16409467b48Spatrick 
16509467b48Spatrick     // Look through the optional bitcast.
16609467b48Spatrick     if (auto *BI = dyn_cast<BitCastInst>(Prev)) {
16709467b48Spatrick       RV = BI->getOperand(0);
16809467b48Spatrick       Prev = BI->getPrevNode();
16909467b48Spatrick       if (!Prev || RV != Prev)
17009467b48Spatrick         return nullptr;
17109467b48Spatrick     }
17209467b48Spatrick   }
17309467b48Spatrick 
17409467b48Spatrick   if (auto *CI = dyn_cast<CallInst>(Prev)) {
17509467b48Spatrick     if (CI->isMustTailCall())
17609467b48Spatrick       return CI;
17709467b48Spatrick   }
17809467b48Spatrick   return nullptr;
17909467b48Spatrick }
18009467b48Spatrick 
getTerminatingDeoptimizeCall() const18109467b48Spatrick const CallInst *BasicBlock::getTerminatingDeoptimizeCall() const {
18209467b48Spatrick   if (InstList.empty())
18309467b48Spatrick     return nullptr;
18409467b48Spatrick   auto *RI = dyn_cast<ReturnInst>(&InstList.back());
18509467b48Spatrick   if (!RI || RI == &InstList.front())
18609467b48Spatrick     return nullptr;
18709467b48Spatrick 
18809467b48Spatrick   if (auto *CI = dyn_cast_or_null<CallInst>(RI->getPrevNode()))
18909467b48Spatrick     if (Function *F = CI->getCalledFunction())
19009467b48Spatrick       if (F->getIntrinsicID() == Intrinsic::experimental_deoptimize)
19109467b48Spatrick         return CI;
19209467b48Spatrick 
19309467b48Spatrick   return nullptr;
19409467b48Spatrick }
19509467b48Spatrick 
getPostdominatingDeoptimizeCall() const196097a140dSpatrick const CallInst *BasicBlock::getPostdominatingDeoptimizeCall() const {
197097a140dSpatrick   const BasicBlock* BB = this;
198097a140dSpatrick   SmallPtrSet<const BasicBlock *, 8> Visited;
199097a140dSpatrick   Visited.insert(BB);
200097a140dSpatrick   while (auto *Succ = BB->getUniqueSuccessor()) {
201097a140dSpatrick     if (!Visited.insert(Succ).second)
202097a140dSpatrick       return nullptr;
203097a140dSpatrick     BB = Succ;
204097a140dSpatrick   }
205097a140dSpatrick   return BB->getTerminatingDeoptimizeCall();
206097a140dSpatrick }
207097a140dSpatrick 
getFirstNonPHI() const20809467b48Spatrick const Instruction* BasicBlock::getFirstNonPHI() const {
20909467b48Spatrick   for (const Instruction &I : *this)
21009467b48Spatrick     if (!isa<PHINode>(I))
21109467b48Spatrick       return &I;
21209467b48Spatrick   return nullptr;
21309467b48Spatrick }
21409467b48Spatrick 
getFirstNonPHIOrDbg(bool SkipPseudoOp) const21573471bf0Spatrick const Instruction *BasicBlock::getFirstNonPHIOrDbg(bool SkipPseudoOp) const {
21673471bf0Spatrick   for (const Instruction &I : *this) {
21773471bf0Spatrick     if (isa<PHINode>(I) || isa<DbgInfoIntrinsic>(I))
21873471bf0Spatrick       continue;
21973471bf0Spatrick 
22073471bf0Spatrick     if (SkipPseudoOp && isa<PseudoProbeInst>(I))
22173471bf0Spatrick       continue;
22273471bf0Spatrick 
22309467b48Spatrick     return &I;
22473471bf0Spatrick   }
22509467b48Spatrick   return nullptr;
22609467b48Spatrick }
22709467b48Spatrick 
22873471bf0Spatrick const Instruction *
getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp) const22973471bf0Spatrick BasicBlock::getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp) const {
23009467b48Spatrick   for (const Instruction &I : *this) {
23109467b48Spatrick     if (isa<PHINode>(I) || isa<DbgInfoIntrinsic>(I))
23209467b48Spatrick       continue;
23309467b48Spatrick 
23409467b48Spatrick     if (I.isLifetimeStartOrEnd())
23509467b48Spatrick       continue;
23609467b48Spatrick 
23773471bf0Spatrick     if (SkipPseudoOp && isa<PseudoProbeInst>(I))
23873471bf0Spatrick       continue;
23973471bf0Spatrick 
24009467b48Spatrick     return &I;
24109467b48Spatrick   }
24209467b48Spatrick   return nullptr;
24309467b48Spatrick }
24409467b48Spatrick 
getFirstInsertionPt() const24509467b48Spatrick BasicBlock::const_iterator BasicBlock::getFirstInsertionPt() const {
24609467b48Spatrick   const Instruction *FirstNonPHI = getFirstNonPHI();
24709467b48Spatrick   if (!FirstNonPHI)
24809467b48Spatrick     return end();
24909467b48Spatrick 
25009467b48Spatrick   const_iterator InsertPt = FirstNonPHI->getIterator();
25109467b48Spatrick   if (InsertPt->isEHPad()) ++InsertPt;
25209467b48Spatrick   return InsertPt;
25309467b48Spatrick }
25409467b48Spatrick 
getFirstNonPHIOrDbgOrAlloca() const255*d415bd75Srobert BasicBlock::const_iterator BasicBlock::getFirstNonPHIOrDbgOrAlloca() const {
256*d415bd75Srobert   const Instruction *FirstNonPHI = getFirstNonPHI();
257*d415bd75Srobert   if (!FirstNonPHI)
258*d415bd75Srobert     return end();
259*d415bd75Srobert 
260*d415bd75Srobert   const_iterator InsertPt = FirstNonPHI->getIterator();
261*d415bd75Srobert   if (InsertPt->isEHPad())
262*d415bd75Srobert     ++InsertPt;
263*d415bd75Srobert 
264*d415bd75Srobert   if (isEntryBlock()) {
265*d415bd75Srobert     const_iterator End = end();
266*d415bd75Srobert     while (InsertPt != End &&
267*d415bd75Srobert            (isa<AllocaInst>(*InsertPt) || isa<DbgInfoIntrinsic>(*InsertPt) ||
268*d415bd75Srobert             isa<PseudoProbeInst>(*InsertPt))) {
269*d415bd75Srobert       if (const AllocaInst *AI = dyn_cast<AllocaInst>(&*InsertPt)) {
270*d415bd75Srobert         if (!AI->isStaticAlloca())
271*d415bd75Srobert           break;
272*d415bd75Srobert       }
273*d415bd75Srobert       ++InsertPt;
274*d415bd75Srobert     }
275*d415bd75Srobert   }
276*d415bd75Srobert   return InsertPt;
277*d415bd75Srobert }
278*d415bd75Srobert 
dropAllReferences()27909467b48Spatrick void BasicBlock::dropAllReferences() {
28009467b48Spatrick   for (Instruction &I : *this)
28109467b48Spatrick     I.dropAllReferences();
28209467b48Spatrick }
28309467b48Spatrick 
getSinglePredecessor() const28409467b48Spatrick const BasicBlock *BasicBlock::getSinglePredecessor() const {
28509467b48Spatrick   const_pred_iterator PI = pred_begin(this), E = pred_end(this);
28609467b48Spatrick   if (PI == E) return nullptr;         // No preds.
28709467b48Spatrick   const BasicBlock *ThePred = *PI;
28809467b48Spatrick   ++PI;
28909467b48Spatrick   return (PI == E) ? ThePred : nullptr /*multiple preds*/;
29009467b48Spatrick }
29109467b48Spatrick 
getUniquePredecessor() const29209467b48Spatrick const BasicBlock *BasicBlock::getUniquePredecessor() const {
29309467b48Spatrick   const_pred_iterator PI = pred_begin(this), E = pred_end(this);
29409467b48Spatrick   if (PI == E) return nullptr; // No preds.
29509467b48Spatrick   const BasicBlock *PredBB = *PI;
29609467b48Spatrick   ++PI;
29709467b48Spatrick   for (;PI != E; ++PI) {
29809467b48Spatrick     if (*PI != PredBB)
29909467b48Spatrick       return nullptr;
30009467b48Spatrick     // The same predecessor appears multiple times in the predecessor list.
30109467b48Spatrick     // This is OK.
30209467b48Spatrick   }
30309467b48Spatrick   return PredBB;
30409467b48Spatrick }
30509467b48Spatrick 
hasNPredecessors(unsigned N) const30609467b48Spatrick bool BasicBlock::hasNPredecessors(unsigned N) const {
30709467b48Spatrick   return hasNItems(pred_begin(this), pred_end(this), N);
30809467b48Spatrick }
30909467b48Spatrick 
hasNPredecessorsOrMore(unsigned N) const31009467b48Spatrick bool BasicBlock::hasNPredecessorsOrMore(unsigned N) const {
31109467b48Spatrick   return hasNItemsOrMore(pred_begin(this), pred_end(this), N);
31209467b48Spatrick }
31309467b48Spatrick 
getSingleSuccessor() const31409467b48Spatrick const BasicBlock *BasicBlock::getSingleSuccessor() const {
315097a140dSpatrick   const_succ_iterator SI = succ_begin(this), E = succ_end(this);
31609467b48Spatrick   if (SI == E) return nullptr; // no successors
31709467b48Spatrick   const BasicBlock *TheSucc = *SI;
31809467b48Spatrick   ++SI;
31909467b48Spatrick   return (SI == E) ? TheSucc : nullptr /* multiple successors */;
32009467b48Spatrick }
32109467b48Spatrick 
getUniqueSuccessor() const32209467b48Spatrick const BasicBlock *BasicBlock::getUniqueSuccessor() const {
323097a140dSpatrick   const_succ_iterator SI = succ_begin(this), E = succ_end(this);
32409467b48Spatrick   if (SI == E) return nullptr; // No successors
32509467b48Spatrick   const BasicBlock *SuccBB = *SI;
32609467b48Spatrick   ++SI;
32709467b48Spatrick   for (;SI != E; ++SI) {
32809467b48Spatrick     if (*SI != SuccBB)
32909467b48Spatrick       return nullptr;
33009467b48Spatrick     // The same successor appears multiple times in the successor list.
33109467b48Spatrick     // This is OK.
33209467b48Spatrick   }
33309467b48Spatrick   return SuccBB;
33409467b48Spatrick }
33509467b48Spatrick 
phis()33609467b48Spatrick iterator_range<BasicBlock::phi_iterator> BasicBlock::phis() {
33709467b48Spatrick   PHINode *P = empty() ? nullptr : dyn_cast<PHINode>(&*begin());
33809467b48Spatrick   return make_range<phi_iterator>(P, nullptr);
33909467b48Spatrick }
34009467b48Spatrick 
removePredecessor(BasicBlock * Pred,bool KeepOneInputPHIs)34109467b48Spatrick void BasicBlock::removePredecessor(BasicBlock *Pred,
34209467b48Spatrick                                    bool KeepOneInputPHIs) {
343097a140dSpatrick   // Use hasNUsesOrMore to bound the cost of this assertion for complex CFGs.
34473471bf0Spatrick   assert((hasNUsesOrMore(16) || llvm::is_contained(predecessors(this), Pred)) &&
345097a140dSpatrick          "Pred is not a predecessor!");
34609467b48Spatrick 
347097a140dSpatrick   // Return early if there are no PHI nodes to update.
34873471bf0Spatrick   if (empty() || !isa<PHINode>(begin()))
349097a140dSpatrick     return;
35009467b48Spatrick 
35173471bf0Spatrick   unsigned NumPreds = cast<PHINode>(front()).getNumIncomingValues();
35273471bf0Spatrick   for (PHINode &Phi : make_early_inc_range(phis())) {
35373471bf0Spatrick     Phi.removeIncomingValue(Pred, !KeepOneInputPHIs);
35473471bf0Spatrick     if (KeepOneInputPHIs)
35573471bf0Spatrick       continue;
35673471bf0Spatrick 
35773471bf0Spatrick     // If we have a single predecessor, removeIncomingValue may have erased the
35873471bf0Spatrick     // PHI node itself.
35973471bf0Spatrick     if (NumPreds == 1)
36073471bf0Spatrick       continue;
36173471bf0Spatrick 
36273471bf0Spatrick     // Try to replace the PHI node with a constant value.
36373471bf0Spatrick     if (Value *PhiConstant = Phi.hasConstantValue()) {
36473471bf0Spatrick       Phi.replaceAllUsesWith(PhiConstant);
36573471bf0Spatrick       Phi.eraseFromParent();
36609467b48Spatrick     }
36709467b48Spatrick   }
368097a140dSpatrick }
36909467b48Spatrick 
canSplitPredecessors() const37009467b48Spatrick bool BasicBlock::canSplitPredecessors() const {
37109467b48Spatrick   const Instruction *FirstNonPHI = getFirstNonPHI();
37209467b48Spatrick   if (isa<LandingPadInst>(FirstNonPHI))
37309467b48Spatrick     return true;
37409467b48Spatrick   // This is perhaps a little conservative because constructs like
37509467b48Spatrick   // CleanupBlockInst are pretty easy to split.  However, SplitBlockPredecessors
37609467b48Spatrick   // cannot handle such things just yet.
37709467b48Spatrick   if (FirstNonPHI->isEHPad())
37809467b48Spatrick     return false;
37909467b48Spatrick   return true;
38009467b48Spatrick }
38109467b48Spatrick 
isLegalToHoistInto() const38209467b48Spatrick bool BasicBlock::isLegalToHoistInto() const {
38309467b48Spatrick   auto *Term = getTerminator();
38409467b48Spatrick   // No terminator means the block is under construction.
38509467b48Spatrick   if (!Term)
38609467b48Spatrick     return true;
38709467b48Spatrick 
38809467b48Spatrick   // If the block has no successors, there can be no instructions to hoist.
38909467b48Spatrick   assert(Term->getNumSuccessors() > 0);
39009467b48Spatrick 
39109467b48Spatrick   // Instructions should not be hoisted across exception handling boundaries.
39209467b48Spatrick   return !Term->isExceptionalTerminator();
39309467b48Spatrick }
39409467b48Spatrick 
isEntryBlock() const39573471bf0Spatrick bool BasicBlock::isEntryBlock() const {
39673471bf0Spatrick   const Function *F = getParent();
39773471bf0Spatrick   assert(F && "Block must have a parent function to use this API");
39873471bf0Spatrick   return this == &F->getEntryBlock();
39973471bf0Spatrick }
40073471bf0Spatrick 
splitBasicBlock(iterator I,const Twine & BBName,bool Before)40173471bf0Spatrick BasicBlock *BasicBlock::splitBasicBlock(iterator I, const Twine &BBName,
40273471bf0Spatrick                                         bool Before) {
40373471bf0Spatrick   if (Before)
40473471bf0Spatrick     return splitBasicBlockBefore(I, BBName);
40573471bf0Spatrick 
40609467b48Spatrick   assert(getTerminator() && "Can't use splitBasicBlock on degenerate BB!");
40709467b48Spatrick   assert(I != InstList.end() &&
40809467b48Spatrick          "Trying to get me to create degenerate basic block!");
40909467b48Spatrick 
41009467b48Spatrick   BasicBlock *New = BasicBlock::Create(getContext(), BBName, getParent(),
41109467b48Spatrick                                        this->getNextNode());
41209467b48Spatrick 
41309467b48Spatrick   // Save DebugLoc of split point before invalidating iterator.
41409467b48Spatrick   DebugLoc Loc = I->getDebugLoc();
41509467b48Spatrick   // Move all of the specified instructions from the original basic block into
41609467b48Spatrick   // the new basic block.
417*d415bd75Srobert   New->splice(New->end(), this, I, end());
41809467b48Spatrick 
41909467b48Spatrick   // Add a branch instruction to the newly formed basic block.
42009467b48Spatrick   BranchInst *BI = BranchInst::Create(New, this);
42109467b48Spatrick   BI->setDebugLoc(Loc);
42209467b48Spatrick 
42309467b48Spatrick   // Now we must loop through all of the successors of the New block (which
42409467b48Spatrick   // _were_ the successors of the 'this' block), and update any PHI nodes in
42509467b48Spatrick   // successors.  If there were PHI nodes in the successors, then they need to
42609467b48Spatrick   // know that incoming branches will be from New, not from Old (this).
42709467b48Spatrick   //
42809467b48Spatrick   New->replaceSuccessorsPhiUsesWith(this, New);
42909467b48Spatrick   return New;
43009467b48Spatrick }
43109467b48Spatrick 
splitBasicBlockBefore(iterator I,const Twine & BBName)43273471bf0Spatrick BasicBlock *BasicBlock::splitBasicBlockBefore(iterator I, const Twine &BBName) {
43373471bf0Spatrick   assert(getTerminator() &&
43473471bf0Spatrick          "Can't use splitBasicBlockBefore on degenerate BB!");
43573471bf0Spatrick   assert(I != InstList.end() &&
43673471bf0Spatrick          "Trying to get me to create degenerate basic block!");
43773471bf0Spatrick 
43873471bf0Spatrick   assert((!isa<PHINode>(*I) || getSinglePredecessor()) &&
43973471bf0Spatrick          "cannot split on multi incoming phis");
44073471bf0Spatrick 
44173471bf0Spatrick   BasicBlock *New = BasicBlock::Create(getContext(), BBName, getParent(), this);
44273471bf0Spatrick   // Save DebugLoc of split point before invalidating iterator.
44373471bf0Spatrick   DebugLoc Loc = I->getDebugLoc();
44473471bf0Spatrick   // Move all of the specified instructions from the original basic block into
44573471bf0Spatrick   // the new basic block.
446*d415bd75Srobert   New->splice(New->end(), this, begin(), I);
44773471bf0Spatrick 
44873471bf0Spatrick   // Loop through all of the predecessors of the 'this' block (which will be the
44973471bf0Spatrick   // predecessors of the New block), replace the specified successor 'this'
45073471bf0Spatrick   // block to point at the New block and update any PHI nodes in 'this' block.
45173471bf0Spatrick   // If there were PHI nodes in 'this' block, the PHI nodes are updated
45273471bf0Spatrick   // to reflect that the incoming branches will be from the New block and not
45373471bf0Spatrick   // from predecessors of the 'this' block.
454*d415bd75Srobert   // Save predecessors to separate vector before modifying them.
455*d415bd75Srobert   SmallVector<BasicBlock *, 4> Predecessors;
456*d415bd75Srobert   for (BasicBlock *Pred : predecessors(this))
457*d415bd75Srobert     Predecessors.push_back(Pred);
458*d415bd75Srobert   for (BasicBlock *Pred : Predecessors) {
45973471bf0Spatrick     Instruction *TI = Pred->getTerminator();
46073471bf0Spatrick     TI->replaceSuccessorWith(this, New);
46173471bf0Spatrick     this->replacePhiUsesWith(Pred, New);
46273471bf0Spatrick   }
46373471bf0Spatrick   // Add a branch instruction from  "New" to "this" Block.
46473471bf0Spatrick   BranchInst *BI = BranchInst::Create(this, New);
46573471bf0Spatrick   BI->setDebugLoc(Loc);
46673471bf0Spatrick 
46773471bf0Spatrick   return New;
46873471bf0Spatrick }
46973471bf0Spatrick 
splice(BasicBlock::iterator ToIt,BasicBlock * FromBB,BasicBlock::iterator FromBeginIt,BasicBlock::iterator FromEndIt)470*d415bd75Srobert void BasicBlock::splice(BasicBlock::iterator ToIt, BasicBlock *FromBB,
471*d415bd75Srobert                         BasicBlock::iterator FromBeginIt,
472*d415bd75Srobert                         BasicBlock::iterator FromEndIt) {
473*d415bd75Srobert #ifdef EXPENSIVE_CHECKS
474*d415bd75Srobert   // Check that FromBeginIt is befor FromEndIt.
475*d415bd75Srobert   auto FromBBEnd = FromBB->end();
476*d415bd75Srobert   for (auto It = FromBeginIt; It != FromEndIt; ++It)
477*d415bd75Srobert     assert(It != FromBBEnd && "FromBeginIt not before FromEndIt!");
478*d415bd75Srobert #endif // EXPENSIVE_CHECKS
479*d415bd75Srobert   getInstList().splice(ToIt, FromBB->getInstList(), FromBeginIt, FromEndIt);
480*d415bd75Srobert }
481*d415bd75Srobert 
erase(BasicBlock::iterator FromIt,BasicBlock::iterator ToIt)482*d415bd75Srobert BasicBlock::iterator BasicBlock::erase(BasicBlock::iterator FromIt,
483*d415bd75Srobert                                        BasicBlock::iterator ToIt) {
484*d415bd75Srobert   return InstList.erase(FromIt, ToIt);
485*d415bd75Srobert }
486*d415bd75Srobert 
replacePhiUsesWith(BasicBlock * Old,BasicBlock * New)48709467b48Spatrick void BasicBlock::replacePhiUsesWith(BasicBlock *Old, BasicBlock *New) {
48809467b48Spatrick   // N.B. This might not be a complete BasicBlock, so don't assume
48909467b48Spatrick   // that it ends with a non-phi instruction.
490*d415bd75Srobert   for (Instruction &I : *this) {
491*d415bd75Srobert     PHINode *PN = dyn_cast<PHINode>(&I);
49209467b48Spatrick     if (!PN)
49309467b48Spatrick       break;
49409467b48Spatrick     PN->replaceIncomingBlockWith(Old, New);
49509467b48Spatrick   }
49609467b48Spatrick }
49709467b48Spatrick 
replaceSuccessorsPhiUsesWith(BasicBlock * Old,BasicBlock * New)49809467b48Spatrick void BasicBlock::replaceSuccessorsPhiUsesWith(BasicBlock *Old,
49909467b48Spatrick                                               BasicBlock *New) {
50009467b48Spatrick   Instruction *TI = getTerminator();
50109467b48Spatrick   if (!TI)
50209467b48Spatrick     // Cope with being called on a BasicBlock that doesn't have a terminator
50309467b48Spatrick     // yet. Clang's CodeGenFunction::EmitReturnBlock() likes to do this.
50409467b48Spatrick     return;
50573471bf0Spatrick   for (BasicBlock *Succ : successors(TI))
50609467b48Spatrick     Succ->replacePhiUsesWith(Old, New);
50709467b48Spatrick }
50809467b48Spatrick 
replaceSuccessorsPhiUsesWith(BasicBlock * New)50909467b48Spatrick void BasicBlock::replaceSuccessorsPhiUsesWith(BasicBlock *New) {
51009467b48Spatrick   this->replaceSuccessorsPhiUsesWith(this, New);
51109467b48Spatrick }
51209467b48Spatrick 
isLandingPad() const51309467b48Spatrick bool BasicBlock::isLandingPad() const {
51409467b48Spatrick   return isa<LandingPadInst>(getFirstNonPHI());
51509467b48Spatrick }
51609467b48Spatrick 
getLandingPadInst() const51709467b48Spatrick const LandingPadInst *BasicBlock::getLandingPadInst() const {
51809467b48Spatrick   return dyn_cast<LandingPadInst>(getFirstNonPHI());
51909467b48Spatrick }
52009467b48Spatrick 
getIrrLoopHeaderWeight() const521*d415bd75Srobert std::optional<uint64_t> BasicBlock::getIrrLoopHeaderWeight() const {
52209467b48Spatrick   const Instruction *TI = getTerminator();
52309467b48Spatrick   if (MDNode *MDIrrLoopHeader =
52409467b48Spatrick       TI->getMetadata(LLVMContext::MD_irr_loop)) {
52509467b48Spatrick     MDString *MDName = cast<MDString>(MDIrrLoopHeader->getOperand(0));
52609467b48Spatrick     if (MDName->getString().equals("loop_header_weight")) {
52709467b48Spatrick       auto *CI = mdconst::extract<ConstantInt>(MDIrrLoopHeader->getOperand(1));
528*d415bd75Srobert       return std::optional<uint64_t>(CI->getValue().getZExtValue());
52909467b48Spatrick     }
53009467b48Spatrick   }
531*d415bd75Srobert   return std::nullopt;
53209467b48Spatrick }
53309467b48Spatrick 
skipDebugIntrinsics(BasicBlock::iterator It)53409467b48Spatrick BasicBlock::iterator llvm::skipDebugIntrinsics(BasicBlock::iterator It) {
53509467b48Spatrick   while (isa<DbgInfoIntrinsic>(It))
53609467b48Spatrick     ++It;
53709467b48Spatrick   return It;
53809467b48Spatrick }
539097a140dSpatrick 
renumberInstructions()540097a140dSpatrick void BasicBlock::renumberInstructions() {
541097a140dSpatrick   unsigned Order = 0;
542097a140dSpatrick   for (Instruction &I : *this)
543097a140dSpatrick     I.Order = Order++;
544097a140dSpatrick 
545097a140dSpatrick   // Set the bit to indicate that the instruction order valid and cached.
546097a140dSpatrick   BasicBlockBits Bits = getBasicBlockBits();
547097a140dSpatrick   Bits.InstrOrderValid = true;
548097a140dSpatrick   setBasicBlockBits(Bits);
549*d415bd75Srobert 
550*d415bd75Srobert   NumInstrRenumberings++;
551097a140dSpatrick }
552097a140dSpatrick 
553097a140dSpatrick #ifndef NDEBUG
554097a140dSpatrick /// In asserts builds, this checks the numbering. In non-asserts builds, it
555097a140dSpatrick /// is defined as a no-op inline function in BasicBlock.h.
validateInstrOrdering() const556097a140dSpatrick void BasicBlock::validateInstrOrdering() const {
557097a140dSpatrick   if (!isInstrOrderValid())
558097a140dSpatrick     return;
559097a140dSpatrick   const Instruction *Prev = nullptr;
560097a140dSpatrick   for (const Instruction &I : *this) {
561097a140dSpatrick     assert((!Prev || Prev->comesBefore(&I)) &&
562097a140dSpatrick            "cached instruction ordering is incorrect");
563097a140dSpatrick     Prev = &I;
564097a140dSpatrick   }
565097a140dSpatrick }
566097a140dSpatrick #endif
567