[llvm] [MemProf] Support cloning through recursive cycles (PR #127429)
Teresa Johnson via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 19 12:44:24 PST 2025
================
@@ -3546,13 +3625,99 @@ void CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::identifyClones(
//
// Then check if by cloning node at least one of the callee edges will be
// disambiguated by splitting out different context ids.
+ //
+ // However, always do the cloning if this is a backedge, in which case we
+ // have not yet cloned along this caller edge.
assert(CallerEdge->AllocTypes != (uint8_t)AllocationType::None);
assert(Node->AllocTypes != (uint8_t)AllocationType::None);
- if (allocTypeToUse(CallerAllocTypeForAlloc) ==
+ if (!CallerEdge->IsBackedge &&
+ allocTypeToUse(CallerAllocTypeForAlloc) ==
allocTypeToUse(Node->AllocTypes) &&
allocTypesMatch<DerivedCCG, FuncTy, CallTy>(
- CalleeEdgeAllocTypesForCallerEdge, Node->CalleeEdges))
+ CalleeEdgeAllocTypesForCallerEdge, Node->CalleeEdges)) {
continue;
+ }
+
+ if (CallerEdge->IsBackedge) {
+ // We should only mark these if cloning recursive contexts, where we
+ // need to do this deferral.
+ assert(CloneRecursiveContexts);
+ DeferredBackedges++;
+ }
+
+ // If this is a backedge, we now do recursive cloning starting from its
+ // caller since we may have moved unambiguous caller contexts to a clone
+ // of this Node in a previous iteration of the current loop, giving more
+ // opportunity for cloning through the backedge. Because we sorted the
+ // caller edges earlier so that cold caller edges are first, we would have
+ // visited and cloned this node for any unamibiguously cold non-recursive
+ // callers before any ambiguous backedge callers. Note that we don't do this
+ // if the caller is already cloned or visited during cloning (e.g. via a
+ // different context path from the allocation).
+ // TODO: Can we do better in the case where the caller was already visited?
+ if (CallerEdge->IsBackedge && !CallerEdge->Caller->CloneOf &&
----------------
teresajohnson wrote:
Sounds good, I will look into that as a follow up
https://github.com/llvm/llvm-project/pull/127429
More information about the llvm-commits
mailing list