Author: asl Date: Sat Dec 15 16:23:24 2007 New Revision: 45063 URL: http://llvm.org/viewvc/llvm-project?rev=45063&view=rev Log: Use references in DF iterators. This eliminates copy-ctor calls on huge objects (graphs)
Modified: llvm/trunk/include/llvm/ADT/DepthFirstIterator.h llvm/trunk/include/llvm/ADT/GraphTraits.h Modified: llvm/trunk/include/llvm/ADT/DepthFirstIterator.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/DepthFirstIterator.h?rev=45063&r1=45062&r2=45063&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/DepthFirstIterator.h (original) +++ llvm/trunk/include/llvm/ADT/DepthFirstIterator.h Sat Dec 15 16:23:24 2007 @@ -96,16 +96,16 @@ typedef df_iterator<GraphT, SetType, ExtStorage, GT> _Self; // Provide static begin and end methods as our public "constructors" - static inline _Self begin(GraphT G) { + static inline _Self begin(const GraphT& G) { return _Self(GT::getEntryNode(G)); } - static inline _Self end(GraphT G) { return _Self(); } + static inline _Self end(const GraphT& G) { return _Self(); } // Static begin and end methods as our public ctors for external iterators - static inline _Self begin(GraphT G, SetType &S) { + static inline _Self begin(const GraphT& G, SetType &S) { return _Self(GT::getEntryNode(G), S); } - static inline _Self end(GraphT G, SetType &S) { return _Self(S); } + static inline _Self end(const GraphT& G, SetType &S) { return _Self(S); } inline bool operator==(const _Self& x) const { return VisitStack.size() == x.VisitStack.size() && @@ -162,12 +162,12 @@ // Provide global constructors that automatically figure out correct types... // template <class T> -df_iterator<T> df_begin(T G) { +df_iterator<T> df_begin(const T& G) { return df_iterator<T>::begin(G); } template <class T> -df_iterator<T> df_end(T G) { +df_iterator<T> df_end(const T& G) { return df_iterator<T>::end(G); } @@ -179,12 +179,12 @@ }; template <class T, class SetTy> -df_ext_iterator<T, SetTy> df_ext_begin(T G, SetTy &S) { +df_ext_iterator<T, SetTy> df_ext_begin(const T& G, SetTy &S) { return df_ext_iterator<T, SetTy>::begin(G, S); } template <class T, class SetTy> -df_ext_iterator<T, SetTy> df_ext_end(T G, SetTy &S) { +df_ext_iterator<T, SetTy> df_ext_end(const T& G, SetTy &S) { return df_ext_iterator<T, SetTy>::end(G, S); } @@ -199,13 +199,15 @@ }; template <class T> -idf_iterator<T> idf_begin(T G) { - return idf_iterator<T>::begin(G); +idf_iterator<T> idf_begin(const T& G) { + Inverse<T> DummyG; + return idf_iterator<T>::begin(DummyG); } template <class T> -idf_iterator<T> idf_end(T G){ - return idf_iterator<T>::end(G); +idf_iterator<T> idf_end(const T& G){ + Inverse<T> DummyG; + return idf_iterator<T>::end(DummyG); } // Provide global definitions of external inverse depth first iterators... @@ -218,13 +220,15 @@ }; template <class T, class SetTy> -idf_ext_iterator<T, SetTy> idf_ext_begin(T G, SetTy &S) { - return idf_ext_iterator<T, SetTy>::begin(G, S); +idf_ext_iterator<T, SetTy> idf_ext_begin(const T& G, SetTy &S) { + Inverse<T> DummyG(G); + return idf_ext_iterator<T, SetTy>::begin(DummyG, S); } template <class T, class SetTy> -idf_ext_iterator<T, SetTy> idf_ext_end(T G, SetTy &S) { - return idf_ext_iterator<T, SetTy>::end(G, S); +idf_ext_iterator<T, SetTy> idf_ext_end(const T& G, SetTy &S) { + Inverse<T> DummyG(G); + return idf_ext_iterator<T, SetTy>::end(DummyG, S); } } // End llvm namespace Modified: llvm/trunk/include/llvm/ADT/GraphTraits.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/GraphTraits.h?rev=45063&r1=45062&r2=45063&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/GraphTraits.h (original) +++ llvm/trunk/include/llvm/ADT/GraphTraits.h Sat Dec 15 16:23:24 2007 @@ -73,9 +73,9 @@ // template <class GraphType> struct Inverse { - GraphType &Graph; + const GraphType &Graph; - inline Inverse(GraphType &G) : Graph(G) {} + inline Inverse(const GraphType &G) : Graph(G) {} }; // Provide a partial specialization of GraphTraits so that the inverse of an inverse _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits