From 06a715333ad77df68da1562b5b8368eb219fbfd9 Mon Sep 17 00:00:00 2001 From: Easwaran Raman Date: Thu, 1 Feb 2018 19:40:35 +0000 Subject: [PATCH] Remove CallGraphTraits and use equivalent methods in GraphTraits Summary: D42698 adds child_edge_{begin|end} and children_edges to GraphTraits which are used here. The reason for this change is to make it easy to use count propagation on ModulesummaryIndex. As it stands, CallGraphTraits is in Analysis while ModuleSummaryIndex is in IR. Reviewers: davidxl, dberlin Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D42703 llvm-svn: 323994 --- llvm/include/llvm/Analysis/CallGraph.h | 59 +++---------------- .../llvm/Analysis/SyntheticCountsUtils.h | 2 +- llvm/lib/Analysis/SyntheticCountsUtils.cpp | 4 +- 3 files changed, 12 insertions(+), 53 deletions(-) diff --git a/llvm/include/llvm/Analysis/CallGraph.h b/llvm/include/llvm/Analysis/CallGraph.h index 6c9e56e22085..8efc85f9fb02 100644 --- a/llvm/include/llvm/Analysis/CallGraph.h +++ b/llvm/include/llvm/Analysis/CallGraph.h @@ -426,12 +426,14 @@ template <> struct GraphTraits { template <> struct GraphTraits { using NodeRef = const CallGraphNode *; using CGNPairTy = CallGraphNode::CallRecord; + using EdgeRef = const CallGraphNode::CallRecord &; static NodeRef getEntryNode(const CallGraphNode *CGN) { return CGN; } static const CallGraphNode *CGNGetValue(CGNPairTy P) { return P.second; } using ChildIteratorType = mapped_iterator; + using ChildEdgeIteratorType = CallGraphNode::const_iterator; static ChildIteratorType child_begin(NodeRef N) { return ChildIteratorType(N->begin(), &CGNGetValue); @@ -440,6 +442,13 @@ template <> struct GraphTraits { static ChildIteratorType child_end(NodeRef N) { return ChildIteratorType(N->end(), &CGNGetValue); } + + static ChildEdgeIteratorType child_edge_begin(NodeRef N) { + return N->begin(); + } + static ChildEdgeIteratorType child_edge_end(NodeRef N) { return N->end(); } + + static NodeRef edge_dest(EdgeRef E) { return E.second; } }; template <> @@ -495,56 +504,6 @@ struct GraphTraits : public GraphTraits< } }; -// FIXME: The traits here are not limited to callgraphs and can be moved -// elsewhere including GraphTraits. They are left here because only algorithms -// that operate on Callgraphs currently use them. If other algorithms operating -// on a general graph need edge traversals, these can be moved. -template -struct CallGraphTraits : public GraphTraits { - // Elements to provide: - - // typedef EdgeRef - Type of Edge token in the graph, which should - // be cheap to copy. - // typedef CallEdgeIteratorType - Type used to iterate over children edges in - // graph, dereference to a EdgeRef. - - // static CallEdgeIteratorType call_edge_begin(NodeRef) - // static CallEdgeIteratorType call_edge_end (NodeRef) - // Return iterators that point to the beginning and ending of the call - // edges list for the given callgraph node. - // - // static NodeRef edge_dest(EdgeRef) - // Return the destination node of an edge. - - // If anyone tries to use this class without having an appropriate - // specialization, make an error. If you get this error, it's because you - // need to include the appropriate specialization of GraphTraits<> for your - // graph, or you need to define it for a new graph type. Either that or - // your argument to XXX_begin(...) is unknown or needs to have the proper .h - // file #include'd. - using CallEdgeIteratorType = - typename CallGraphType::UnknownCallGraphTypeError; -}; - -template -iterator_range::CallEdgeIteratorType> -call_edges(const typename CallGraphTraits::NodeRef &G) { - return make_range(CallGraphTraits::call_edge_begin(G), - CallGraphTraits::call_edge_end(G)); -} - -template <> -struct CallGraphTraits - : public GraphTraits { - using EdgeRef = const CallGraphNode::CallRecord &; - using CallEdgeIteratorType = CallGraphNode::const_iterator; - - static CallEdgeIteratorType call_edge_begin(NodeRef N) { return N->begin(); } - static CallEdgeIteratorType call_edge_end(NodeRef N) { return N->end(); } - - static NodeRef edge_dest(EdgeRef E) { return E.second; } -}; - } // end namespace llvm #endif // LLVM_ANALYSIS_CALLGRAPH_H diff --git a/llvm/include/llvm/Analysis/SyntheticCountsUtils.h b/llvm/include/llvm/Analysis/SyntheticCountsUtils.h index 7b633c0b53f6..87f4a0100b38 100644 --- a/llvm/include/llvm/Analysis/SyntheticCountsUtils.h +++ b/llvm/include/llvm/Analysis/SyntheticCountsUtils.h @@ -31,7 +31,7 @@ class Function; template class SyntheticCountsUtils { public: using Scaled64 = ScaledNumber; - using CGT = CallGraphTraits; + using CGT = GraphTraits; using NodeRef = typename CGT::NodeRef; using EdgeRef = typename CGT::EdgeRef; using SccTy = std::vector; diff --git a/llvm/lib/Analysis/SyntheticCountsUtils.cpp b/llvm/lib/Analysis/SyntheticCountsUtils.cpp index 22b402b21e64..b085fa274d7f 100644 --- a/llvm/lib/Analysis/SyntheticCountsUtils.cpp +++ b/llvm/lib/Analysis/SyntheticCountsUtils.cpp @@ -38,7 +38,7 @@ void SyntheticCountsUtils::propagateFromSCC( // Partition the edges coming out of the SCC into those whose destination is // in the SCC and the rest. for (const auto &Node : SCCNodes) { - for (auto &E : call_edges(Node)) { + for (auto &E : children_edges(Node)) { if (SCCNodes.count(CGT::edge_dest(E))) SCCEdges.emplace_back(Node, E); else @@ -89,7 +89,7 @@ void SyntheticCountsUtils::propagateFromSCC( /// This performs a reverse post-order traversal of the callgraph SCC. For each /// SCC, it first propagates the entry counts to the nodes within the SCC /// through call edges and updates them in one shot. Then the entry counts are -/// propagated to nodes outside the SCC. This requires \p CallGraphTraits +/// propagated to nodes outside the SCC. This requires \p GraphTraits /// to have a specialization for \p CallGraphType. template