Genericize the ReversePostOrderIterator.

llvm-svn: 1785
This commit is contained in:
Chris Lattner 2002-02-24 21:48:59 +00:00
parent ee6f2affbe
commit c141abf8f2
4 changed files with 14 additions and 18 deletions

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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;