BasicBlock.cpp revision dd49dbfe44098eb53b1ac29f017e422147572bbb
1//===-- BasicBlock.cpp - Implement BasicBlock related methods -------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the BasicBlock class for the VMCore library.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/BasicBlock.h"
15#include "llvm/Constants.h"
16#include "llvm/Instructions.h"
17#include "llvm/Type.h"
18#include "llvm/Support/CFG.h"
19#include "llvm/Support/LeakDetector.h"
20#include "SymbolTableListTraitsImpl.h"
21#include <algorithm>
22using namespace llvm;
23
24namespace {
25  /// DummyInst - An instance of this class is used to mark the end of the
26  /// instruction list.  This is not a real instruction.
27  struct DummyInst : public Instruction {
28    DummyInst() : Instruction(Type::VoidTy, OtherOpsEnd, 0, 0) {
29      // This should not be garbage monitored.
30      LeakDetector::removeGarbageObject(this);
31    }
32
33    virtual Instruction *clone() const {
34      assert(0 && "Cannot clone EOL");abort();
35      return 0;
36    }
37    virtual const char *getOpcodeName() const { return "*end-of-list-inst*"; }
38
39    // Methods for support type inquiry through isa, cast, and dyn_cast...
40    static inline bool classof(const DummyInst *) { return true; }
41    static inline bool classof(const Instruction *I) {
42      return I->getOpcode() == OtherOpsEnd;
43    }
44    static inline bool classof(const Value *V) {
45      return isa<Instruction>(V) && classof(cast<Instruction>(V));
46    }
47  };
48}
49
50Instruction *ilist_traits<Instruction>::createSentinel() {
51  return new DummyInst();
52}
53iplist<Instruction> &ilist_traits<Instruction>::getList(BasicBlock *BB) {
54  return BB->getInstList();
55}
56
57// Explicit instantiation of SymbolTableListTraits since some of the methods
58// are not in the public header file...
59template class SymbolTableListTraits<Instruction, BasicBlock, Function>;
60
61
62BasicBlock::BasicBlock(const std::string &Name, Function *Parent,
63                       BasicBlock *InsertBefore)
64  : Value(Type::LabelTy, Value::BasicBlockVal, Name) {
65  // Initialize the instlist...
66  InstList.setItemParent(this);
67
68  // Make sure that we get added to a function
69  LeakDetector::addGarbageObject(this);
70
71  if (InsertBefore) {
72    assert(Parent &&
73           "Cannot insert block before another block with no function!");
74    Parent->getBasicBlockList().insert(InsertBefore, this);
75  } else if (Parent) {
76    Parent->getBasicBlockList().push_back(this);
77  }
78}
79
80
81BasicBlock::~BasicBlock() {
82  assert(getParent() == 0 && "BasicBlock still linked into the program!");
83  dropAllReferences();
84  InstList.clear();
85}
86
87void BasicBlock::setParent(Function *parent) {
88  if (getParent())
89    LeakDetector::addGarbageObject(this);
90
91  InstList.setParent(parent);
92
93  if (getParent())
94    LeakDetector::removeGarbageObject(this);
95}
96
97void BasicBlock::removeFromParent() {
98  getParent()->getBasicBlockList().remove(this);
99}
100
101void BasicBlock::eraseFromParent() {
102  getParent()->getBasicBlockList().erase(this);
103}
104
105/// moveBefore - Unlink this instruction from its current function and
106/// insert it into the function that MovePos lives in, right before
107/// MovePos.
108void BasicBlock::moveBefore(BasicBlock *MovePos) {
109  MovePos->getParent()->getBasicBlockList().splice(MovePos,
110                       getParent()->getBasicBlockList(), this);
111}
112
113
114TerminatorInst *BasicBlock::getTerminator() {
115  if (InstList.empty()) return 0;
116  return dyn_cast<TerminatorInst>(&InstList.back());
117}
118
119const TerminatorInst *const BasicBlock::getTerminator() const {
120  if (InstList.empty()) return 0;
121  return dyn_cast<TerminatorInst>(&InstList.back());
122}
123
124Instruction* BasicBlock::getFirstNonPHI()
125{
126    BasicBlock::iterator i = begin(), e = end();
127    // All valid basic blocks should have a terminator,
128    // which is not a PHINode. If we have invalid basic
129    // block we'll get assert when dereferencing past-the-end
130    // iterator.
131    while (isa<PHINode>(i)) ++i;
132    return &*i;
133}
134
135void BasicBlock::dropAllReferences() {
136  for(iterator I = begin(), E = end(); I != E; ++I)
137    I->dropAllReferences();
138}
139
140/// getSinglePredecessor - If this basic block has a single predecessor block,
141/// return the block, otherwise return a null pointer.
142BasicBlock *BasicBlock::getSinglePredecessor() {
143  pred_iterator PI = pred_begin(this), E = pred_end(this);
144  if (PI == E) return 0;         // No preds.
145  BasicBlock *ThePred = *PI;
146  ++PI;
147  return (PI == E) ? ThePred : 0 /*multiple preds*/;
148}
149
150/// removePredecessor - This method is used to notify a BasicBlock that the
151/// specified Predecessor of the block is no longer able to reach it.  This is
152/// actually not used to update the Predecessor list, but is actually used to
153/// update the PHI nodes that reside in the block.  Note that this should be
154/// called while the predecessor still refers to this block.
155///
156void BasicBlock::removePredecessor(BasicBlock *Pred,
157                                   bool DontDeleteUselessPHIs) {
158  assert((hasNUsesOrMore(16)||// Reduce cost of this assertion for complex CFGs.
159          find(pred_begin(this), pred_end(this), Pred) != pred_end(this)) &&
160         "removePredecessor: BB is not a predecessor!");
161
162  if (InstList.empty()) return;
163  PHINode *APN = dyn_cast<PHINode>(&front());
164  if (!APN) return;   // Quick exit.
165
166  // If there are exactly two predecessors, then we want to nuke the PHI nodes
167  // altogether.  However, we cannot do this, if this in this case:
168  //
169  //  Loop:
170  //    %x = phi [X, Loop]
171  //    %x2 = add %x, 1         ;; This would become %x2 = add %x2, 1
172  //    br Loop                 ;; %x2 does not dominate all uses
173  //
174  // This is because the PHI node input is actually taken from the predecessor
175  // basic block.  The only case this can happen is with a self loop, so we
176  // check for this case explicitly now.
177  //
178  unsigned max_idx = APN->getNumIncomingValues();
179  assert(max_idx != 0 && "PHI Node in block with 0 predecessors!?!?!");
180  if (max_idx == 2) {
181    BasicBlock *Other = APN->getIncomingBlock(APN->getIncomingBlock(0) == Pred);
182
183    // Disable PHI elimination!
184    if (this == Other) max_idx = 3;
185  }
186
187  // <= Two predecessors BEFORE I remove one?
188  if (max_idx <= 2 && !DontDeleteUselessPHIs) {
189    // Yup, loop through and nuke the PHI nodes
190    while (PHINode *PN = dyn_cast<PHINode>(&front())) {
191      // Remove the predecessor first.
192      PN->removeIncomingValue(Pred, !DontDeleteUselessPHIs);
193
194      // If the PHI _HAD_ two uses, replace PHI node with its now *single* value
195      if (max_idx == 2) {
196        if (PN->getOperand(0) != PN)
197          PN->replaceAllUsesWith(PN->getOperand(0));
198        else
199          // We are left with an infinite loop with no entries: kill the PHI.
200          PN->replaceAllUsesWith(UndefValue::get(PN->getType()));
201        getInstList().pop_front();    // Remove the PHI node
202      }
203
204      // If the PHI node already only had one entry, it got deleted by
205      // removeIncomingValue.
206    }
207  } else {
208    // Okay, now we know that we need to remove predecessor #pred_idx from all
209    // PHI nodes.  Iterate over each PHI node fixing them up
210    PHINode *PN;
211    for (iterator II = begin(); (PN = dyn_cast<PHINode>(II)); ) {
212      ++II;
213      PN->removeIncomingValue(Pred, false);
214      // If all incoming values to the Phi are the same, we can replace the Phi
215      // with that value.
216      if (Value *PNV = PN->hasConstantValue()) {
217        PN->replaceAllUsesWith(PNV);
218        PN->eraseFromParent();
219      }
220    }
221  }
222}
223
224
225/// splitBasicBlock - This splits a basic block into two at the specified
226/// instruction.  Note that all instructions BEFORE the specified iterator stay
227/// as part of the original basic block, an unconditional branch is added to
228/// the new BB, and the rest of the instructions in the BB are moved to the new
229/// BB, including the old terminator.  This invalidates the iterator.
230///
231/// Note that this only works on well formed basic blocks (must have a
232/// terminator), and 'I' must not be the end of instruction list (which would
233/// cause a degenerate basic block to be formed, having a terminator inside of
234/// the basic block).
235///
236BasicBlock *BasicBlock::splitBasicBlock(iterator I, const std::string &BBName) {
237  assert(getTerminator() && "Can't use splitBasicBlock on degenerate BB!");
238  assert(I != InstList.end() &&
239         "Trying to get me to create degenerate basic block!");
240
241  BasicBlock *New = new BasicBlock(BBName, getParent(), getNext());
242
243  // Move all of the specified instructions from the original basic block into
244  // the new basic block.
245  New->getInstList().splice(New->end(), this->getInstList(), I, end());
246
247  // Add a branch instruction to the newly formed basic block.
248  new BranchInst(New, this);
249
250  // Now we must loop through all of the successors of the New block (which
251  // _were_ the successors of the 'this' block), and update any PHI nodes in
252  // successors.  If there were PHI nodes in the successors, then they need to
253  // know that incoming branches will be from New, not from Old.
254  //
255  for (succ_iterator I = succ_begin(New), E = succ_end(New); I != E; ++I) {
256    // Loop over any phi nodes in the basic block, updating the BB field of
257    // incoming values...
258    BasicBlock *Successor = *I;
259    PHINode *PN;
260    for (BasicBlock::iterator II = Successor->begin();
261         (PN = dyn_cast<PHINode>(II)); ++II) {
262      int IDX = PN->getBasicBlockIndex(this);
263      while (IDX != -1) {
264        PN->setIncomingBlock((unsigned)IDX, New);
265        IDX = PN->getBasicBlockIndex(this);
266      }
267    }
268  }
269  return New;
270}
271