386 lines · plain
1;; Test callsite context graph generation for simple call graph with2;; two memprof contexts and no inlining.3;;4;; Original code looks like:5;;6;; char *bar() {7;; return new char[10];8;; }9;;10;; char *baz() {11;; return bar();12;; }13;;14;; char *foo() {15;; return baz();16;; }17;;18;; int main(int argc, char **argv) {19;; char *x = foo();20;; char *y = foo();21;; memset(x, 0, 10);22;; memset(y, 0, 10);23;; delete[] x;24;; sleep(10);25;; delete[] y;26;; return 0;27;; }28;;29;; Code compiled with -mllvm -memprof-ave-lifetime-cold-threshold=5 so that the30;; memory freed after sleep(10) results in cold lifetimes.31;;32;; The IR was then reduced using llvm-reduce with the expected FileCheck input.33 34;; -stats requires asserts35; REQUIRES: asserts36 37; RUN: opt -thinlto-bc -memprof-report-hinted-sizes %s >%t.o38; RUN: llvm-lto2 run %t.o -enable-memprof-context-disambiguation \39; RUN: -supports-hot-cold-new \40; RUN: -r=%t.o,main,plx \41; RUN: -r=%t.o,_ZdaPv, \42; RUN: -r=%t.o,sleep, \43; RUN: -r=%t.o,_Znam, \44; RUN: -memprof-verify-ccg -memprof-verify-nodes -memprof-dump-ccg \45; RUN: -memprof-export-to-dot -memprof-dot-file-path-prefix=%t. \46; RUN: -memprof-report-hinted-sizes \47; RUN: -stats -pass-remarks=memprof-context-disambiguation -save-temps \48; RUN: -o %t.out 2>&1 | FileCheck %s --check-prefix=DUMP --check-prefix=DUMP-SIZES \49; RUN: --check-prefix=STATS --check-prefix=STATS-BE --check-prefix=REMARKS \50; RUN: --check-prefix=SIZES51 52; RUN: cat %t.ccg.postbuild.dot | FileCheck %s --check-prefix=DOT53;; We should have cloned bar, baz, and foo, for the cold memory allocation.54; RUN: cat %t.ccg.cloned.dot | FileCheck %s --check-prefix=DOTCLONED55; RUN: cat %t.ccg.clonefuncassign.dot | FileCheck %s --check-prefix=DOTFUNCASSIGN56 57; RUN: llvm-dis %t.out.1.4.opt.bc -o - | FileCheck %s --check-prefix=IR58 59 60;; Try again but with distributed ThinLTO61; RUN: llvm-lto2 run %t.o -enable-memprof-context-disambiguation \62; RUN: -supports-hot-cold-new \63; RUN: -thinlto-distributed-indexes \64; RUN: -r=%t.o,main,plx \65; RUN: -r=%t.o,_ZdaPv, \66; RUN: -r=%t.o,sleep, \67; RUN: -r=%t.o,_Znam, \68; RUN: -memprof-verify-ccg -memprof-verify-nodes -memprof-dump-ccg \69; RUN: -memprof-export-to-dot -memprof-dot-file-path-prefix=%t2. \70; RUN: -memprof-report-hinted-sizes \71; RUN: -stats -pass-remarks=memprof-context-disambiguation \72; RUN: -o %t2.out 2>&1 | FileCheck %s --check-prefix=DUMP \73; RUN: --check-prefix=STATS --check-prefix=SIZES74 75; RUN: cat %t2.ccg.postbuild.dot | FileCheck %s --check-prefix=DOT76;; We should have cloned bar, baz, and foo, for the cold memory allocation.77; RUN: cat %t2.ccg.cloned.dot | FileCheck %s --check-prefix=DOTCLONED78 79;; Check distributed index80; RUN: llvm-dis %t.o.thinlto.bc -o - | FileCheck %s --check-prefix=DISTRIB81 82;; Run ThinLTO backend83; RUN: opt -passes=memprof-context-disambiguation \84; RUN: -memprof-import-summary=%t.o.thinlto.bc \85; RUN: -stats -pass-remarks=memprof-context-disambiguation \86; RUN: %t.o -S 2>&1 | FileCheck %s --check-prefix=IR \87; RUN: --check-prefix=STATS-BE --check-prefix=REMARKS88 89source_filename = "memprof-basic.ll"90target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"91target triple = "x86_64-unknown-linux-gnu"92 93define i32 @main() #0 {94entry:95 %call = call ptr @_Z3foov(), !callsite !096 %call1 = call ptr @_Z3foov(), !callsite !197 ret i32 098}99 100declare void @_ZdaPv()101 102declare i32 @sleep()103 104define internal ptr @_Z3barv() #0 !dbg !15 {105entry:106 ;; Use an ambiguous attribute for this allocation, which is now added to such107 ;; allocations during matching. It should not affect cloning.108 %call = call ptr @_Znam(i64 0) #1, !memprof !2, !callsite !7109 ret ptr null110}111 112declare ptr @_Znam(i64)113 114define internal ptr @_Z3bazv() #0 {115entry:116 %call = call ptr @_Z3barv(), !callsite !8117 ret ptr null118}119 120define internal ptr @_Z3foov() #0 {121entry:122 %call = call ptr @_Z3bazv(), !callsite !9123 ret ptr null124}125 126; uselistorder directives127uselistorder ptr @_Z3foov, { 1, 0 }128 129attributes #0 = { noinline optnone }130attributes #1 = { "memprof"="ambiguous" }131 132!llvm.dbg.cu = !{!13}133!llvm.module.flags = !{!20, !21}134 135!0 = !{i64 8632435727821051414}136!1 = !{i64 -3421689549917153178}137!2 = !{!3, !5}138!3 = !{!4, !"notcold", !10}139!4 = !{i64 9086428284934609951, i64 -5964873800580613432, i64 2732490490862098848, i64 8632435727821051414}140!5 = !{!6, !"cold", !11, !12}141!6 = !{i64 9086428284934609951, i64 -5964873800580613432, i64 2732490490862098848, i64 -3421689549917153178}142!7 = !{i64 9086428284934609951}143!8 = !{i64 -5964873800580613432}144!9 = !{i64 2732490490862098848}145!10 = !{i64 123, i64 100}146!11 = !{i64 456, i64 200}147!12 = !{i64 789, i64 300}148!13 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !14, producer: "clang version 21.0.0git (git@github.com:llvm/llvm-project.git e391301e0e4d9183fe06e69602e87b0bc889aeda)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)149!14 = !DIFile(filename: "basic.cc", directory: "", checksumkind: CSK_MD5, checksum: "8636c46e81402013b9d54e8307d2f149")150!15 = distinct !DISubprogram(name: "bar", linkageName: "_Z3barv", scope: !14, file: !14, line: 1, type: !16, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !13, declaration: !22)151!16 = !DISubroutineType(types: !17)152!17 = !{!18}153!18 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !19, size: 64)154!19 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)155!20 = !{i32 7, !"Dwarf Version", i32 5}156!21 = !{i32 2, !"Debug Info Version", i32 3}157!22 = !DISubprogram(name: "bar", linkageName: "_Z3barv", scope: !14, file: !14, line: 1, type: !16, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized)158 159; DUMP: CCG before cloning:160; DUMP: Callsite Context Graph:161; DUMP: Node [[BAR:0x[a-z0-9]+]]162; DUMP: Versions: 1 MIB:163; DUMP: AllocType 1 StackIds: 2, 3, 0164; DUMP: AllocType 2 StackIds: 2, 3, 1165; DUMP-SIZES: ContextSizeInfo per MIB:166; DUMP-SIZES: { 123, 100 }167; DUMP-SIZES: { 456, 200 }, { 789, 300 }168; DUMP: (clone 0)169; DUMP: AllocTypes: NotColdCold170; DUMP: ContextIds: 1 2171; DUMP: CalleeEdges:172; DUMP: CallerEdges:173; DUMP: Edge from Callee [[BAR]] to Caller: [[BAZ:0x[a-z0-9]+]] AllocTypes: NotColdCold ContextIds: 1 2174 175; DUMP: Node [[BAZ]]176; DUMP: Callee: 11481133863268513686 (_Z3barv) Clones: 0 StackIds: 2 (clone 0)177; DUMP: AllocTypes: NotColdCold178; DUMP: ContextIds: 1 2179; DUMP: CalleeEdges:180; DUMP: Edge from Callee [[BAR]] to Caller: [[BAZ]] AllocTypes: NotColdCold ContextIds: 1 2181; DUMP: CallerEdges:182; DUMP: Edge from Callee [[BAZ]] to Caller: [[FOO:0x[a-z0-9]+]] AllocTypes: NotColdCold ContextIds: 1 2183 184; DUMP: Node [[FOO]]185; DUMP: Callee: 1807954217441101578 (_Z3bazv) Clones: 0 StackIds: 3 (clone 0)186; DUMP: AllocTypes: NotColdCold187; DUMP: ContextIds: 1 2188; DUMP: CalleeEdges:189; DUMP: Edge from Callee [[BAZ]] to Caller: [[FOO]] AllocTypes: NotColdCold ContextIds: 1 2190; DUMP: CallerEdges:191; DUMP: Edge from Callee [[FOO]] to Caller: [[MAIN1:0x[a-z0-9]+]] AllocTypes: NotCold ContextIds: 1192; DUMP: Edge from Callee [[FOO]] to Caller: [[MAIN2:0x[a-z0-9]+]] AllocTypes: Cold ContextIds: 2193 194; DUMP: Node [[MAIN1]]195; DUMP: Callee: 8107868197919466657 (_Z3foov) Clones: 0 StackIds: 0 (clone 0)196; DUMP: AllocTypes: NotCold197; DUMP: ContextIds: 1198; DUMP: CalleeEdges:199; DUMP: Edge from Callee [[FOO]] to Caller: [[MAIN1]] AllocTypes: NotCold ContextIds: 1200; DUMP: CallerEdges:201 202; DUMP: Node [[MAIN2]]203; DUMP: Callee: 8107868197919466657 (_Z3foov) Clones: 0 StackIds: 1 (clone 0)204; DUMP: AllocTypes: Cold205; DUMP: ContextIds: 2206; DUMP: CalleeEdges:207; DUMP: Edge from Callee [[FOO]] to Caller: [[MAIN2]] AllocTypes: Cold ContextIds: 2208; DUMP: CallerEdges:209 210; DUMP: CCG after cloning:211; DUMP: Callsite Context Graph:212; DUMP: Node [[BAR]]213; DUMP: Versions: 1 MIB:214; DUMP: AllocType 1 StackIds: 2, 3, 0215; DUMP: AllocType 2 StackIds: 2, 3, 1216; DUMP: (clone 0)217; DUMP: AllocTypes: NotCold218; DUMP: ContextIds: 1219; DUMP: CalleeEdges:220; DUMP: CallerEdges:221; DUMP: Edge from Callee [[BAR]] to Caller: [[BAZ]] AllocTypes: NotCold ContextIds: 1222; DUMP: Clones: [[BAR2:0x[a-z0-9]+]]223 224; DUMP: Node [[BAZ]]225; DUMP: Callee: 11481133863268513686 (_Z3barv) Clones: 0 StackIds: 2 (clone 0)226; DUMP: AllocTypes: NotCold227; DUMP: ContextIds: 1228; DUMP: CalleeEdges:229; DUMP: Edge from Callee [[BAR]] to Caller: [[BAZ]] AllocTypes: NotCold ContextIds: 1230; DUMP: CallerEdges:231; DUMP: Edge from Callee [[BAZ]] to Caller: [[FOO]] AllocTypes: NotCold ContextIds: 1232; DUMP: Clones: [[BAZ2:0x[a-z0-9]+]]233 234; DUMP: Node [[FOO]]235; DUMP: Callee: 1807954217441101578 (_Z3bazv) Clones: 0 StackIds: 3 (clone 0)236; DUMP: AllocTypes: NotCold237; DUMP: ContextIds: 1238; DUMP: CalleeEdges:239; DUMP: Edge from Callee [[BAZ]] to Caller: [[FOO]] AllocTypes: NotCold ContextIds: 1240; DUMP: CallerEdges:241; DUMP: Edge from Callee [[FOO]] to Caller: [[MAIN1]] AllocTypes: NotCold ContextIds: 1242; DUMP: Clones: [[FOO2:0x[a-z0-9]+]]243 244; DUMP: Node [[MAIN1]]245; DUMP: Callee: 8107868197919466657 (_Z3foov) Clones: 0 StackIds: 0 (clone 0)246; DUMP: AllocTypes: NotCold247; DUMP: ContextIds: 1248; DUMP: CalleeEdges:249; DUMP: Edge from Callee [[FOO]] to Caller: [[MAIN1]] AllocTypes: NotCold ContextIds: 1250; DUMP: CallerEdges:251 252; DUMP: Node [[MAIN2]]253; DUMP: Callee: 8107868197919466657 (_Z3foov) Clones: 0 StackIds: 1 (clone 0)254; DUMP: AllocTypes: Cold255; DUMP: ContextIds: 2256; DUMP: CalleeEdges:257; DUMP: Edge from Callee [[FOO2]] to Caller: [[MAIN2]] AllocTypes: Cold ContextIds: 2258; DUMP: CallerEdges:259 260; DUMP: Node [[FOO2]]261; DUMP: Callee: 1807954217441101578 (_Z3bazv) Clones: 0 StackIds: 3 (clone 0)262; DUMP: AllocTypes: Cold263; DUMP: ContextIds: 2264; DUMP: CalleeEdges:265; DUMP: Edge from Callee [[BAZ2]] to Caller: [[FOO2]] AllocTypes: Cold ContextIds: 2266; DUMP: CallerEdges:267; DUMP: Edge from Callee [[FOO2]] to Caller: [[MAIN2]] AllocTypes: Cold ContextIds: 2268; DUMP: Clone of [[FOO]]269 270; DUMP: Node [[BAZ2]]271; DUMP: Callee: 11481133863268513686 (_Z3barv) Clones: 0 StackIds: 2 (clone 0)272; DUMP: AllocTypes: Cold273; DUMP: ContextIds: 2274; DUMP: CalleeEdges:275; DUMP: Edge from Callee [[BAR2]] to Caller: [[BAZ2]] AllocTypes: Cold ContextIds: 2276; DUMP: CallerEdges:277; DUMP: Edge from Callee [[BAZ2]] to Caller: [[FOO2]] AllocTypes: Cold ContextIds: 2278; DUMP: Clone of [[BAZ]]279 280; DUMP: Node [[BAR2]]281; DUMP: Versions: 1 MIB:282; DUMP: AllocType 1 StackIds: 2, 3, 0283; DUMP: AllocType 2 StackIds: 2, 3, 1284; DUMP: (clone 0)285; DUMP: AllocTypes: Cold286; DUMP: ContextIds: 2287; DUMP: CalleeEdges:288; DUMP: CallerEdges:289; DUMP: Edge from Callee [[BAR2]] to Caller: [[BAZ2]] AllocTypes: Cold ContextIds: 2290; DUMP: Clone of [[BAR]]291 292; SIZES: NotCold full allocation context 123 with total size 100 is NotCold after cloning (context id 1)293; SIZES: Cold full allocation context 456 with total size 200 is Cold after cloning (context id 2)294; SIZES: Cold full allocation context 789 with total size 300 is Cold after cloning (context id 2)295 296; REMARKS: call in clone main assigned to call function clone _Z3foov.memprof.1297; REMARKS: created clone _Z3barv.memprof.1298; REMARKS: call in clone _Z3barv marked with memprof allocation attribute notcold299; REMARKS: call in clone _Z3barv.memprof.1 marked with memprof allocation attribute cold300; REMARKS: created clone _Z3bazv.memprof.1301; REMARKS: call in clone _Z3bazv.memprof.1 assigned to call function clone _Z3barv.memprof.1302; REMARKS: created clone _Z3foov.memprof.1303; REMARKS: call in clone _Z3foov.memprof.1 assigned to call function clone _Z3bazv.memprof.1304 305 306; IR: define {{.*}} @main307;; The first call to foo does not allocate cold memory. It should call the308;; original functions, which ultimately call the original allocation decorated309;; with a "notcold" attribute.310; IR: call {{.*}} @_Z3foov()311;; The second call to foo allocates cold memory. It should call cloned functions312;; which ultimately call a cloned allocation decorated with a "cold" attribute.313; IR: call {{.*}} @_Z3foov.memprof.1()314; IR: define internal {{.*}} @_Z3barv()315; IR: call {{.*}} @_Znam(i64 0) #[[NOTCOLD:[0-9]+]]316; IR: define internal {{.*}} @_Z3bazv()317; IR: call {{.*}} @_Z3barv()318; IR: define internal {{.*}} @_Z3foov()319; IR: call {{.*}} @_Z3bazv()320; IR: define internal {{.*}} @_Z3barv.memprof.1() {{.*}} !dbg ![[SP:[0-9]+]]321; IR: call {{.*}} @_Znam(i64 0) #[[COLD:[0-9]+]]322; IR: define internal {{.*}} @_Z3bazv.memprof.1()323; IR: call {{.*}} @_Z3barv.memprof.1()324; IR: define internal {{.*}} @_Z3foov.memprof.1()325; IR: call {{.*}} @_Z3bazv.memprof.1()326; IR: attributes #[[NOTCOLD]] = { "memprof"="notcold" }327; IR: attributes #[[COLD]] = { "memprof"="cold" }328;; Make sure the clone's linkageName was updated.329; IR: ![[SP]] = distinct !DISubprogram(name: "bar", linkageName: "_Z3barv.memprof.1", {{.*}} declaration: ![[SP2:[0-9]+]])330; IR: ![[SP2]] = !DISubprogram(name: "bar", linkageName: "_Z3barv.memprof.1"331 332 333; STATS: 1 memprof-context-disambiguation - Number of cold static allocations (possibly cloned)334; STATS-BE: 1 memprof-context-disambiguation - Number of cold static allocations (possibly cloned) during ThinLTO backend335; STATS: 1 memprof-context-disambiguation - Number of not cold static allocations (possibly cloned)336; STATS-BE: 1 memprof-context-disambiguation - Number of not cold static allocations (possibly cloned) during ThinLTO backend337; STATS-BE: 2 memprof-context-disambiguation - Number of allocation versions (including clones) during ThinLTO backend338; STATS: 3 memprof-context-disambiguation - Number of function clones created during whole program analysis339; STATS-BE: 3 memprof-context-disambiguation - Number of function clones created during ThinLTO backend340; STATS-BE: 3 memprof-context-disambiguation - Number of functions that had clones created during ThinLTO backend341; STATS-BE: 2 memprof-context-disambiguation - Maximum number of allocation versions created for an original allocation during ThinLTO backend342; STATS-BE: 1 memprof-context-disambiguation - Number of original (not cloned) allocations with memprof profiles during ThinLTO backend343 344 345; DOT: digraph "postbuild" {346; DOT: label="postbuild";347; DOT: Node[[BAR:0x[a-z0-9]+]] [shape=record,tooltip="N[[BAR]] ContextIds: 1 2",fillcolor="mediumorchid1",style="filled",label="{OrigId: Alloc0{{.*}}\n_Z3barv -\> alloc}"];348; DOT: Node[[BAZ:0x[a-z0-9]+]] [shape=record,tooltip="N[[BAZ]] ContextIds: 1 2",fillcolor="mediumorchid1",style="filled",label="{OrigId: 12481870273128938184{{.*}}\n_Z3bazv -\> _Z3barv}"];349; DOT: Node[[BAZ]] -> Node[[BAR]][tooltip="ContextIds: 1 2",fillcolor="mediumorchid1",color="mediumorchid1"];350; DOT: Node[[FOO:0x[a-z0-9]+]] [shape=record,tooltip="N[[FOO]] ContextIds: 1 2",fillcolor="mediumorchid1",style="filled",label="{OrigId: 2732490490862098848{{.*}}\n_Z3foov -\> _Z3bazv}"];351; DOT: Node[[FOO]] -> Node[[BAZ]][tooltip="ContextIds: 1 2",fillcolor="mediumorchid1",color="mediumorchid1"];352; DOT: Node[[MAIN1:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN1]] ContextIds: 1",fillcolor="brown1",style="filled",label="{OrigId: 8632435727821051414{{.*}}\nmain -\> _Z3foov}"];353; DOT: Node[[MAIN1]] -> Node[[FOO]][tooltip="ContextIds: 1",fillcolor="brown1",color="brown1"];354; DOT: Node[[MAIN2:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN2]] ContextIds: 2",fillcolor="cyan",style="filled",label="{OrigId: 15025054523792398438{{.*}}\nmain -\> _Z3foov}"];355; DOT: Node[[MAIN2]] -> Node[[FOO]][tooltip="ContextIds: 2",fillcolor="cyan",color="cyan"];356; DOT: }357 358 359; DOTCLONED: digraph "cloned" {360; DOTCLONED: label="cloned";361; DOTCLONED: Node[[BAR:0x[a-z0-9]+]] [shape=record,tooltip="N[[BAR]] ContextIds: 1",fillcolor="brown1",style="filled",label="{OrigId: Alloc0{{.*}}\n_Z3barv -\> alloc}"];362; DOTCLONED: Node[[BAZ:0x[a-z0-9]+]] [shape=record,tooltip="N[[BAZ]] ContextIds: 1",fillcolor="brown1",style="filled",label="{OrigId: 12481870273128938184{{.*}}\n_Z3bazv -\> _Z3barv}"];363; DOTCLONED: Node[[BAZ]] -> Node[[BAR]][tooltip="ContextIds: 1",fillcolor="brown1",color="brown1"];364; DOTCLONED: Node[[FOO:0x[a-z0-9]+]] [shape=record,tooltip="N[[FOO]] ContextIds: 1",fillcolor="brown1",style="filled",label="{OrigId: 2732490490862098848{{.*}}\n_Z3foov -\> _Z3bazv}"];365; DOTCLONED: Node[[FOO]] -> Node[[BAZ]][tooltip="ContextIds: 1",fillcolor="brown1",color="brown1"];366; DOTCLONED: Node[[MAIN1:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN1]] ContextIds: 1",fillcolor="brown1",style="filled",label="{OrigId: 8632435727821051414{{.*}}\nmain -\> _Z3foov}"];367; DOTCLONED: Node[[MAIN1]] -> Node[[FOO]][tooltip="ContextIds: 1",fillcolor="brown1",color="brown1"];368; DOTCLONED: Node[[MAIN2:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN2]] ContextIds: 2",fillcolor="cyan",style="filled",label="{OrigId: 15025054523792398438{{.*}}\nmain -\> _Z3foov}"];369; DOTCLONED: Node[[MAIN2]] -> Node[[FOO2:0x[a-z0-9]+]][tooltip="ContextIds: 2",fillcolor="cyan",color="cyan"];370; DOTCLONED: Node[[FOO2]] [shape=record,tooltip="N[[FOO2]] ContextIds: 2",fillcolor="cyan",color="blue",style="filled,bold,dashed",label="{OrigId: 0{{.*}}\n_Z3foov -\> _Z3bazv}"];371; DOTCLONED: Node[[FOO2]] -> Node[[BAZ2:0x[a-z0-9]+]][tooltip="ContextIds: 2",fillcolor="cyan",color="cyan"];372; DOTCLONED: Node[[BAZ2]] [shape=record,tooltip="N[[BAZ2]] ContextIds: 2",fillcolor="cyan",color="blue",style="filled,bold,dashed",label="{OrigId: 0{{.*}}\n_Z3bazv -\> _Z3barv}"];373; DOTCLONED: Node[[BAZ2]] -> Node[[BAR2:0x[a-z0-9]+]][tooltip="ContextIds: 2",fillcolor="cyan",color="cyan"];374; DOTCLONED: Node[[BAR2]] [shape=record,tooltip="N[[BAR2]] ContextIds: 2",fillcolor="cyan",color="blue",style="filled,bold,dashed",label="{OrigId: Alloc0{{.*}}\n_Z3barv -\> alloc}"];375; DOTCLONED: }376 377;; Here we are just ensuring that the post-function assign dot graph includes378;; clone information for both the caller and callee in the node labels.379; DOTFUNCASSIGN: _Z3bazv.memprof.1 -\> _Z3barv.memprof.1380; DOTFUNCASSIGN: _Z3barv.memprof.1 -\> alloc381 382; DISTRIB: ^[[BAZ:[0-9]+]] = gv: (guid: 1807954217441101578, {{.*}} callsites: ((callee: ^[[BAR:[0-9]+]], clones: (0, 1)383; DISTRIB: ^[[FOO:[0-9]+]] = gv: (guid: 8107868197919466657, {{.*}} callsites: ((callee: ^[[BAZ]], clones: (0, 1)384; DISTRIB: ^[[BAR]] = gv: (guid: 11481133863268513686, {{.*}} allocs: ((versions: (notcold, cold)385; DISTRIB: ^[[MAIN:[0-9]+]] = gv: (guid: 15822663052811949562, {{.*}} callsites: ((callee: ^[[FOO]], clones: (0), {{.*}} (callee: ^[[FOO]], clones: (1)386