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