diff --git a/llvm/include/llvm/IR/CFGDiff.h b/llvm/include/llvm/IR/CFGDiff.h --- a/llvm/include/llvm/IR/CFGDiff.h +++ b/llvm/include/llvm/IR/CFGDiff.h @@ -39,7 +39,7 @@ // templated / parametrized on using succ_iterator/pred_iterator and false/true // for the InverseEdge. -// CFGViewSuccessors and CFGViewPredecessors, both can be parametrized to +// CFGViewChildren and CFGViewPredecessors, both can be parametrized to // consider the graph inverted or not (i.e. InverseGraph). Successors // implicitly has InverseEdge = false and Predecessors implicitly has // InverseEdge = true (see calls to GraphDiff methods in there). The GraphTraits @@ -49,17 +49,17 @@ // - GraphDiff is equivalent to InverseGraph = false // - GraphDiff> is equivalent to InverseGraph = true // - second pair item is BasicBlock *, then InverseEdge = false (so it inherits -// from CFGViewSuccessors). +// from CFGViewChildren). // - second pair item is Inverse, then InverseEdge = true (so it // inherits from CFGViewPredecessors). // The 4 GraphTraits are as follows: // 1. std::pair *, BasicBlock *>> : -// CFGViewSuccessors +// CFGViewChildren // Regular CFG, children means successors, InverseGraph = false, // InverseEdge = false. // 2. std::pair> *, BasicBlock *>> : -// CFGViewSuccessors +// CFGViewChildren // Reverse the graph, get successors but reverse-apply updates, // InverseGraph = true, InverseEdge = false. // 3. std::pair *, Inverse>> : @@ -155,23 +155,27 @@ #endif }; -template struct CFGViewSuccessors { - using DataRef = const GraphDiff *; +template > +struct CFGViewChildren { + using DataRef = const GraphDiff *; + using RawNodeRef = typename GT::NodeRef; using NodeRef = std::pair; using ExistingChildIterator = - WrappedPairNodeDataIterator; + WrappedPairNodeDataIterator; struct DeletedEdgesFilter { - BasicBlock *BB; - DeletedEdgesFilter(BasicBlock *BB) : BB(BB){}; + RawNodeRef BB; + DeletedEdgesFilter(RawNodeRef BB) : BB(BB){}; bool operator()(NodeRef N) const { - return !N.first->ignoreChild(BB, N.second, false); + return !N.first->ignoreChild(BB, N.second, InverseEdge); } }; using FilterExistingChildrenIterator = filter_iterator; - using vec_iterator = SmallVectorImpl::const_iterator; + using vec_iterator = typename SmallVectorImpl::const_iterator; using AddNewChildrenIterator = WrappedPairNodeDataIterator; using ChildIteratorType = @@ -179,11 +183,11 @@ AddNewChildrenIterator>; static ChildIteratorType child_begin(NodeRef N) { - auto InsertVec = N.first->getAddedChildren(N.second, false); + auto InsertVec = N.first->getAddedChildren(N.second, InverseEdge); // filter iterator init: auto firstit = make_filter_range( - make_range({succ_begin(N.second), N.first}, - {succ_end(N.second), N.first}), + make_range({GT::child_begin(N.second), N.first}, + {GT::child_end(N.second), N.first}), DeletedEdgesFilter(N.second)); // new inserts iterator init: auto secondit = make_range( @@ -194,11 +198,11 @@ } static ChildIteratorType child_end(NodeRef N) { - auto InsertVec = N.first->getAddedChildren(N.second, false); + auto InsertVec = N.first->getAddedChildren(N.second, InverseEdge); // filter iterator init: auto firstit = make_filter_range( - make_range({succ_end(N.second), N.first}, - {succ_end(N.second), N.first}), + make_range({GT::child_end(N.second), N.first}, + {GT::child_end(N.second), N.first}), DeletedEdgesFilter(N.second)); // new inserts iterator init: auto secondit = make_range( @@ -209,76 +213,12 @@ } }; -template struct CFGViewPredecessors { - using DataRef = const GraphDiff *; - using NodeRef = std::pair; - - using ExistingChildIterator = - WrappedPairNodeDataIterator; - struct DeletedEdgesFilter { - BasicBlock *BB; - DeletedEdgesFilter(BasicBlock *BB) : BB(BB){}; - bool operator()(NodeRef N) const { - return !N.first->ignoreChild(BB, N.second, true); - } - }; - using FilterExistingChildrenIterator = - filter_iterator; - - using vec_iterator = SmallVectorImpl::const_iterator; - using AddNewChildrenIterator = - WrappedPairNodeDataIterator; - using ChildIteratorType = - concat_iterator; - - static ChildIteratorType child_begin(NodeRef N) { - auto InsertVec = N.first->getAddedChildren(N.second, true); - // filter iterator init: - auto firstit = make_filter_range( - make_range({pred_begin(N.second), N.first}, - {pred_end(N.second), N.first}), - DeletedEdgesFilter(N.second)); - // new inserts iterator init: - auto secondit = make_range( - {InsertVec.begin(), N.first}, {InsertVec.end(), N.first}); - - return concat_iterator(firstit, secondit); - } - - static ChildIteratorType child_end(NodeRef N) { - auto InsertVec = N.first->getAddedChildren(N.second, true); - // filter iterator init: - auto firstit = make_filter_range( - make_range({pred_end(N.second), N.first}, - {pred_end(N.second), N.first}), - DeletedEdgesFilter(N.second)); - // new inserts iterator init: - auto secondit = make_range( - {InsertVec.end(), N.first}, {InsertVec.end(), N.first}); - - return concat_iterator(firstit, secondit); - } -}; - -template <> -struct GraphTraits< - std::pair *, BasicBlock *>> - : CFGViewSuccessors {}; -template <> -struct GraphTraits< - std::pair *, BasicBlock *>> - : CFGViewSuccessors {}; -template <> -struct GraphTraits< - std::pair *, Inverse>> - : CFGViewPredecessors {}; -template <> -struct GraphTraits< - std::pair *, Inverse>> - : CFGViewPredecessors {}; +template +struct GraphTraits *, T>> + : CFGViewChildren {}; +template +struct GraphTraits *, Inverse>> + : CFGViewChildren, B, true> {}; } // end namespace llvm #endif // LLVM_IR_CFGDIFF_H