From: Chris Lattner Date: Sun, 24 Feb 2002 21:48:59 +0000 (+0000) Subject: Genericize the ReversePostOrderIterator. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=04bb837cc0edf2f1908a0ec9b04989598a13cc6a;p=oota-llvm.git Genericize the ReversePostOrderIterator. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1785 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/Support/PostOrderIterator.h b/include/Support/PostOrderIterator.h index 97027114cf9..29d315e89c9 100644 --- a/include/Support/PostOrderIterator.h +++ b/include/Support/PostOrderIterator.h @@ -112,32 +112,28 @@ ipo_iterator ipo_end(T G){ // // 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) { +// ReversePostOrderTraversal RPOT(MethodPtr); // Expensive to create +// for (rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) { // ... // } -// for (cfg::rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) { +// for (rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) { // ... // } // } // -#include "llvm/BasicBlock.h" // FIXME! -#include "llvm/Method.h" // FIXME! - -typedef std::vector::reverse_iterator rpo_iterator; -// TODO: FIXME: ReversePostOrderTraversal is not generic! +template > class ReversePostOrderTraversal { - std::vector Blocks; // Block list in normal PO order - inline void Initialize(BasicBlock *BB) { + typedef typename GT::NodeType NodeType; + std::vector Blocks; // Block list in normal PO order + inline void Initialize(NodeType *BB) { copy(po_begin(BB), po_end(BB), back_inserter(Blocks)); } public: - inline ReversePostOrderTraversal(Method *M) { - Initialize(M->front()); - } - inline ReversePostOrderTraversal(BasicBlock *BB) { - Initialize(BB); + typedef std::vector::reverse_iterator rpo_iterator; + + inline ReversePostOrderTraversal(GraphT G) { + Initialize(GT::getEntryNode(G)); } // Because we want a reverse post order, use reverse iterators from the vector diff --git a/include/llvm/ADT/PostOrderIterator.h b/include/llvm/ADT/PostOrderIterator.h index 97027114cf9..29d315e89c9 100644 --- a/include/llvm/ADT/PostOrderIterator.h +++ b/include/llvm/ADT/PostOrderIterator.h @@ -112,32 +112,28 @@ ipo_iterator ipo_end(T G){ // // 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) { +// ReversePostOrderTraversal RPOT(MethodPtr); // Expensive to create +// for (rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) { // ... // } -// for (cfg::rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) { +// for (rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) { // ... // } // } // -#include "llvm/BasicBlock.h" // FIXME! -#include "llvm/Method.h" // FIXME! - -typedef std::vector::reverse_iterator rpo_iterator; -// TODO: FIXME: ReversePostOrderTraversal is not generic! +template > class ReversePostOrderTraversal { - std::vector Blocks; // Block list in normal PO order - inline void Initialize(BasicBlock *BB) { + typedef typename GT::NodeType NodeType; + std::vector Blocks; // Block list in normal PO order + inline void Initialize(NodeType *BB) { copy(po_begin(BB), po_end(BB), back_inserter(Blocks)); } public: - inline ReversePostOrderTraversal(Method *M) { - Initialize(M->front()); - } - inline ReversePostOrderTraversal(BasicBlock *BB) { - Initialize(BB); + typedef std::vector::reverse_iterator rpo_iterator; + + inline ReversePostOrderTraversal(GraphT G) { + Initialize(GT::getEntryNode(G)); } // Because we want a reverse post order, use reverse iterators from the vector diff --git a/tools/dis/dis.cpp b/tools/dis/dis.cpp index 3495465d3f4..04fc60b2f1f 100644 --- a/tools/dis/dis.cpp +++ b/tools/dis/dis.cpp @@ -124,7 +124,7 @@ int main(int argc, char **argv) { std::ostream_iterator(*Out, "\n")); break; case rpo: { // Reverse Post Order - ReversePostOrderTraversal RPOT(M); + ReversePostOrderTraversal RPOT(M); copy(RPOT.begin(), RPOT.end(), std::ostream_iterator(*Out, "\n")); break; diff --git a/tools/llvm-dis/dis.cpp b/tools/llvm-dis/dis.cpp index 3495465d3f4..04fc60b2f1f 100644 --- a/tools/llvm-dis/dis.cpp +++ b/tools/llvm-dis/dis.cpp @@ -124,7 +124,7 @@ int main(int argc, char **argv) { std::ostream_iterator(*Out, "\n")); break; case rpo: { // Reverse Post Order - ReversePostOrderTraversal RPOT(M); + ReversePostOrderTraversal RPOT(M); copy(RPOT.begin(), RPOT.end(), std::ostream_iterator(*Out, "\n")); break; diff --git a/tools/llvm-dis/llvm-dis.cpp b/tools/llvm-dis/llvm-dis.cpp index 3495465d3f4..04fc60b2f1f 100644 --- a/tools/llvm-dis/llvm-dis.cpp +++ b/tools/llvm-dis/llvm-dis.cpp @@ -124,7 +124,7 @@ int main(int argc, char **argv) { std::ostream_iterator(*Out, "\n")); break; case rpo: { // Reverse Post Order - ReversePostOrderTraversal RPOT(M); + ReversePostOrderTraversal RPOT(M); copy(RPOT.begin(), RPOT.end(), std::ostream_iterator(*Out, "\n")); break;