diff options
Diffstat (limited to 'include/llvm/IR/BasicBlock.h')
-rw-r--r-- | include/llvm/IR/BasicBlock.h | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/include/llvm/IR/BasicBlock.h b/include/llvm/IR/BasicBlock.h index c917b1f2cada..235cb57cfd09 100644 --- a/include/llvm/IR/BasicBlock.h +++ b/include/llvm/IR/BasicBlock.h @@ -33,6 +33,7 @@ class Function; class LandingPadInst; class LLVMContext; class Module; +class PHINode; class TerminatorInst; class ValueSymbolTable; @@ -261,6 +262,50 @@ public: inline const Instruction &back() const { return InstList.back(); } inline Instruction &back() { return InstList.back(); } + /// Iterator to walk just the phi nodes in the basic block. + template <typename PHINodeT = PHINode, typename BBIteratorT = iterator> + class phi_iterator_impl + : public iterator_facade_base<phi_iterator_impl<PHINodeT, BBIteratorT>, + std::forward_iterator_tag, PHINodeT> { + friend BasicBlock; + + PHINodeT *PN; + + phi_iterator_impl(PHINodeT *PN) : PN(PN) {} + + public: + // Allow default construction to build variables, but this doesn't build + // a useful iterator. + phi_iterator_impl() = default; + + // Allow conversion between instantiations where valid. + template <typename PHINodeU, typename BBIteratorU> + phi_iterator_impl(const phi_iterator_impl<PHINodeU, BBIteratorU> &Arg) + : PN(Arg.PN) {} + + bool operator==(const phi_iterator_impl &Arg) const { return PN == Arg.PN; } + + PHINodeT &operator*() const { return *PN; } + + using phi_iterator_impl::iterator_facade_base::operator++; + phi_iterator_impl &operator++() { + assert(PN && "Cannot increment the end iterator!"); + PN = dyn_cast<PHINodeT>(std::next(BBIteratorT(PN))); + return *this; + } + }; + typedef phi_iterator_impl<> phi_iterator; + typedef phi_iterator_impl<const PHINode, BasicBlock::const_iterator> + const_phi_iterator; + + /// Returns a range that iterates over the phis in the basic block. + /// + /// Note that this cannot be used with basic blocks that have no terminator. + iterator_range<const_phi_iterator> phis() const { + return const_cast<BasicBlock *>(this)->phis(); + } + iterator_range<phi_iterator> phis(); + /// \brief Return the underlying instruction list container. /// /// Currently you need to access the underlying instruction list container |