summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-02-24 21:48:59 +0000
committerChris Lattner <sabre@nondot.org>2002-02-24 21:48:59 +0000
commitc141abf8f2fd7d889b9092a202cffd650e404daa (patch)
tree52495015813b2df2be229203ef847ceaf98ea8f0
parentee6f2affbec7d718a48efe8b64d94d6b0283b5ba (diff)
downloadbcm5719-llvm-c141abf8f2fd7d889b9092a202cffd650e404daa.tar.gz
bcm5719-llvm-c141abf8f2fd7d889b9092a202cffd650e404daa.zip
Genericize the ReversePostOrderIterator.
llvm-svn: 1785
-rw-r--r--llvm/include/Support/PostOrderIterator.h26
-rw-r--r--llvm/tools/dis/dis.cpp2
-rw-r--r--llvm/tools/llvm-dis/dis.cpp2
-rw-r--r--llvm/tools/llvm-dis/llvm-dis.cpp2
4 files changed, 14 insertions, 18 deletions
diff --git a/llvm/include/Support/PostOrderIterator.h b/llvm/include/Support/PostOrderIterator.h
index 97027114cf9..29d315e89c9 100644
--- a/llvm/include/Support/PostOrderIterator.h
+++ b/llvm/include/Support/PostOrderIterator.h
@@ -112,32 +112,28 @@ ipo_iterator<T> 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<Method*> 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<BasicBlock*>::reverse_iterator rpo_iterator;
-// TODO: FIXME: ReversePostOrderTraversal is not generic!
+template<class GraphT, class GT = GraphTraits<GraphT> >
class ReversePostOrderTraversal {
- std::vector<BasicBlock*> Blocks; // Block list in normal PO order
- inline void Initialize(BasicBlock *BB) {
+ typedef typename GT::NodeType NodeType;
+ std::vector<NodeType*> 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<NodeType*>::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/llvm/tools/dis/dis.cpp b/llvm/tools/dis/dis.cpp
index 3495465d3f4..04fc60b2f1f 100644
--- a/llvm/tools/dis/dis.cpp
+++ b/llvm/tools/dis/dis.cpp
@@ -124,7 +124,7 @@ int main(int argc, char **argv) {
std::ostream_iterator<BasicBlock*>(*Out, "\n"));
break;
case rpo: { // Reverse Post Order
- ReversePostOrderTraversal RPOT(M);
+ ReversePostOrderTraversal<Method*> RPOT(M);
copy(RPOT.begin(), RPOT.end(),
std::ostream_iterator<BasicBlock*>(*Out, "\n"));
break;
diff --git a/llvm/tools/llvm-dis/dis.cpp b/llvm/tools/llvm-dis/dis.cpp
index 3495465d3f4..04fc60b2f1f 100644
--- a/llvm/tools/llvm-dis/dis.cpp
+++ b/llvm/tools/llvm-dis/dis.cpp
@@ -124,7 +124,7 @@ int main(int argc, char **argv) {
std::ostream_iterator<BasicBlock*>(*Out, "\n"));
break;
case rpo: { // Reverse Post Order
- ReversePostOrderTraversal RPOT(M);
+ ReversePostOrderTraversal<Method*> RPOT(M);
copy(RPOT.begin(), RPOT.end(),
std::ostream_iterator<BasicBlock*>(*Out, "\n"));
break;
diff --git a/llvm/tools/llvm-dis/llvm-dis.cpp b/llvm/tools/llvm-dis/llvm-dis.cpp
index 3495465d3f4..04fc60b2f1f 100644
--- a/llvm/tools/llvm-dis/llvm-dis.cpp
+++ b/llvm/tools/llvm-dis/llvm-dis.cpp
@@ -124,7 +124,7 @@ int main(int argc, char **argv) {
std::ostream_iterator<BasicBlock*>(*Out, "\n"));
break;
case rpo: { // Reverse Post Order
- ReversePostOrderTraversal RPOT(M);
+ ReversePostOrderTraversal<Method*> RPOT(M);
copy(RPOT.begin(), RPOT.end(),
std::ostream_iterator<BasicBlock*>(*Out, "\n"));
break;
OpenPOWER on IntegriCloud