brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.1 KiB · 537e1b8 Raw
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