- // splitBasicBlock - This splits a basic block into two at the specified
- // instruction. Note that all instructions BEFORE the specified iterator stay
- // as part of the original basic block, an unconditional branch is added to
- // the new BB, and the rest of the instructions in the BB are moved to the new
- // BB, including the old terminator. The newly formed BasicBlock is returned.
- // This function invalidates the specified iterator.
- //
- // Note that this only works on well formed basic blocks (must have a
- // terminator), and 'I' must not be the end of instruction list (which would
- // cause a degenerate basic block to be formed, having a terminator inside of
- // the basic block).
- //
- BasicBlock *splitBasicBlock(iterator I);
+ /// removePredecessor - This method is used to notify a BasicBlock that the
+ /// specified Predecessor of the block is no longer able to reach it. This is
+ /// actually not used to update the Predecessor list, but is actually used to
+ /// update the PHI nodes that reside in the block. Note that this should be
+ /// called while the predecessor still refers to this block.
+ ///
+ void removePredecessor(BasicBlock *Pred, bool DontDeleteUselessPHIs = false);
+
+ /// splitBasicBlock - This splits a basic block into two at the specified
+ /// instruction. Note that all instructions BEFORE the specified iterator
+ /// stay as part of the original basic block, an unconditional branch is added
+ /// to the original BB, and the rest of the instructions in the BB are moved
+ /// to the new BB, including the old terminator. The newly formed BasicBlock
+ /// is returned. This function invalidates the specified iterator.
+ ///
+ /// Note that this only works on well formed basic blocks (must have a
+ /// terminator), and 'I' must not be the end of instruction list (which would
+ /// cause a degenerate basic block to be formed, having a terminator inside of
+ /// the basic block).
+ ///
+ BasicBlock *splitBasicBlock(iterator I, const std::string &BBName = "");
+
+
+ static unsigned getInstListOffset() {
+ BasicBlock *Obj = 0;
+ return unsigned(reinterpret_cast<uintptr_t>(&Obj->InstList));
+ }
+
+private:
+ // getNext/Prev - Return the next or previous basic block in the list. Access
+ // these with Function::iterator.
+ BasicBlock *getNext() { return Next; }
+ const BasicBlock *getNext() const { return Next; }
+ BasicBlock *getPrev() { return Prev; }
+ const BasicBlock *getPrev() const { return Prev; }