diff --git a/llvm/include/llvm/IR/Dominators.h b/llvm/include/llvm/IR/Dominators.h --- a/llvm/include/llvm/IR/Dominators.h +++ b/llvm/include/llvm/IR/Dominators.h @@ -190,22 +190,6 @@ // DominatorTree GraphTraits specializations so the DominatorTree can be // iterable by generic graph iterators. -template struct DomTreeGraphTraitsBase { - using NodeRef = Node *; - using ChildIteratorType = ChildIterator; - using nodes_iterator = df_iterator>; - - static NodeRef getEntryNode(NodeRef N) { return N; } - static ChildIteratorType child_begin(NodeRef N) { return N->begin(); } - static ChildIteratorType child_end(NodeRef N) { return N->end(); } - - static nodes_iterator nodes_begin(NodeRef N) { - return df_begin(getEntryNode(N)); - } - - static nodes_iterator nodes_end(NodeRef N) { return df_end(getEntryNode(N)); } -}; - template <> struct GraphTraits : public DomTreeGraphTraitsBase { diff --git a/llvm/include/llvm/Support/GenericDomTree.h b/llvm/include/llvm/Support/GenericDomTree.h --- a/llvm/include/llvm/Support/GenericDomTree.h +++ b/llvm/include/llvm/Support/GenericDomTree.h @@ -27,6 +27,7 @@ #define LLVM_SUPPORT_GENERICDOMTREE_H #include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/GraphTraits.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallPtrSet.h" @@ -818,6 +819,36 @@ template using PostDomTreeBase = DominatorTreeBase; +//===------------------------------------- +// GraphTraits specializations so that the generic type-erased dominator tree +// can be iterated by generic graph iterators. + +template struct DomTreeGraphTraitsBase { + using NodeRef = Node *; + using ChildIteratorType = ChildIterator; + using nodes_iterator = df_iterator>; + + static NodeRef getEntryNode(NodeRef N) { return N; } + static ChildIteratorType child_begin(NodeRef N) { return N->begin(); } + static ChildIteratorType child_end(NodeRef N) { return N->end(); } + + static nodes_iterator nodes_begin(NodeRef N) { + return df_begin(getEntryNode(N)); + } + + static nodes_iterator nodes_end(NodeRef N) { return df_end(getEntryNode(N)); } +}; + +template <> +struct GraphTraits + : public DomTreeGraphTraitsBase {}; + +template <> +struct GraphTraits + : public DomTreeGraphTraitsBase {}; + } // end namespace llvm #endif // LLVM_SUPPORT_GENERICDOMTREE_H