diff options
| author | Chris Lattner <sabre@nondot.org> | 2001-09-07 21:02:14 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2001-09-07 21:02:14 +0000 |
| commit | 02e8c974dd6625b54a0687db038ee105fc7ba022 (patch) | |
| tree | f48b033d6867e5c84b102f2a46c8e706ae8fed1c | |
| parent | fc8566a1ed62aadc793acace4ca564f30a7bcc2e (diff) | |
| download | bcm5719-llvm-02e8c974dd6625b54a0687db038ee105fc7ba022.tar.gz bcm5719-llvm-02e8c974dd6625b54a0687db038ee105fc7ba022.zip | |
* Don't predefine ReversePostOrderTraversal because it adds a dependence on vector
* static ctor/dtor is actually a REALLY good idea
* Remove explicit copy ctor and op=
llvm-svn: 480
| -rw-r--r-- | llvm/include/llvm/CFG.h | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/llvm/include/llvm/CFG.h b/llvm/include/llvm/CFG.h index 5e3c1f3d979..377d3196cec 100644 --- a/llvm/include/llvm/CFG.h +++ b/llvm/include/llvm/CFG.h @@ -391,6 +391,7 @@ class POIterator : public std::forward_iterator<BBType, ptrdiff_t> { } } } + public: typedef POIterator<BBType, SuccItTy> _Self; @@ -400,18 +401,6 @@ public: traverseChild(); } inline POIterator() { /* End is when stack is empty */ } -#if 0 - inline POIterator(const _Self& x) - : Visited(x.Visited), VisitStack(x.VisitStack) { - } - - inline POIterator& operator=(const _Self& x) { - Visited = x.Visited; - VisitStack = x.VisitStack; - return *this; - } -#endif - inline bool operator==(const _Self& x) const { return VisitStack == x.VisitStack; @@ -438,6 +427,10 @@ public: inline _Self operator++(int) { // Postincrement _Self tmp = *this; ++*this; return tmp; } + + // Provide default begin and end methods when nothing special is needed. + static inline _Self begin (BBType *BB) { return _Self(BB); } + static inline _Self end (BBType *BB) { return _Self(); } }; inline po_iterator po_begin( Method *M) { @@ -467,9 +460,30 @@ inline po_const_iterator po_end (const BasicBlock *BB) { } -//===----------------------------------------------------------------------===// +//===--------------------------------------------------------------------===// // Reverse Post Order CFG iterator code +//===--------------------------------------------------------------------===// +// +// This is used to visit basic blocks in a method in reverse post order. This +// class is awkward to use because I don't know a good incremental algorithm to +// computer RPO from a graph. Because of this, the construction of the +// ReversePostOrderTraversal object is expensive (it must walk the entire graph +// with a postorder iterator to build the data structures). The moral of this +// story is: Don't create more ReversePostOrderTraversal classes than neccesary. // +// This class should be used like this: +// { +// cfg::ReversePostOrderTraversal RPOT(MethodPtr); // Expensive to create +// for (cfg::rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) { +// ... +// } +// for (cfg::rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) { +// ... +// } +// } +// + +typedef reverse_iterator<vector<BasicBlock*>::iterator> rpo_iterator; class ReversePostOrderTraversal { vector<BasicBlock*> Blocks; // Block list in normal PO order |

