[llvm] 4a7f203 - Revert "CFGDiff: Simplify/common the begin/end implementations to use a common range helper"
Adrian Kuegel via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 19 03:26:10 PDT 2020
Author: Adrian Kuegel
Date: 2020-03-19T11:25:10+01:00
New Revision: 4a7f2032a350bc7eefd26709563f65216df3e2ce
URL: https://github.com/llvm/llvm-project/commit/4a7f2032a350bc7eefd26709563f65216df3e2ce
DIFF: https://github.com/llvm/llvm-project/commit/4a7f2032a350bc7eefd26709563f65216df3e2ce.diff
LOG: Revert "CFGDiff: Simplify/common the begin/end implementations to use a common range helper"
This reverts commit 79a7ed92a9b135212a6a271dd8dbc625038c8f06.
This breaks the asan buildbot.
Added:
Modified:
llvm/include/llvm/IR/CFGDiff.h
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/CFGDiff.h b/llvm/include/llvm/IR/CFGDiff.h
index a140fcb3958e..f40434cc5d4e 100644
--- a/llvm/include/llvm/IR/CFGDiff.h
+++ b/llvm/include/llvm/IR/CFGDiff.h
@@ -158,42 +158,58 @@ template <typename GraphT, bool InverseGraph = false, bool InverseEdge = false,
typename GT = GraphTraits<GraphT>>
struct CFGViewChildren {
using DataRef = const GraphDiff<typename GT::NodeRef, InverseGraph> *;
- using NodeRef = std::pair<DataRef, typename GT::NodeRef>;
-
- template<typename Range>
- static auto makeChildRange(Range &&R, DataRef DR) {
- using Iter = WrappedPairNodeDataIterator<decltype(std::forward<Range>(R).begin()), NodeRef, DataRef>;
- return make_range(Iter(R.begin(), DR), Iter(R.end(), DR));
- }
-
- static auto children(NodeRef N) {
-
+ using RawNodeRef = typename GT::NodeRef;
+ using NodeRef = std::pair<DataRef, RawNodeRef>;
+
+ using ExistingChildIterator =
+ WrappedPairNodeDataIterator<typename GT::ChildIteratorType, NodeRef,
+ DataRef>;
+ struct DeletedEdgesFilter {
+ RawNodeRef BB;
+ DeletedEdgesFilter(RawNodeRef BB) : BB(BB){};
+ bool operator()(NodeRef N) const {
+ return !N.first->ignoreChild(BB, N.second, InverseEdge);
+ }
+ };
+ using FilterExistingChildrenIterator =
+ filter_iterator<ExistingChildIterator, DeletedEdgesFilter>;
+
+ using vec_iterator = typename SmallVectorImpl<RawNodeRef>::const_iterator;
+ using AddNewChildrenIterator =
+ WrappedPairNodeDataIterator<vec_iterator, NodeRef, DataRef>;
+ using ChildIteratorType =
+ concat_iterator<NodeRef, FilterExistingChildrenIterator,
+ AddNewChildrenIterator>;
+
+ static ChildIteratorType child_begin(NodeRef N) {
+ auto InsertVec = N.first->getAddedChildren(N.second, InverseEdge);
// filter iterator init:
- auto R = make_range(GT::child_begin(N.second), GT::child_end(N.second));
- auto First = make_filter_range(makeChildRange(R, N.first), [&](NodeRef C) {
- return !C.first->ignoreChild(N.second, C.second, InverseEdge);
- });
-
+ auto firstit = make_filter_range(
+ make_range<ExistingChildIterator>({GT::child_begin(N.second), N.first},
+ {GT::child_end(N.second), N.first}),
+ DeletedEdgesFilter(N.second));
// new inserts iterator init:
- auto InsertVec = N.first->getAddedChildren(N.second, InverseEdge);
- auto Second = makeChildRange(InsertVec, N.first);
+ auto secondit = make_range<AddNewChildrenIterator>(
+ {InsertVec.begin(), N.first}, {InsertVec.end(), N.first});
- auto CR = concat<NodeRef>(First, Second);
- // concat_range contains references to other ranges, returning it would
- // leave those references dangling - the iterators contain
- // other iterators by value so they're safe to return.
- return make_range(CR.begin(), CR.end());
+ return concat_iterator<NodeRef, FilterExistingChildrenIterator,
+ AddNewChildrenIterator>(firstit, secondit);
}
- static auto child_begin(NodeRef N) {
- return children(N).begin();
- }
+ static ChildIteratorType child_end(NodeRef N) {
+ auto InsertVec = N.first->getAddedChildren(N.second, InverseEdge);
+ // filter iterator init:
+ auto firstit = make_filter_range(
+ make_range<ExistingChildIterator>({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<AddNewChildrenIterator>(
+ {InsertVec.end(), N.first}, {InsertVec.end(), N.first});
- static auto child_end(NodeRef N) {
- return children(N).end();
+ return concat_iterator<NodeRef, FilterExistingChildrenIterator,
+ AddNewChildrenIterator>(firstit, secondit);
}
-
- using ChildIteratorType = decltype(child_end(std::declval<NodeRef>()));
};
template <typename T, bool B>
More information about the llvm-commits
mailing list