[llvm] [MemProf] Support cloning through recursive cycles (PR #127429)
Teresa Johnson via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 19 09:22:52 PST 2025
================
@@ -293,37 +298,35 @@ class CallsiteContextGraph {
// TODO: Should this be a map (from Caller node) for more efficient lookup?
std::vector<std::shared_ptr<ContextEdge>> CallerEdges;
- // Get the list of edges from which we can compute allocation information
- // such as the context ids and allocation type of this node.
- const std::vector<std::shared_ptr<ContextEdge>> *
- getEdgesWithAllocInfo() const {
- // If node has any callees, compute from those, otherwise compute from
- // callers (i.e. if this is the leaf allocation node).
- if (!CalleeEdges.empty())
- return &CalleeEdges;
+ // Returns true if we need to look at the callee edges for determining the
+ // node context ids and allocation type.
+ bool useCallerEdgesForContextInfo() const {
// Typically if the callee edges are empty either the caller edges are
// also empty, or this is an allocation (leaf node). However, if we are
// allowing recursive callsites and contexts this will be violated for
// incompletely cloned recursive cycles.
- assert(CallerEdges.empty() || IsAllocation ||
+ assert(!CalleeEdges.empty() || CallerEdges.empty() || IsAllocation ||
(AllowRecursiveCallsites && AllowRecursiveContexts));
- if (!CallerEdges.empty() && IsAllocation)
- return &CallerEdges;
- return nullptr;
+ // When cloning for a recursive context, during cloning we might be in the
+ // midst of cloning for a recurrence and have moved context ids off of a
+ // caller edge onto the clone but not yet off of the incoming caller
+ // (back) edge. If we don't look at those we miss the fact that this node
+ // still has context ids of interest.
+ return IsAllocation || CloneRecursiveContexts;
}
// Compute the context ids for this node from the union of its edge context
// ids.
DenseSet<uint32_t> getContextIds() const {
- DenseSet<uint32_t> ContextIds;
- auto *Edges = getEdgesWithAllocInfo();
- if (!Edges)
- return {};
unsigned Count = 0;
- for (auto &Edge : *Edges)
+ for (auto &Edge : CalleeEdges.empty() ? CallerEdges : CalleeEdges)
Count += Edge->getContextIds().size();
+ DenseSet<uint32_t> ContextIds;
ContextIds.reserve(Count);
- for (auto &Edge : *Edges)
+ std::vector<std::shared_ptr<ContextEdge>> Empty;
----------------
teresajohnson wrote:
Done - ptal and let me know if this is what you meant.
https://github.com/llvm/llvm-project/pull/127429
More information about the llvm-commits
mailing list