[llvm] [MemProf] Ensure node merging happens for newly created nodes (PR #151593)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 31 13:59:04 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: Teresa Johnson (teresajohnson)

<details>
<summary>Changes</summary>

We weren't performing node merging on newly created nodes in some cases.
Use a simple iteration over the node and its callers until no more
opportunities are found. I confirmed that for several large codes the
max iterations is 3 (meaning we only needed to do any work on the first
2, as expected). This can potentially be made more elegant in the
future, but it is a simple and effective solution.

Also fix a bug exposed by the test case, getting the function for a call
instruction in the FullLTO handling, using an existing method to look
through aliases if needed.


---

Patch is 534.86 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/151593.diff


4 Files Affected:

- (modified) llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp (+37-9) 
- (added) llvm/test/Transforms/MemProfContextDisambiguation/iterative_merge.ll (+1103) 
- (modified) llvm/test/Transforms/MemProfContextDisambiguation/mergenodes.ll (+3) 
- (modified) llvm/test/Transforms/MemProfContextDisambiguation/mergenodes2.ll (+3) 


``````````diff
diff --git a/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp b/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp
index c009c1e0e018b..b8c99f1f33891 100644
--- a/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp
+++ b/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp
@@ -99,6 +99,9 @@ STATISTIC(SkippedCallsCloning,
           "Number of calls skipped during cloning due to unexpected operand");
 STATISTIC(MismatchedCloneAssignments,
           "Number of callsites assigned to call multiple non-matching clones");
+STATISTIC(TotalMergeInvokes, "Number of merge invocations for nodes");
+STATISTIC(TotalMergeIters, "Number of merge iterations for nodes");
+STATISTIC(MaxMergeIters, "Max merge iterations for nodes");
 
 static cl::opt<std::string> DotFilePathPrefix(
     "memprof-dot-file-path-prefix", cl::init(""), cl::Hidden,
@@ -109,6 +112,11 @@ static cl::opt<bool> ExportToDot("memprof-export-to-dot", cl::init(false),
                                  cl::Hidden,
                                  cl::desc("Export graph to dot files."));
 
+// TODO: Remove this option once new handling is validated more widely.
+static cl::opt<bool> DoMergeIteration(
+    "memprof-merge-iteration", cl::init(true), cl::Hidden,
+    cl::desc("Iteratively apply merging on a node to catch new callers"));
+
 // How much of the graph to export to dot.
 enum DotScope {
   All,     // The full CCG graph.
@@ -3995,7 +4003,7 @@ IndexCallsiteContextGraph::getAllocationCallType(const CallInfo &Call) const {
 
 void ModuleCallsiteContextGraph::updateCall(CallInfo &CallerCall,
                                             FuncInfo CalleeFunc) {
-  auto *CurF = cast<CallBase>(CallerCall.call())->getCalledFunction();
+  auto *CurF = getCalleeFunc(CallerCall.call());
   auto NewCalleeCloneNo = CalleeFunc.cloneNo();
   if (isMemProfClone(*CurF)) {
     // If we already assigned this callsite to call a specific non-default
@@ -4191,16 +4199,36 @@ void CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::mergeClones(
   if (!Inserted.second)
     return;
 
-  // Make a copy since the recursive call may move a caller edge to a new
-  // callee, messing up the iterator.
-  auto CallerEdges = Node->CallerEdges;
-  for (auto CallerEdge : CallerEdges) {
-    // Skip any caller edge moved onto a different callee during recursion.
-    if (CallerEdge->Callee != Node)
-      continue;
-    mergeClones(CallerEdge->Caller, Visited, ContextIdToAllocationNode);
+  // Iteratively perform merging on this node to handle new caller nodes created
+  // during the recursive traversal. We could do something more elegant such as
+  // maintain a worklist, but this is a simple approach that doesn't cause a
+  // measureable compile time effect, as most nodes don't have many caller
+  // edges to check.
+  bool FoundUnvisited = true;
+  unsigned Iters = 0;
+  while (FoundUnvisited) {
+    Iters++;
+    FoundUnvisited = false;
+    // Make a copy since the recursive call may move a caller edge to a new
+    // callee, messing up the iterator.
+    auto CallerEdges = Node->CallerEdges;
+    for (auto CallerEdge : CallerEdges) {
+      // Skip any caller edge moved onto a different callee during recursion.
+      if (CallerEdge->Callee != Node)
+        continue;
+      // If we found an unvisited caller, note that we should check the caller
+      // edges again as mergeClones may add or change caller nodes.
+      if (DoMergeIteration && !Visited.contains(CallerEdge->Caller))
+        FoundUnvisited = true;
+      mergeClones(CallerEdge->Caller, Visited, ContextIdToAllocationNode);
+    }
   }
 
+  TotalMergeInvokes++;
+  TotalMergeIters += Iters;
+  if (Iters > MaxMergeIters)
+    MaxMergeIters = Iters;
+
   // Merge for this node after we handle its callers.
   mergeNodeCalleeClones(Node, Visited, ContextIdToAllocationNode);
 }
diff --git a/llvm/test/Transforms/MemProfContextDisambiguation/iterative_merge.ll b/llvm/test/Transforms/MemProfContextDisambiguation/iterative_merge.ll
new file mode 100644
index 0000000000000..b681ecdc0dccb
--- /dev/null
+++ b/llvm/test/Transforms/MemProfContextDisambiguation/iterative_merge.ll
@@ -0,0 +1,1103 @@
+;; Test for iterative node merging. This is an llvm-reduced version of the xalancbmk
+;; benchmark with FullLTO and memprof.
+
+;; -stats requires asserts
+; REQUIRES: asserts
+
+; RUN: opt -passes=memprof-context-disambiguation -supports-hot-cold-new -stats \
+; RUN:	-memprof-merge-iteration=false %s -S 2>&1 | FileCheck %s --check-prefix=NOITER
+
+; RUN: opt -passes=memprof-context-disambiguation -supports-hot-cold-new -stats \
+; RUN:	-memprof-merge-iteration=true %s -S 2>&1 | FileCheck %s --check-prefix=ITER
+
+; RUN: opt -passes=memprof-context-disambiguation -supports-hot-cold-new -stats \
+; RUN:	%s -S 2>&1 | FileCheck %s --check-prefix=ITER
+
+; NOITER-NOT: _ZN10xalanc_1_8L11doTranscodeEPKcjRNSt3__u6vectorItNS2_9allocatorItEEEEb.memprof.2
+; NOITER: 7 memprof-context-disambiguation - Number of function clones created during whole program analysis
+; NOITER: 1 memprof-context-disambiguation - Max merge iterations for nodes
+; NOITER: 2 memprof-context-disambiguation - Number of new nodes created during merging
+
+; ITER: _ZN10xalanc_1_8L11doTranscodeEPKcjRNSt3__u6vectorItNS2_9allocatorItEEEEb.memprof.2
+; ITER: 8 memprof-context-disambiguation - Number of function clones created during whole program analysis
+; ITER: 3 memprof-context-disambiguation - Max merge iterations for nodes
+; ITER: 3 memprof-context-disambiguation - Number of new nodes created during merging
+
+; ModuleID = 'reduced.bc'
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-grtev4-linux-gnu"
+
+%"class.xercesc_2_5::XMLNumber" = type { %"class.xercesc_2_5::XMLEnumerator" }
+%"class.xercesc_2_5::XMLEnumerator" = type { ptr }
+
+ at llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_XPath.cpp, ptr null }]
+ at _ZTVN10xalanc_1_822FunctionNormalizeSpaceE = constant { [11 x ptr] } { [11 x ptr] [ptr null, ptr null, ptr null, ptr null, ptr null, ptr @_ZNK10xalanc_1_822FunctionNormalizeSpace7executeERNS_21XPathExecutionContextEPNS_9XalanNodeEPKN11xercesc_2_57LocatorE, ptr @_ZNK10xalanc_1_822FunctionNormalizeSpace7executeERNS_21XPathExecutionContextEPNS_9XalanNodeENS_10XObjectPtrEPKN11xercesc_2_57LocatorE, ptr null, ptr null, ptr null, ptr null] }
+ at _ZTVN10__cxxabiv121__vmi_class_type_infoE = constant { [10 x ptr] } zeroinitializer
+ at _ZTVN10__cxxabiv119__pointer_type_infoE = constant { [7 x ptr] } zeroinitializer
+ at _ZTVSt13bad_exception = constant { [5 x ptr] } { [5 x ptr] [ptr null, ptr @_ZTISt13bad_exception, ptr @_ZNSt13bad_exceptionD1Ev, ptr null, ptr null] }
+ at _ZTISt13bad_exception = constant { ptr, ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv120__si_class_type_infoE, i64 2), ptr null, ptr @_ZTISt9exception }
+ at _ZTISt9bad_alloc = constant { ptr, ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv120__si_class_type_infoE, i64 2), ptr null, ptr @_ZTISt9exception }
+ at _ZTVSt8bad_cast = constant { [5 x ptr] } { [5 x ptr] [ptr null, ptr @_ZTISt8bad_cast, ptr @_ZNSt8bad_castD1Ev, ptr null, ptr null] }
+ at _ZTVSt10bad_typeid = constant { [5 x ptr] } { [5 x ptr] [ptr null, ptr @_ZTISt10bad_typeid, ptr @_ZNSt10bad_typeidD1Ev, ptr null, ptr null] }
+ at _ZTVN10__cxxabiv117__class_type_infoE = constant { [10 x ptr] } zeroinitializer
+ at _ZTISt8bad_cast = constant { ptr, ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv120__si_class_type_infoE, i64 2), ptr null, ptr @_ZTISt9exception }
+ at _ZTVN10__cxxabiv120__si_class_type_infoE = constant { [10 x ptr] } zeroinitializer
+ at _ZTISt9exception = constant { ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), ptr null }
+ at _ZTISt10bad_typeid = constant { ptr, ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv120__si_class_type_infoE, i64 2), ptr null, ptr @_ZTISt9exception }
+ at _ZTVSt9exception = constant { [5 x ptr] } { [5 x ptr] [ptr null, ptr @_ZTISt9exception, ptr @_ZNSt9exceptionD2Ev, ptr null, ptr null] }
+
+ at _ZN10xalanc_1_814XalanDOMStringC1EPKcj = alias void (ptr, ptr, i32), ptr @_ZN10xalanc_1_814XalanDOMStringC2EPKcj
+ at _Znwm = alias ptr (i64), ptr @TCMallocInternalNew
+ at _ZdlPvm = alias void (ptr, i64), ptr @TCMallocInternalDeleteSized
+ at _Znam = alias ptr (i64), ptr @TCMallocInternalNew
+ at _ZdaPv = alias void (ptr), ptr @TCMallocInternalDelete
+ at _ZdlPv = alias void (ptr), ptr @TCMallocInternalDelete
+ at _ZnwmRKSt9nothrow_t = alias ptr (i64, ptr), ptr @TCMallocInternalNewNothrow
+ at _ZnamRKSt9nothrow_t = alias ptr (i64, ptr), ptr @TCMallocInternalNewNothrow
+ at _ZdlPvRKSt9nothrow_t = alias void (ptr, ptr), ptr @TCMallocInternalDelete
+ at _ZdaPvRKSt9nothrow_t = alias void (ptr, ptr), ptr @TCMallocInternalDelete
+ at _ZnwmSt11align_val_t = alias ptr (i64, i64), ptr @TCMallocInternalNewAligned
+ at _ZnwmSt11align_val_tRKSt9nothrow_t = alias ptr (i64, i64, ptr), ptr @TCMallocInternalNewAlignedNothrow
+ at _ZdlPvSt11align_val_t = alias void (ptr, i64), ptr @TCMallocInternalDelete
+ at _ZdlPvSt11align_val_tRKSt9nothrow_t = alias void (ptr, i64, ptr), ptr @TCMallocInternalDelete
+ at _ZdlPvmSt11align_val_t = alias void (ptr, i64, i64), ptr @TCMallocInternalDeleteSizedAligned
+ at _ZnamSt11align_val_t = alias ptr (i64, i64), ptr @TCMallocInternalNewAligned
+ at _ZnamSt11align_val_tRKSt9nothrow_t = alias ptr (i64, i64, ptr), ptr @TCMallocInternalNewAlignedNothrow
+ at _ZdaPvSt11align_val_t = alias void (ptr, i64), ptr @TCMallocInternalDelete
+ at _ZdaPvSt11align_val_tRKSt9nothrow_t = alias void (ptr, i64, ptr), ptr @TCMallocInternalDelete
+ at _ZdaPvmSt11align_val_t = alias void (ptr, i64, i64), ptr @TCMallocInternalDeleteSizedAligned
+ at _ZNSt13exception_ptrD1Ev = alias void (ptr), ptr @_ZNSt13exception_ptrD2Ev
+ at _ZNSt13exception_ptrC1ERKS_ = alias void (ptr, ptr), ptr @_ZNSt13exception_ptrC2ERKS_
+ at _ZNSt13bad_exceptionD1Ev = alias void (ptr), ptr @_ZNSt9exceptionD2Ev
+ at _ZNSt8bad_castD1Ev = alias void (ptr), ptr @_ZNSt8bad_castD2Ev
+ at _ZNSt10bad_typeidD1Ev = alias void (ptr), ptr @_ZNSt10bad_typeidD2Ev
+
+define ptr @_ZNSt3__u6vectorItNS_9allocatorItEEE7reserveEm() {
+  %1 = tail call ptr @_Znwm(i64 0), !memprof !29, !callsite !592
+  ret ptr %1
+}
+
+; Function Attrs: cold
+declare void @_ZN10xalanc_1_88FunctionC2Ev() #0
+
+define void @_ZN10xalanc_1_812FunctionLangC2Ev() {
+  call void @_ZN10xalanc_1_88FunctionC2Ev()
+  call void @_ZN10xalanc_1_814XalanDOMStringC1EPKcj(ptr null, ptr null, i32 0), !callsite !593
+  ret void
+}
+
+define void @_ZN10xalanc_1_822FunctionNormalizeSpaceC2Ev(ptr %0) {
+  store ptr @_ZTVN10xalanc_1_822FunctionNormalizeSpaceE, ptr %0, align 8
+  ret void
+}
+
+define void @_ZNK10xalanc_1_822FunctionNormalizeSpace7executeERNS_21XPathExecutionContextEPNS_9XalanNodeEPKN11xercesc_2_57LocatorE() {
+  call void @_ZN10xalanc_1_818XalanMessageLoader10getMessageENS_13XalanMessages5CodesEPKcS4_S4_S4_()
+  ret void
+}
+
+define ptr @_ZNK10xalanc_1_822FunctionNormalizeSpace7executeERNS_21XPathExecutionContextEPNS_9XalanNodeENS_10XObjectPtrEPKN11xercesc_2_57LocatorE() {
+  %1 = call ptr @_ZNK10xalanc_1_822FunctionNormalizeSpace9normalizeERNS_21XPathExecutionContextERKNS_10XObjectPtrE()
+  ret ptr %1
+}
+
+define ptr @_ZNK10xalanc_1_822FunctionNormalizeSpace9normalizeERNS_21XPathExecutionContextERKNS_10XObjectPtrE() {
+  %1 = load ptr, ptr null, align 8
+  %2 = getelementptr i8, ptr %1, i64 72
+  %3 = load ptr, ptr %2, align 8
+  %4 = tail call ptr %3(ptr null)
+  %5 = call ptr @_ZNK10xalanc_1_822FunctionNormalizeSpace9normalizeERNS_21XPathExecutionContextERKNS_14XalanDOMStringE()
+  ret ptr %5
+}
+
+define ptr @_ZNK10xalanc_1_822FunctionNormalizeSpace9normalizeERNS_21XPathExecutionContextERKNS_14XalanDOMStringE() {
+  %1 = call ptr @_ZNSt3__u6vectorItNS_9allocatorItEEE7reserveEm()
+  ret ptr %1
+}
+
+declare i64 @mbstowcs()
+
+define void @_GLOBAL__sub_I_XPath.cpp() {
+  tail call void @_ZN10xalanc_1_818XPathFunctionTableC2Eb()
+  ret void
+}
+
+define void @_ZN10xalanc_1_818XPathFunctionTableC2Eb() {
+  call void @_ZN10xalanc_1_818XPathFunctionTable11CreateTableEv()
+  ret void
+}
+
+define void @_ZN10xalanc_1_818XPathFunctionTable11CreateTableEv() {
+  %1 = alloca %"class.xercesc_2_5::XMLNumber", align 8
+  call void @_ZN10xalanc_1_812FunctionLangC2Ev()
+  call void @_ZN10xalanc_1_822FunctionNormalizeSpaceC2Ev(ptr %1)
+  ret void
+}
+
+define void @_ZN10xalanc_1_814XalanDOMStringC2EPKcj(ptr %0, ptr %1, i32 %2) #1 {
+  %4 = call ptr @_ZN10xalanc_1_814XalanDOMString6appendEPKcj(ptr %0, ptr %1, i32 %2), !callsite !594
+  ret void
+}
+
+; Function Attrs: cold
+define ptr @_ZN10xalanc_1_814XalanDOMString6appendEPKcj(ptr %0, ptr %1, i32 %2) #0 {
+  %4 = load i32, ptr %0, align 8
+  %5 = icmp eq i32 %4, 0
+  br i1 %5, label %common.ret, label %6
+
+common.ret:                                       ; preds = %3
+  tail call fastcc void @_ZN10xalanc_1_8L11doTranscodeEPKcjRNSt3__u6vectorItNS2_9allocatorItEEEEb(ptr %1, i32 %2, ptr %0, i1 true), !callsite !595
+  ret ptr %0
+
+6:                                                ; preds = %3
+  call fastcc void @_ZN10xalanc_1_8L11doTranscodeEPKcjRNSt3__u6vectorItNS2_9allocatorItEEEEb(ptr null, i32 1, ptr null, i1 false)
+  unreachable
+}
+
+define fastcc void @_ZN10xalanc_1_8L11doTranscodeEPKcjRNSt3__u6vectorItNS2_9allocatorItEEEEb(ptr %0, i32 %1, ptr %2, i1 %3) !prof !596 {
+  %5 = icmp eq i32 %1, 1
+  br i1 %5, label %6, label %9
+
+6:                                                ; preds = %4
+  %7 = call fastcc i1 @_ZN10xalanc_1_8L28doTranscodeFromLocalCodePageEPKcjbRNSt3__u6vectorItNS2_9allocatorItEEEEb(ptr %0, ptr %2, i1 %3)
+  br i1 %7, label %11, label %8
+
+8:                                                ; preds = %6
+  ret void
+
+9:                                                ; preds = %4
+  %10 = call fastcc i1 @_ZN10xalanc_1_8L28doTranscodeFromLocalCodePageEPKcjbRNSt3__u6vectorItNS2_9allocatorItEEEEb(ptr %0, ptr null, i1 false), !callsite !597
+  br label %11
+
+11:                                               ; preds = %9, %6
+  ret void
+}
+
+define fastcc i1 @_ZN10xalanc_1_8L28doTranscodeFromLocalCodePageEPKcjbRNSt3__u6vectorItNS2_9allocatorItEEEEb(ptr %0, ptr %1, i1 %2) {
+  %4 = icmp eq ptr %0, null
+  br i1 %4, label %5, label %7
+
+5:                                                ; preds = %3
+  %6 = load i64, ptr %1, align 8
+  %cond = icmp eq i64 %6, 0
+  ret i1 %cond
+
+7:                                                ; preds = %3
+  %8 = call i64 @mbstowcs()
+  %9 = zext i1 %2 to i64
+  call void @_ZNSt3__u6vectorIwNS_9allocatorIwEEE8__appendEm(), !callsite !598
+  ret i1 false
+}
+
+define void @_ZNSt3__u6vectorIwNS_9allocatorIwEEE8__appendEm() {
+  %1 = tail call ptr @_Znwm(i64 0), !memprof !599, !callsite !768
+  ret void
+}
+
+; Function Attrs: cold
+define void @_ZN10xalanc_1_826XalanInMemoryMessageLoaderC2Ev() #0 {
+  call void @_ZN10xalanc_1_814XalanDOMStringC1EPKcj(ptr null, ptr null, i32 0), !callsite !769
+  ret void
+}
+
+define void @_ZN10xalanc_1_818XalanMessageLoader12createLoaderEv() {
+  %1 = tail call ptr @_Znwm(i64 0)
+  call void @_ZN10xalanc_1_826XalanInMemoryMessageLoaderC2Ev(), !callsite !770
+  ret void
+}
+
+define void @_ZN10xalanc_1_818XalanMessageLoader10getMessageENS_13XalanMessages5CodesEPKcS4_S4_S4_() {
+  tail call void @_ZN10xalanc_1_818XalanMessageLoader12createLoaderEv()
+  ret void
+}
+
+define void @TCMallocInternalDeleteSized() {
+  ret void
+}
+
+; Function Attrs: nobuiltin noinline
+define ptr @TCMallocInternalNew(i64 %0) #2 {
+  ret ptr null
+}
+
+define void @TCMallocInternalDelete() {
+  ret void
+}
+
+define i64 @TCMallocInternalNewNothrow() {
+  ret i64 0
+}
+
+define i64 @TCMallocInternalNewAligned() {
+  ret i64 0
+}
+
+define i64 @TCMallocInternalNewAlignedNothrow() {
+  ret i64 0
+}
+
+define void @TCMallocInternalDeleteSizedAligned() {
+  ret void
+}
+
+define i1 @_ZSt18uncaught_exceptionv() {
+  ret i1 false
+}
+
+define void @_ZNSt13exception_ptrD2Ev() {
+  ret void
+}
+
+define void @_ZNSt13exception_ptrC2ERKS_() {
+  ret void
+}
+
+define ptr @_ZNSt13exception_ptraSERKS_() {
+  ret ptr null
+}
+
+define void @_ZSt17rethrow_exceptionSt13exception_ptr() {
+  unreachable
+}
+
+define void @_ZSt17__throw_bad_allocv() {
+  unreachable
+}
+
+define void @__cxa_bad_cast() {
+  unreachable
+}
+
+define ptr @__cxa_allocate_exception() {
+  ret ptr null
+}
+
+define ptr @__cxa_begin_catch() {
+  ret ptr null
+}
+
+define void @__cxa_free_exception() {
+  ret void
+}
+
+define void @__cxa_throw() {
+  unreachable
+}
+
+define void @__cxa_end_catch() {
+  ret void
+}
+
+define ptr @__cxa_current_exception_type() {
+  ret ptr null
+}
+
+define void @__cxa_rethrow() {
+  ret void
+}
+
+define void @_ZSt9terminatev() {
+  ret void
+}
+
+define i32 @__gxx_personality_v0() {
+  ret i32 0
+}
+
+define void @__cxa_call_unexpected() {
+  ret void
+}
+
+define ptr @__dynamic_cast() {
+  ret ptr null
+}
+
+define void @_ZNSt9exceptionD2Ev() {
+  ret void
+}
+
+define void @_ZNSt8bad_castD2Ev() {
+  ret void
+}
+
+define void @_ZNSt10bad_typeidD2Ev() {
+  ret void
+}
+
+attributes #0 = { cold }
+attributes #1 = { "target-features"="+aes" }
+attributes #2 = { nobuiltin noinline }
+
+!llvm.module.flags = !{!0}
+
+!0 = !{i32 1, !"ProfileSummary", !1}
+!1 = !{!2, !3, !4, !5, !6, !7, !8, !9, !10, !11}
+!2 = !{!"ProfileFormat", !"InstrProf"}
+!3 = !{!"TotalCount", i64 331263925478}
+!4 = !{!"MaxCount", i64 89521949747}
+!5 = !{!"MaxInternalCount", i64 89521949747}
+!6 = !{!"MaxFunctionCount", i64 14842374247}
+!7 = !{!"NumCounts", i64 80529}
+!8 = !{!"NumFunctions", i64 13237}
+!9 = !{!"IsPartialProfile", i64 0}
+!10 = !{!"PartialProfileRatio", double 0.000000e+00}
+!11 = !{!"DetailedSummary", !12}
+!12 = !{!13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28}
+!13 = !{i32 10000, i64 89521949747, i32 1}
+!14 = !{i32 100000, i64 89521949747, i32 1}
+!15 = !{i32 200000, i64 89521949747, i32 1}
+!16 = !{i32 300000, i64 89454229684, i32 2}
+!17 = !{i32 400000, i64 89454229684, i32 2}
+!18 = !{i32 500000, i64 89454229684, i32 2}
+!19 = !{i32 600000, i64 28686354153, i32 3}
+!20 = !{i32 700000, i64 12169900676, i32 5}
+!21 = !{i32 800000, i64 2585869019, i32 9}
+!22 = !{i32 900000, i64 1189366531, i32 32}
+!23 = !{i32 950000, i64 137116556, i32 82}
+!24 = !{i32 990000, i64 24641624, i32 286}
+!25 = !{i32 999000, i64 832911, i32 881}
+!26 = !{i32 999900, i64 110792, i32 1739}
+!27 = !{i32 999990, i64 20910, i32 2245}
+!28 = !{i32 999999, i64 650, i32 2817}
+!29 = !{!30, !32, !34, !36, !38, !40, !42, !44, !46, !48, !50, !52, !54, !56, !58, !60, !62, !64, !66, !68, !70, !72, !74, !76, !78, !80, !82, !84, !86, !88, !90, !92, !94, !96, !98, !100, !102, !104, !106, !108, !110, !112, !114, !116, !118, !120, !122, !124, !126, !128, !130, !132, !134, !136, !138, !140, !142, !144, !146, !148, !150, !152, !154, !156, !158, !160, !162, !164, !166, !168, !170, !172, !174, !176, !178, !180, !182, !184, !186, !188, !190, !192, !194, !196, !198, !200, !202, !204, !206, !208, !210, !212, !214, !216, !218, !220, !222, !224, !226, !228, !230, !232, !234, !236, !238, !240, !242, !244, !246, !248, !250, !252, !254, !256, !258, !260, !262, !264, !266, !268, !270, !272, !274, !276, !278, !280, !282, !284, !286, !288, !290, !292, !294, !296, !298, !300, !302, !304, !306, !308, !310, !312, !314, !316, !318, !320, !322, !324, !326, !328, !330, !332, !334, !336, !338, !340, !342, !344, !346, !348, !350, !352, !354, !356, !358, !360, !362, !364, !366, !368, !370, !372, !374, !376, !378, !380, !382, !384, !386, !388, !390, !392, !394, !396, !398, !400, !402, !404, !406, !408, !410, !412, !414, !416, !418, !420, !422, !424, !426, !428, !430, !432, !434, !436, !438, !440, !442, !444, !446, !448, !450, !452, !454, !456, !458, !460, !462, !464, !466, !468, !470, !472, !474, !476, !478, !480, !482, !484, !486, !488, !490, !492, !494, !496, !498, !500, !502, !504, !506, !508, !510, !512, !514, !516, !518, !520, !522, !524, !526, !528, !530, !532, !534, !536, !538, !540, !542, !544, !546, !548, !550, !552, !554, !556, !558, !560, !562, !564, !566, !568, !570, !572, !574, !576, !578, !580, !582, !584, !586, !588, !590}
+!30 = !{!31, !"cold"}
+!31 = !{i64 761518489666860826, i64 -1420336805534834351, i64 -2943078617660248973, i64 3500755695426091485, i64 4378935957859808257, i64 445663428903236269...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/151593


More information about the llvm-commits mailing list