• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- BasicBlock.cpp - Implement BasicBlock related methods -------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the BasicBlock class for the IR library.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "llvm/IR/BasicBlock.h"
14 #include "SymbolTableListTraitsImpl.h"
15 #include "llvm/ADT/STLExtras.h"
16 #include "llvm/IR/CFG.h"
17 #include "llvm/IR/Constants.h"
18 #include "llvm/IR/Instructions.h"
19 #include "llvm/IR/IntrinsicInst.h"
20 #include "llvm/IR/LLVMContext.h"
21 #include "llvm/IR/Type.h"
22 #include <algorithm>
23 
24 using namespace llvm;
25 
getValueSymbolTable()26 ValueSymbolTable *BasicBlock::getValueSymbolTable() {
27   if (Function *F = getParent())
28     return F->getValueSymbolTable();
29   return nullptr;
30 }
31 
getContext() const32 LLVMContext &BasicBlock::getContext() const {
33   return getType()->getContext();
34 }
35 
36 // Explicit instantiation of SymbolTableListTraits since some of the methods
37 // are not in the public header file...
38 template class llvm::SymbolTableListTraits<Instruction>;
39 
BasicBlock(LLVMContext & C,const Twine & Name,Function * NewParent,BasicBlock * InsertBefore)40 BasicBlock::BasicBlock(LLVMContext &C, const Twine &Name, Function *NewParent,
41                        BasicBlock *InsertBefore)
42   : Value(Type::getLabelTy(C), Value::BasicBlockVal), Parent(nullptr) {
43 
44   if (NewParent)
45     insertInto(NewParent, InsertBefore);
46   else
47     assert(!InsertBefore &&
48            "Cannot insert block before another block with no function!");
49 
50   setName(Name);
51 }
52 
insertInto(Function * NewParent,BasicBlock * InsertBefore)53 void BasicBlock::insertInto(Function *NewParent, BasicBlock *InsertBefore) {
54   assert(NewParent && "Expected a parent");
55   assert(!Parent && "Already has a parent");
56 
57   if (InsertBefore)
58     NewParent->getBasicBlockList().insert(InsertBefore->getIterator(), this);
59   else
60     NewParent->getBasicBlockList().push_back(this);
61 }
62 
~BasicBlock()63 BasicBlock::~BasicBlock() {
64   // If the address of the block is taken and it is being deleted (e.g. because
65   // it is dead), this means that there is either a dangling constant expr
66   // hanging off the block, or an undefined use of the block (source code
67   // expecting the address of a label to keep the block alive even though there
68   // is no indirect branch).  Handle these cases by zapping the BlockAddress
69   // nodes.  There are no other possible uses at this point.
70   if (hasAddressTaken()) {
71     assert(!use_empty() && "There should be at least one blockaddress!");
72     Constant *Replacement =
73       ConstantInt::get(llvm::Type::getInt32Ty(getContext()), 1);
74     while (!use_empty()) {
75       BlockAddress *BA = cast<BlockAddress>(user_back());
76       BA->replaceAllUsesWith(ConstantExpr::getIntToPtr(Replacement,
77                                                        BA->getType()));
78       BA->destroyConstant();
79     }
80   }
81 
82   assert(getParent() == nullptr && "BasicBlock still linked into the program!");
83   dropAllReferences();
84   InstList.clear();
85 }
86 
setParent(Function * parent)87 void BasicBlock::setParent(Function *parent) {
88   // Set Parent=parent, updating instruction symtab entries as appropriate.
89   InstList.setSymTabObject(&Parent, parent);
90 }
91 
92 iterator_range<filter_iterator<BasicBlock::const_iterator,
93                                std::function<bool(const Instruction &)>>>
instructionsWithoutDebug() const94 BasicBlock::instructionsWithoutDebug() const {
95   std::function<bool(const Instruction &)> Fn = [](const Instruction &I) {
96     return !isa<DbgInfoIntrinsic>(I);
97   };
98   return make_filter_range(*this, Fn);
99 }
100 
101 iterator_range<filter_iterator<BasicBlock::iterator,
102                                std::function<bool(Instruction &)>>>
instructionsWithoutDebug()103 BasicBlock::instructionsWithoutDebug() {
104   std::function<bool(Instruction &)> Fn = [](Instruction &I) {
105     return !isa<DbgInfoIntrinsic>(I);
106   };
107   return make_filter_range(*this, Fn);
108 }
109 
110 filter_iterator<BasicBlock::const_iterator,
111                 std::function<bool(const Instruction &)>>::difference_type
sizeWithoutDebug() const112 BasicBlock::sizeWithoutDebug() const {
113   return std::distance(instructionsWithoutDebug().begin(),
114                        instructionsWithoutDebug().end());
115 }
116 
removeFromParent()117 void BasicBlock::removeFromParent() {
118   getParent()->getBasicBlockList().remove(getIterator());
119 }
120 
eraseFromParent()121 iplist<BasicBlock>::iterator BasicBlock::eraseFromParent() {
122   return getParent()->getBasicBlockList().erase(getIterator());
123 }
124 
125 /// Unlink this basic block from its current function and
126 /// insert it into the function that MovePos lives in, right before MovePos.
moveBefore(BasicBlock * MovePos)127 void BasicBlock::moveBefore(BasicBlock *MovePos) {
128   MovePos->getParent()->getBasicBlockList().splice(
129       MovePos->getIterator(), getParent()->getBasicBlockList(), getIterator());
130 }
131 
132 /// Unlink this basic block from its current function and
133 /// insert it into the function that MovePos lives in, right after MovePos.
moveAfter(BasicBlock * MovePos)134 void BasicBlock::moveAfter(BasicBlock *MovePos) {
135   MovePos->getParent()->getBasicBlockList().splice(
136       ++MovePos->getIterator(), getParent()->getBasicBlockList(),
137       getIterator());
138 }
139 
getModule() const140 const Module *BasicBlock::getModule() const {
141   return getParent()->getParent();
142 }
143 
getTerminator() const144 const Instruction *BasicBlock::getTerminator() const {
145   if (InstList.empty() || !InstList.back().isTerminator())
146     return nullptr;
147   return &InstList.back();
148 }
149 
getTerminatingMustTailCall() const150 const CallInst *BasicBlock::getTerminatingMustTailCall() const {
151   if (InstList.empty())
152     return nullptr;
153   const ReturnInst *RI = dyn_cast<ReturnInst>(&InstList.back());
154   if (!RI || RI == &InstList.front())
155     return nullptr;
156 
157   const Instruction *Prev = RI->getPrevNode();
158   if (!Prev)
159     return nullptr;
160 
161   if (Value *RV = RI->getReturnValue()) {
162     if (RV != Prev)
163       return nullptr;
164 
165     // Look through the optional bitcast.
166     if (auto *BI = dyn_cast<BitCastInst>(Prev)) {
167       RV = BI->getOperand(0);
168       Prev = BI->getPrevNode();
169       if (!Prev || RV != Prev)
170         return nullptr;
171     }
172   }
173 
174   if (auto *CI = dyn_cast<CallInst>(Prev)) {
175     if (CI->isMustTailCall())
176       return CI;
177   }
178   return nullptr;
179 }
180 
getTerminatingDeoptimizeCall() const181 const CallInst *BasicBlock::getTerminatingDeoptimizeCall() const {
182   if (InstList.empty())
183     return nullptr;
184   auto *RI = dyn_cast<ReturnInst>(&InstList.back());
185   if (!RI || RI == &InstList.front())
186     return nullptr;
187 
188   if (auto *CI = dyn_cast_or_null<CallInst>(RI->getPrevNode()))
189     if (Function *F = CI->getCalledFunction())
190       if (F->getIntrinsicID() == Intrinsic::experimental_deoptimize)
191         return CI;
192 
193   return nullptr;
194 }
195 
getFirstNonPHI() const196 const Instruction* BasicBlock::getFirstNonPHI() const {
197   for (const Instruction &I : *this)
198     if (!isa<PHINode>(I))
199       return &I;
200   return nullptr;
201 }
202 
getFirstNonPHIOrDbg() const203 const Instruction* BasicBlock::getFirstNonPHIOrDbg() const {
204   for (const Instruction &I : *this)
205     if (!isa<PHINode>(I) && !isa<DbgInfoIntrinsic>(I))
206       return &I;
207   return nullptr;
208 }
209 
getFirstNonPHIOrDbgOrLifetime() const210 const Instruction* BasicBlock::getFirstNonPHIOrDbgOrLifetime() const {
211   for (const Instruction &I : *this) {
212     if (isa<PHINode>(I) || isa<DbgInfoIntrinsic>(I))
213       continue;
214 
215     if (I.isLifetimeStartOrEnd())
216       continue;
217 
218     return &I;
219   }
220   return nullptr;
221 }
222 
getFirstInsertionPt() const223 BasicBlock::const_iterator BasicBlock::getFirstInsertionPt() const {
224   const Instruction *FirstNonPHI = getFirstNonPHI();
225   if (!FirstNonPHI)
226     return end();
227 
228   const_iterator InsertPt = FirstNonPHI->getIterator();
229   if (InsertPt->isEHPad()) ++InsertPt;
230   return InsertPt;
231 }
232 
dropAllReferences()233 void BasicBlock::dropAllReferences() {
234   for (Instruction &I : *this)
235     I.dropAllReferences();
236 }
237 
238 /// If this basic block has a single predecessor block,
239 /// return the block, otherwise return a null pointer.
getSinglePredecessor() const240 const BasicBlock *BasicBlock::getSinglePredecessor() const {
241   const_pred_iterator PI = pred_begin(this), E = pred_end(this);
242   if (PI == E) return nullptr;         // No preds.
243   const BasicBlock *ThePred = *PI;
244   ++PI;
245   return (PI == E) ? ThePred : nullptr /*multiple preds*/;
246 }
247 
248 /// If this basic block has a unique predecessor block,
249 /// return the block, otherwise return a null pointer.
250 /// Note that unique predecessor doesn't mean single edge, there can be
251 /// multiple edges from the unique predecessor to this block (for example
252 /// a switch statement with multiple cases having the same destination).
getUniquePredecessor() const253 const BasicBlock *BasicBlock::getUniquePredecessor() const {
254   const_pred_iterator PI = pred_begin(this), E = pred_end(this);
255   if (PI == E) return nullptr; // No preds.
256   const BasicBlock *PredBB = *PI;
257   ++PI;
258   for (;PI != E; ++PI) {
259     if (*PI != PredBB)
260       return nullptr;
261     // The same predecessor appears multiple times in the predecessor list.
262     // This is OK.
263   }
264   return PredBB;
265 }
266 
hasNPredecessors(unsigned N) const267 bool BasicBlock::hasNPredecessors(unsigned N) const {
268   return hasNItems(pred_begin(this), pred_end(this), N);
269 }
270 
hasNPredecessorsOrMore(unsigned N) const271 bool BasicBlock::hasNPredecessorsOrMore(unsigned N) const {
272   return hasNItemsOrMore(pred_begin(this), pred_end(this), N);
273 }
274 
getSingleSuccessor() const275 const BasicBlock *BasicBlock::getSingleSuccessor() const {
276   succ_const_iterator SI = succ_begin(this), E = succ_end(this);
277   if (SI == E) return nullptr; // no successors
278   const BasicBlock *TheSucc = *SI;
279   ++SI;
280   return (SI == E) ? TheSucc : nullptr /* multiple successors */;
281 }
282 
getUniqueSuccessor() const283 const BasicBlock *BasicBlock::getUniqueSuccessor() const {
284   succ_const_iterator SI = succ_begin(this), E = succ_end(this);
285   if (SI == E) return nullptr; // No successors
286   const BasicBlock *SuccBB = *SI;
287   ++SI;
288   for (;SI != E; ++SI) {
289     if (*SI != SuccBB)
290       return nullptr;
291     // The same successor appears multiple times in the successor list.
292     // This is OK.
293   }
294   return SuccBB;
295 }
296 
phis()297 iterator_range<BasicBlock::phi_iterator> BasicBlock::phis() {
298   PHINode *P = empty() ? nullptr : dyn_cast<PHINode>(&*begin());
299   return make_range<phi_iterator>(P, nullptr);
300 }
301 
302 /// This method is used to notify a BasicBlock that the
303 /// specified Predecessor of the block is no longer able to reach it.  This is
304 /// actually not used to update the Predecessor list, but is actually used to
305 /// update the PHI nodes that reside in the block.  Note that this should be
306 /// called while the predecessor still refers to this block.
307 ///
removePredecessor(BasicBlock * Pred,bool KeepOneInputPHIs)308 void BasicBlock::removePredecessor(BasicBlock *Pred,
309                                    bool KeepOneInputPHIs) {
310   assert((hasNUsesOrMore(16)||// Reduce cost of this assertion for complex CFGs.
311           std::find(pred_begin(this), pred_end(this), Pred) != pred_end(this)) &&
312          "removePredecessor: BB is not a predecessor!");
313 
314   if (InstList.empty()) return;
315   PHINode *APN = dyn_cast<PHINode>(&front());
316   if (!APN) return;   // Quick exit.
317 
318   // If there are exactly two predecessors, then we want to nuke the PHI nodes
319   // altogether.  However, we cannot do this, if this in this case:
320   //
321   //  Loop:
322   //    %x = phi [X, Loop]
323   //    %x2 = add %x, 1         ;; This would become %x2 = add %x2, 1
324   //    br Loop                 ;; %x2 does not dominate all uses
325   //
326   // This is because the PHI node input is actually taken from the predecessor
327   // basic block.  The only case this can happen is with a self loop, so we
328   // check for this case explicitly now.
329   //
330   unsigned max_idx = APN->getNumIncomingValues();
331   assert(max_idx != 0 && "PHI Node in block with 0 predecessors!?!?!");
332   if (max_idx == 2) {
333     BasicBlock *Other = APN->getIncomingBlock(APN->getIncomingBlock(0) == Pred);
334 
335     // Disable PHI elimination!
336     if (this == Other) max_idx = 3;
337   }
338 
339   // <= Two predecessors BEFORE I remove one?
340   if (max_idx <= 2 && !KeepOneInputPHIs) {
341     // Yup, loop through and nuke the PHI nodes
342     while (PHINode *PN = dyn_cast<PHINode>(&front())) {
343       // Remove the predecessor first.
344       PN->removeIncomingValue(Pred, !KeepOneInputPHIs);
345 
346       // If the PHI _HAD_ two uses, replace PHI node with its now *single* value
347       if (max_idx == 2) {
348         if (PN->getIncomingValue(0) != PN)
349           PN->replaceAllUsesWith(PN->getIncomingValue(0));
350         else
351           // We are left with an infinite loop with no entries: kill the PHI.
352           PN->replaceAllUsesWith(UndefValue::get(PN->getType()));
353         getInstList().pop_front();    // Remove the PHI node
354       }
355 
356       // If the PHI node already only had one entry, it got deleted by
357       // removeIncomingValue.
358     }
359   } else {
360     // Okay, now we know that we need to remove predecessor #pred_idx from all
361     // PHI nodes.  Iterate over each PHI node fixing them up
362     PHINode *PN;
363     for (iterator II = begin(); (PN = dyn_cast<PHINode>(II)); ) {
364       ++II;
365       PN->removeIncomingValue(Pred, false);
366       // If all incoming values to the Phi are the same, we can replace the Phi
367       // with that value.
368       Value* PNV = nullptr;
369       if (!KeepOneInputPHIs && (PNV = PN->hasConstantValue()))
370         if (PNV != PN) {
371           PN->replaceAllUsesWith(PNV);
372           PN->eraseFromParent();
373         }
374     }
375   }
376 }
377 
canSplitPredecessors() const378 bool BasicBlock::canSplitPredecessors() const {
379   const Instruction *FirstNonPHI = getFirstNonPHI();
380   if (isa<LandingPadInst>(FirstNonPHI))
381     return true;
382   // This is perhaps a little conservative because constructs like
383   // CleanupBlockInst are pretty easy to split.  However, SplitBlockPredecessors
384   // cannot handle such things just yet.
385   if (FirstNonPHI->isEHPad())
386     return false;
387   return true;
388 }
389 
isLegalToHoistInto() const390 bool BasicBlock::isLegalToHoistInto() const {
391   auto *Term = getTerminator();
392   // No terminator means the block is under construction.
393   if (!Term)
394     return true;
395 
396   // If the block has no successors, there can be no instructions to hoist.
397   assert(Term->getNumSuccessors() > 0);
398 
399   // Instructions should not be hoisted across exception handling boundaries.
400   return !Term->isExceptionalTerminator();
401 }
402 
403 /// This splits a basic block into two at the specified
404 /// instruction.  Note that all instructions BEFORE the specified iterator stay
405 /// as part of the original basic block, an unconditional branch is added to
406 /// the new BB, and the rest of the instructions in the BB are moved to the new
407 /// BB, including the old terminator.  This invalidates the iterator.
408 ///
409 /// Note that this only works on well formed basic blocks (must have a
410 /// terminator), and 'I' must not be the end of instruction list (which would
411 /// cause a degenerate basic block to be formed, having a terminator inside of
412 /// the basic block).
413 ///
splitBasicBlock(iterator I,const Twine & BBName)414 BasicBlock *BasicBlock::splitBasicBlock(iterator I, const Twine &BBName) {
415   assert(getTerminator() && "Can't use splitBasicBlock on degenerate BB!");
416   assert(I != InstList.end() &&
417          "Trying to get me to create degenerate basic block!");
418 
419   BasicBlock *New = BasicBlock::Create(getContext(), BBName, getParent(),
420                                        this->getNextNode());
421 
422   // Save DebugLoc of split point before invalidating iterator.
423   DebugLoc Loc = I->getDebugLoc();
424   // Move all of the specified instructions from the original basic block into
425   // the new basic block.
426   New->getInstList().splice(New->end(), this->getInstList(), I, end());
427 
428   // Add a branch instruction to the newly formed basic block.
429   BranchInst *BI = BranchInst::Create(New, this);
430   BI->setDebugLoc(Loc);
431 
432   // Now we must loop through all of the successors of the New block (which
433   // _were_ the successors of the 'this' block), and update any PHI nodes in
434   // successors.  If there were PHI nodes in the successors, then they need to
435   // know that incoming branches will be from New, not from Old (this).
436   //
437   New->replaceSuccessorsPhiUsesWith(this, New);
438   return New;
439 }
440 
replacePhiUsesWith(BasicBlock * Old,BasicBlock * New)441 void BasicBlock::replacePhiUsesWith(BasicBlock *Old, BasicBlock *New) {
442   // N.B. This might not be a complete BasicBlock, so don't assume
443   // that it ends with a non-phi instruction.
444   for (iterator II = begin(), IE = end(); II != IE; ++II) {
445     PHINode *PN = dyn_cast<PHINode>(II);
446     if (!PN)
447       break;
448     PN->replaceIncomingBlockWith(Old, New);
449   }
450 }
451 
replaceSuccessorsPhiUsesWith(BasicBlock * Old,BasicBlock * New)452 void BasicBlock::replaceSuccessorsPhiUsesWith(BasicBlock *Old,
453                                               BasicBlock *New) {
454   Instruction *TI = getTerminator();
455   if (!TI)
456     // Cope with being called on a BasicBlock that doesn't have a terminator
457     // yet. Clang's CodeGenFunction::EmitReturnBlock() likes to do this.
458     return;
459   llvm::for_each(successors(TI), [Old, New](BasicBlock *Succ) {
460     Succ->replacePhiUsesWith(Old, New);
461   });
462 }
463 
replaceSuccessorsPhiUsesWith(BasicBlock * New)464 void BasicBlock::replaceSuccessorsPhiUsesWith(BasicBlock *New) {
465   this->replaceSuccessorsPhiUsesWith(this, New);
466 }
467 
468 /// Return true if this basic block is a landing pad. I.e., it's
469 /// the destination of the 'unwind' edge of an invoke instruction.
isLandingPad() const470 bool BasicBlock::isLandingPad() const {
471   return isa<LandingPadInst>(getFirstNonPHI());
472 }
473 
474 /// Return the landingpad instruction associated with the landing pad.
getLandingPadInst() const475 const LandingPadInst *BasicBlock::getLandingPadInst() const {
476   return dyn_cast<LandingPadInst>(getFirstNonPHI());
477 }
478 
getIrrLoopHeaderWeight() const479 Optional<uint64_t> BasicBlock::getIrrLoopHeaderWeight() const {
480   const Instruction *TI = getTerminator();
481   if (MDNode *MDIrrLoopHeader =
482       TI->getMetadata(LLVMContext::MD_irr_loop)) {
483     MDString *MDName = cast<MDString>(MDIrrLoopHeader->getOperand(0));
484     if (MDName->getString().equals("loop_header_weight")) {
485       auto *CI = mdconst::extract<ConstantInt>(MDIrrLoopHeader->getOperand(1));
486       return Optional<uint64_t>(CI->getValue().getZExtValue());
487     }
488   }
489   return Optional<uint64_t>();
490 }
491 
skipDebugIntrinsics(BasicBlock::iterator It)492 BasicBlock::iterator llvm::skipDebugIntrinsics(BasicBlock::iterator It) {
493   while (isa<DbgInfoIntrinsic>(It))
494     ++It;
495   return It;
496 }
497