- // 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);
-
- // 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);
-
-
- //===--------------------------------------------------------------------===//
- // Predecessor and Successor Iterators
- //
- template <class _Ptr, class _USE_iterator> // Predecessor Iterator
- class PredIterator : public std::bidirectional_iterator<_Ptr, ptrdiff_t> {
- _Ptr *BB;
- _USE_iterator It;
- public:
- typedef PredIterator<_Ptr,_USE_iterator> _Self;
-
- inline void advancePastConstants() {
- // TODO: This is bad
- // Loop to ignore constant pool references
- while (It != BB->use_end() && !isa<TerminatorInst>(*It))
- ++It;
- }
-
- inline PredIterator(_Ptr *bb) : BB(bb), It(bb->use_begin()) {
- advancePastConstants();
- }
- inline PredIterator(_Ptr *bb, bool) : BB(bb), It(bb->use_end()) {}
-
- inline bool operator==(const _Self& x) const { return It == x.It; }
- inline bool operator!=(const _Self& x) const { return !operator==(x); }
-
- inline pointer operator*() const {
- return cast<Instruction>(*It)->getParent();
- }
- inline pointer *operator->() const { return &(operator*()); }
-
- inline _Self& operator++() { // Preincrement
- ++It; advancePastConstants();
- return *this;
- }
-
- inline _Self operator++(int) { // Postincrement
- _Self tmp = *this; ++*this; return tmp;
- }
-
- inline _Self& operator--() { --It; return *this; } // Predecrement
- inline _Self operator--(int) { // Postdecrement
- _Self tmp = *this; --*this; return tmp;
- }
- };
+ /// 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 = "");