brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.2 KiB · 1a6bf01 Raw
484 lines · plain
1;; Tests callsite context graph generation for call graph containing indirect2;; calls. Currently this should result in conservative behavior, such that the3;; indirect call receives a null call in its graph node, to prevent subsequent4;; cloning. Also tests graph and IR cloning.5;;6;; Original code looks like:7;;8;; char *foo() {9;;   return new char[10];10;; }11;; class A {12;; public:13;;     virtual char *x() { return foo(); }14;; };15;; class B : public A {16;; public:17;;     char *x() final { return foo(); }18;; };19;; char *bar(A *a) {20;;   return a->x();21;; }22;; int main(int argc, char **argv) {23;;   char *x = foo();24;;   char *y = foo();25;;   B b;26;;   char *z = bar(&b);27;;   char *w = bar(&b);28;;   A a;29;;   char *r = bar(&a);30;;   char *s = bar(&a);31;;   memset(x, 0, 10);32;;   memset(y, 0, 10);33;;   memset(z, 0, 10);34;;   memset(w, 0, 10);35;;   memset(r, 0, 10);36;;   memset(s, 0, 10);37;;   delete[] x;38;;   delete[] w;39;;   delete[] r;40;;   sleep(10);41;;   delete[] y;42;;   delete[] z;43;;   delete[] s;44;;   return 0;45;; }46;;47;; Code compiled with -mllvm -memprof-ave-lifetime-cold-threshold=5 so that the48;; memory freed after sleep(10) results in cold lifetimes.49;;50;; Compiled without optimization to prevent inlining and devirtualization.51;;52;; The IR was then reduced using llvm-reduce with the expected FileCheck input.53 54;; -stats requires asserts55; REQUIRES: asserts56 57; RUN: opt -thinlto-bc %s >%t.o58; RUN: llvm-lto2 run %t.o -enable-memprof-context-disambiguation \59; RUN:  -supports-hot-cold-new \60; RUN:  -r=%t.o,main,plx \61; RUN:  -r=%t.o,sleep, \62; RUN:  -r=%t.o,_Znam, \63; RUN:  -r=%t.o,_ZdaPv, \64; RUN:  -r=%t.o,_ZTVN10__cxxabiv120__si_class_type_infoE, \65; RUN:  -r=%t.o,_ZTVN10__cxxabiv117__class_type_infoE, \66; RUN:  -memprof-verify-ccg -memprof-verify-nodes -memprof-dump-ccg \67; RUN:  -memprof-export-to-dot -memprof-dot-file-path-prefix=%t. \68; RUN:  -stats -pass-remarks=memprof-context-disambiguation -save-temps \69; RUN:  -o %t.out 2>&1 | FileCheck %s --check-prefix=DUMP \70; RUN:  --check-prefix=STATS --check-prefix=STATS-BE --check-prefix=REMARKS71 72; RUN:  cat %t.ccg.postbuild.dot | FileCheck %s --check-prefix=DOT73;; We should only create a single clone of foo, for the direct call74;; from main allocating cold memory.75; RUN:  cat %t.ccg.cloned.dot | FileCheck %s --check-prefix=DOTCLONED76 77; RUN: llvm-dis %t.out.1.4.opt.bc -o - | FileCheck %s --check-prefix=IR78 79 80;; Try again but with distributed ThinLTO81; RUN: llvm-lto2 run %t.o -enable-memprof-context-disambiguation \82; RUN:  -supports-hot-cold-new \83; RUN:  -thinlto-distributed-indexes \84; RUN:  -r=%t.o,main,plx \85; RUN:  -r=%t.o,_ZdaPv, \86; RUN:  -r=%t.o,sleep, \87; RUN:  -r=%t.o,_Znam, \88; RUN:  -r=%t.o,_ZTVN10__cxxabiv120__si_class_type_infoE, \89; RUN:  -r=%t.o,_ZTVN10__cxxabiv117__class_type_infoE, \90; RUN:  -memprof-verify-ccg -memprof-verify-nodes -memprof-dump-ccg \91; RUN:  -memprof-export-to-dot -memprof-dot-file-path-prefix=%t2. \92; RUN:  -stats -pass-remarks=memprof-context-disambiguation \93; RUN:  -o %t2.out 2>&1 | FileCheck %s --check-prefix=DUMP \94; RUN:  --check-prefix=STATS95 96; RUN:  cat %t.ccg.postbuild.dot | FileCheck %s --check-prefix=DOT97;; We should only create a single clone of foo, for the direct call98;; from main allocating cold memory.99; RUN:  cat %t.ccg.cloned.dot | FileCheck %s --check-prefix=DOTCLONED100 101;; Run ThinLTO backend102; RUN: opt -passes=memprof-context-disambiguation \103; RUN:  -memprof-import-summary=%t.o.thinlto.bc \104; RUN:  -stats -pass-remarks=memprof-context-disambiguation \105; RUN:  %t.o -S 2>&1 | FileCheck %s --check-prefix=IR \106; RUN:  --check-prefix=STATS-BE --check-prefix=REMARKS107 108source_filename = "indirectcall.ll"109target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"110target triple = "x86_64-unknown-linux-gnu"111 112@_ZTVN10__cxxabiv120__si_class_type_infoE = external global ptr113@_ZTVN10__cxxabiv117__class_type_infoE = external global ptr114 115define internal ptr @_Z3barP1A(ptr %a) #0 {116entry:117  ret ptr null118}119 120define i32 @main() #0 {121entry:122  %call = call ptr @_Z3foov(), !callsite !0123  %call1 = call ptr @_Z3foov(), !callsite !1124  %call2 = call ptr @_Z3barP1A(ptr null), !callsite !2125  %call3 = call ptr @_Z3barP1A(ptr null), !callsite !3126  %call4 = call ptr @_Z3barP1A(ptr null), !callsite !4127  %call5 = call ptr @_Z3barP1A(ptr null), !callsite !5128  ret i32 0129}130 131declare void @_ZdaPv()132 133declare i32 @sleep()134 135define internal ptr @_ZN1A1xEv() #0 {136entry:137  %call = call ptr @_Z3foov(), !callsite !6138  ret ptr null139}140 141define internal ptr @_ZN1B1xEv() #0 {142entry:143  %call = call ptr @_Z3foov(), !callsite !7144  ret ptr null145}146 147define internal ptr @_Z3foov() #0 {148entry:149  %call = call ptr @_Znam(i64 0), !memprof !8, !callsite !21150  ret ptr null151}152 153declare ptr @_Znam(i64)154 155; uselistorder directives156uselistorder ptr @_Z3foov, { 3, 2, 1, 0 }157 158attributes #0 = { noinline optnone }159 160!0 = !{i64 8632435727821051414}161!1 = !{i64 -3421689549917153178}162!2 = !{i64 6792096022461663180}163!3 = !{i64 -2709642582978494015}164!4 = !{i64 748269490701775343}165!5 = !{i64 -5747251260480066785}166!6 = !{i64 8256774051149711748}167!7 = !{i64 -4831879094954754638}168!8 = !{!9, !11, !13, !15, !17, !19}169!9 = !{!10, !"notcold"}170!10 = !{i64 2732490490862098848, i64 8256774051149711748, i64 -4820244510750103755, i64 748269490701775343}171!11 = !{!12, !"cold"}172!12 = !{i64 2732490490862098848, i64 8256774051149711748, i64 -4820244510750103755, i64 -5747251260480066785}173!13 = !{!14, !"notcold"}174!14 = !{i64 2732490490862098848, i64 8632435727821051414}175!15 = !{!16, !"cold"}176!16 = !{i64 2732490490862098848, i64 -4831879094954754638, i64 -4820244510750103755, i64 6792096022461663180}177!17 = !{!18, !"notcold"}178!18 = !{i64 2732490490862098848, i64 -4831879094954754638, i64 -4820244510750103755, i64 -2709642582978494015}179!19 = !{!20, !"cold"}180!20 = !{i64 2732490490862098848, i64 -3421689549917153178}181!21 = !{i64 2732490490862098848}182 183 184; DUMP: CCG before cloning:185; DUMP: Callsite Context Graph:186; DUMP: Node [[FOO:0x[a-z0-9]+]]187; DUMP: 	Versions: 1 MIB:188; DUMP: 		AllocType 1 StackIds: 6, 8, 4189; DUMP: 		AllocType 2 StackIds: 6, 8, 5190; DUMP: 		AllocType 1 StackIds: 0191; DUMP: 		AllocType 2 StackIds: 7, 8, 2192; DUMP: 		AllocType 1 StackIds: 7, 8, 3193; DUMP: 		AllocType 2 StackIds: 1194; DUMP: 	(clone 0)195; DUMP: 	AllocTypes: NotColdCold196; DUMP: 	ContextIds: 1 2 3 4 5 6197; DUMP: 	CalleeEdges:198; DUMP: 	CallerEdges:199; DUMP: 		Edge from Callee [[FOO]] to Caller: [[AX:0x[a-z0-9]+]] AllocTypes: NotColdCold ContextIds: 1 2200; DUMP: 		Edge from Callee [[FOO]] to Caller: [[MAIN1:0x[a-z0-9]+]] AllocTypes: NotCold ContextIds: 3201; DUMP: 		Edge from Callee [[FOO]] to Caller: [[BX:0x[a-z0-9]+]] AllocTypes: NotColdCold ContextIds: 4 5202; DUMP: 		Edge from Callee [[FOO]] to Caller: [[MAIN2:0x[a-z0-9]+]] AllocTypes: Cold ContextIds: 6203 204; DUMP: Node [[AX]]205; DUMP: 	Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 6	(clone 0)206; DUMP: 	AllocTypes: NotColdCold207; DUMP: 	ContextIds: 1 2208; DUMP: 	CalleeEdges:209; DUMP: 		Edge from Callee [[FOO]] to Caller: [[AX]] AllocTypes: NotColdCold ContextIds: 1 2210; DUMP: 	CallerEdges:211; DUMP: 		Edge from Callee [[AX]] to Caller: [[BAR:0x[a-z0-9]+]] AllocTypes: NotColdCold ContextIds: 1 2212 213;; Bar contains an indirect call, with multiple targets. It's call should be null.214; DUMP: Node [[BAR]]215; DUMP: 	null Call216; DUMP: 	AllocTypes: NotColdCold217; DUMP: 	ContextIds: 1 2 4 5218; DUMP: 	CalleeEdges:219; DUMP: 		Edge from Callee [[AX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 1 2220; DUMP: 		Edge from Callee [[BX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 4 5221; DUMP: 	CallerEdges:222; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN3:0x[a-z0-9]+]] AllocTypes: NotCold ContextIds: 1223; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN4:0x[a-z0-9]+]] AllocTypes: Cold ContextIds: 2224; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN5:0x[a-z0-9]+]] AllocTypes: Cold ContextIds: 4225; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN6:0x[a-z0-9]+]] AllocTypes: NotCold ContextIds: 5226 227; DUMP: Node [[MAIN3]]228; DUMP: 	Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 4	(clone 0)229; DUMP: 	AllocTypes: NotCold230; DUMP: 	ContextIds: 1231; DUMP: 	CalleeEdges:232; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN3]] AllocTypes: NotCold ContextIds: 1233; DUMP: 	CallerEdges:234 235; DUMP: Node [[MAIN4]]236; DUMP: 	Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 5	(clone 0)237; DUMP: 	AllocTypes: Cold238; DUMP: 	ContextIds: 2239; DUMP: 	CalleeEdges:240; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN4]] AllocTypes: Cold ContextIds: 2241; DUMP: 	CallerEdges:242 243; DUMP: Node [[MAIN1]]244; DUMP: 	Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 0	(clone 0)245; DUMP: 	AllocTypes: NotCold246; DUMP: 	ContextIds: 3247; DUMP: 	CalleeEdges:248; DUMP: 		Edge from Callee [[FOO]] to Caller: [[MAIN1]] AllocTypes: NotCold ContextIds: 3249; DUMP: 	CallerEdges:250 251; DUMP: Node [[BX]]252; DUMP: 	Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 7	(clone 0)253; DUMP: 	AllocTypes: NotColdCold254; DUMP: 	ContextIds: 4 5255; DUMP: 	CalleeEdges:256; DUMP: 		Edge from Callee [[FOO]] to Caller: [[BX]] AllocTypes: NotColdCold ContextIds: 4 5257; DUMP: 	CallerEdges:258; DUMP: 		Edge from Callee [[BX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 4 5259 260; DUMP: Node [[MAIN5]]261; DUMP: 	Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 2	(clone 0)262; DUMP: 	AllocTypes: Cold263; DUMP: 	ContextIds: 4264; DUMP: 	CalleeEdges:265; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN5]] AllocTypes: Cold ContextIds: 4266; DUMP: 	CallerEdges:267 268; DUMP: Node [[MAIN6]]269; DUMP: 	Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 3	(clone 0)270; DUMP: 	AllocTypes: NotCold271; DUMP: 	ContextIds: 5272; DUMP: 	CalleeEdges:273; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN6]] AllocTypes: NotCold ContextIds: 5274; DUMP: 	CallerEdges:275 276; DUMP: Node [[MAIN2]]277; DUMP: 	Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 1	(clone 0)278; DUMP: 	AllocTypes: Cold279; DUMP: 	ContextIds: 6280; DUMP: 	CalleeEdges:281; DUMP: 		Edge from Callee [[FOO]] to Caller: [[MAIN2]] AllocTypes: Cold ContextIds: 6282; DUMP: 	CallerEdges:283 284; DUMP: CCG after cloning:285; DUMP: Callsite Context Graph:286; DUMP: Node [[FOO]]287; DUMP:         Versions: 1 MIB:288; DUMP:                 AllocType 1 StackIds: 6, 8, 4289; DUMP:                 AllocType 2 StackIds: 6, 8, 5290; DUMP:                 AllocType 1 StackIds: 0291; DUMP:                 AllocType 2 StackIds: 7, 8, 2292; DUMP:                 AllocType 1 StackIds: 7, 8, 3293; DUMP:                 AllocType 2 StackIds: 1294; DUMP:         (clone 0)295; DUMP: 	AllocTypes: NotColdCold296; DUMP: 	ContextIds: 1 2 3 4 5297; DUMP: 	CalleeEdges:298; DUMP: 	CallerEdges:299; DUMP: 		Edge from Callee [[FOO]] to Caller: [[AX]] AllocTypes: NotColdCold ContextIds: 1 2300; DUMP: 		Edge from Callee [[FOO]] to Caller: [[BX]] AllocTypes: NotColdCold ContextIds: 4 5301; DUMP: 		Edge from Callee [[FOO]] to Caller: [[MAIN1]] AllocTypes: NotCold ContextIds: 3302; DUMP:		Clones: [[FOO2:0x[a-z0-9]+]]303 304; DUMP: Node [[AX]]305; DUMP: 	Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 6    (clone 0)306; DUMP: 	AllocTypes: NotColdCold307; DUMP: 	ContextIds: 1 2308; DUMP: 	CalleeEdges:309; DUMP: 		Edge from Callee [[FOO]] to Caller: [[AX]] AllocTypes: NotColdCold ContextIds: 1 2310; DUMP: 	CallerEdges:311; DUMP: 		Edge from Callee [[AX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 1 2312 313; DUMP: Node [[BAR]]314; DUMP: 	null Call315; DUMP: 	AllocTypes: NotColdCold316; DUMP: 	ContextIds: 1 2 4 5317; DUMP: 	CalleeEdges:318; DUMP: 		Edge from Callee [[AX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 1 2319; DUMP: 		Edge from Callee [[BX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 4 5320; DUMP: 	CallerEdges:321; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN3]] AllocTypes: NotCold ContextIds: 1322; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN4]] AllocTypes: Cold ContextIds: 2323; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN5]] AllocTypes: Cold ContextIds: 4324; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN6]] AllocTypes: NotCold ContextIds: 5325 326; DUMP: Node [[MAIN3]]327; DUMP: 	Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 4   (clone 0)328; DUMP: 	AllocTypes: NotCold329; DUMP: 	ContextIds: 1330; DUMP: 	CalleeEdges:331; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN3]] AllocTypes: NotCold ContextIds: 1332; DUMP: 	CallerEdges:333 334; DUMP: Node [[MAIN4]]335; DUMP: 	Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 5   (clone 0)336; DUMP: 	AllocTypes: Cold337; DUMP: 	ContextIds: 2338; DUMP: 	CalleeEdges:339; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN4]] AllocTypes: Cold ContextIds: 2340; DUMP: 	CallerEdges:341 342; DUMP: Node [[MAIN1]]343; DUMP: 	Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 0    (clone 0)344; DUMP: 	AllocTypes: NotCold345; DUMP: 	ContextIds: 3346; DUMP: 	CalleeEdges:347; DUMP: 		Edge from Callee [[FOO]] to Caller: [[MAIN1]] AllocTypes: NotCold ContextIds: 3348; DUMP: 	CallerEdges:349 350; DUMP: Node [[BX]]351; DUMP: 	Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 7    (clone 0)352; DUMP: 	AllocTypes: NotColdCold353; DUMP: 	ContextIds: 4 5354; DUMP: 	CalleeEdges:355; DUMP: 		Edge from Callee [[FOO]] to Caller: [[BX]] AllocTypes: NotColdCold ContextIds: 4 5356; DUMP: 	CallerEdges:357; DUMP: 		Edge from Callee [[BX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 4 5358 359; DUMP: Node [[MAIN5]]360; DUMP: 	Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 2   (clone 0)361; DUMP: 	AllocTypes: Cold362; DUMP: 	ContextIds: 4363; DUMP: 	CalleeEdges:364; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN5]] AllocTypes: Cold ContextIds: 4365; DUMP: 	CallerEdges:366 367; DUMP: Node [[MAIN6]]368; DUMP: 	Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 3   (clone 0)369; DUMP: 	AllocTypes: NotCold370; DUMP: 	ContextIds: 5371; DUMP: 	CalleeEdges:372; DUMP: 		Edge from Callee [[BAR]] to Caller: [[MAIN6]] AllocTypes: NotCold ContextIds: 5373; DUMP: 	CallerEdges:374 375; DUMP: Node [[MAIN2]]376; DUMP: 	Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 1    (clone 0)377; DUMP: 	AllocTypes: Cold378; DUMP: 	ContextIds: 6379; DUMP: 	CalleeEdges:380; DUMP: 		Edge from Callee [[FOO2]] to Caller: [[MAIN2]] AllocTypes: Cold ContextIds: 6381; DUMP: 	CallerEdges:382 383; DUMP: Node [[FOO2]]384; DUMP:         Versions: 1 MIB:385; DUMP:                 AllocType 1 StackIds: 6, 8, 4386; DUMP:                 AllocType 2 StackIds: 6, 8, 5387; DUMP:                 AllocType 1 StackIds: 0388; DUMP:                 AllocType 2 StackIds: 7, 8, 2389; DUMP:                 AllocType 1 StackIds: 7, 8, 3390; DUMP:                 AllocType 2 StackIds: 1391; DUMP:         (clone 0)392; DUMP: 	AllocTypes: Cold393; DUMP: 	ContextIds: 6394; DUMP: 	CalleeEdges:395; DUMP: 	CallerEdges:396; DUMP: 		Edge from Callee [[FOO2]] to Caller: [[MAIN2]] AllocTypes: Cold ContextIds: 6397; DUMP:		Clone of [[FOO]]398 399 400; REMARKS: call in clone main assigned to call function clone _Z3foov.memprof.1401; REMARKS: created clone _Z3foov.memprof.1402; REMARKS: call in clone _Z3foov marked with memprof allocation attribute notcold403; REMARKS: call in clone _Z3foov.memprof.1 marked with memprof allocation attribute cold404 405 406; IR: define {{.*}} @main(407; IR:   call {{.*}} @_Z3foov()408;; Only the second call to foo, which allocates cold memory via direct calls,409;; is replaced with a call to a clone that calls a cold allocation.410; IR:   call {{.*}} @_Z3foov.memprof.1()411; IR:   call {{.*}} @_Z3barP1A(412; IR:   call {{.*}} @_Z3barP1A(413; IR:   call {{.*}} @_Z3barP1A(414; IR:   call {{.*}} @_Z3barP1A(415; IR: define internal {{.*}} @_Z3foov()416; IR:   call {{.*}} @_Znam(i64 0) #[[NOTCOLD:[0-9]+]]417; IR: define internal {{.*}} @_Z3foov.memprof.1()418; IR:   call {{.*}} @_Znam(i64 0) #[[COLD:[0-9]+]]419; IR: attributes #[[NOTCOLD]] = { "memprof"="notcold" }420; IR: attributes #[[COLD]] = { "memprof"="cold" }421 422 423; STATS: 1 memprof-context-disambiguation - Number of cold static allocations (possibly cloned)424; STATS-BE: 1 memprof-context-disambiguation - Number of cold static allocations (possibly cloned) during ThinLTO backend425; STATS: 1 memprof-context-disambiguation - Number of not cold static allocations (possibly cloned)426; STATS-BE: 1 memprof-context-disambiguation - Number of not cold static allocations (possibly cloned) during ThinLTO backend427; STATS-BE: 2 memprof-context-disambiguation - Number of allocation versions (including clones) during ThinLTO backend428; STATS: 1 memprof-context-disambiguation - Number of function clones created during whole program analysis429; STATS-BE: 1 memprof-context-disambiguation - Number of function clones created during ThinLTO backend430; STATS-BE: 1 memprof-context-disambiguation - Number of functions that had clones created during ThinLTO backend431; STATS-BE: 2 memprof-context-disambiguation - Maximum number of allocation versions created for an original allocation during ThinLTO backend432; STATS-BE: 1 memprof-context-disambiguation - Number of original (not cloned) allocations with memprof profiles during ThinLTO backend433 434 435; DOT: digraph "postbuild" {436; DOT: 	label="postbuild";437; DOT: 	Node[[FOO:0x[a-z0-9]+]] [shape=record,tooltip="N[[FOO]] ContextIds: 1 2 3 4 5 6",fillcolor="mediumorchid1",style="filled",label="{OrigId: Alloc0{{.*}}\n_Z3foov -\> alloc}"];438; DOT: 	Node[[AX:0x[a-z0-9]+]] [shape=record,tooltip="N[[AX]] ContextIds: 1 2",fillcolor="mediumorchid1",style="filled",label="{OrigId: 8256774051149711748{{.*}}\n_ZN1A1xEv -\> _Z3foov}"];439; DOT: 	Node[[AX]] -> Node[[FOO]][tooltip="ContextIds: 1 2",fillcolor="mediumorchid1"440; DOT: 	Node[[BAR:0x[a-z0-9]+]] [shape=record,tooltip="N[[BAR]] ContextIds: 1 2 4 5",fillcolor="mediumorchid1",style="filled",label="{OrigId: 13626499562959447861{{.*}}\nnull call (external)}"];441; DOT: 	Node[[BAR]] -> Node[[AX]][tooltip="ContextIds: 1 2",fillcolor="mediumorchid1"442; DOT: 	Node[[BAR]] -> Node[[BX:0x[a-z0-9]+]][tooltip="ContextIds: 4 5",fillcolor="mediumorchid1"443; DOT: 	Node[[MAIN1:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN1]] ContextIds: 1",fillcolor="brown1",style="filled",label="{OrigId: 748269490701775343{{.*}}\nmain -\> _Z3barP1A}"];444; DOT: 	Node[[MAIN1]] -> Node[[BAR]][tooltip="ContextIds: 1",fillcolor="brown1"445; DOT: 	Node[[MAIN2:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN2]] ContextIds: 2",fillcolor="cyan",style="filled",label="{OrigId: 12699492813229484831{{.*}}\nmain -\> _Z3barP1A}"];446; DOT: 	Node[[MAIN2]] -> Node[[BAR]][tooltip="ContextIds: 2",fillcolor="cyan"447; DOT: 	Node[[MAIN3:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN3]] ContextIds: 3",fillcolor="brown1",style="filled",label="{OrigId: 8632435727821051414{{.*}}\nmain -\> _Z3foov}"];448; DOT: 	Node[[MAIN3]] -> Node[[FOO]][tooltip="ContextIds: 3",fillcolor="brown1"449; DOT: 	Node[[BX]] [shape=record,tooltip="N[[BX]] ContextIds: 4 5",fillcolor="mediumorchid1",style="filled",label="{OrigId: 13614864978754796978{{.*}}\n_ZN1B1xEv -\> _Z3foov}"];450; DOT: 	Node[[BX]] -> Node[[FOO]][tooltip="ContextIds: 4 5",fillcolor="mediumorchid1"451; DOT: 	Node[[MAIN4:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN4]] ContextIds: 4",fillcolor="cyan",style="filled",label="{OrigId: 6792096022461663180{{.*}}\nmain -\> _Z3barP1A}"];452; DOT: 	Node[[MAIN4]] -> Node[[BAR]][tooltip="ContextIds: 4",fillcolor="cyan"453; DOT: 	Node[[MAIN5:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN5]] ContextIds: 5",fillcolor="brown1",style="filled",label="{OrigId: 15737101490731057601{{.*}}\nmain -\> _Z3barP1A}"];454; DOT: 	Node[[MAIN5]] -> Node[[BAR]][tooltip="ContextIds: 5",fillcolor="brown1"455; DOT: 	Node[[MAIN6:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN6]] ContextIds: 6",fillcolor="cyan",style="filled",label="{OrigId: 15025054523792398438{{.*}}\nmain -\> _Z3foov}"];456; DOT: 	Node[[MAIN6]] -> Node[[FOO]][tooltip="ContextIds: 6",fillcolor="cyan"457; DOT: }458 459 460; DOTCLONED: digraph "cloned" {461; DOTCLONED: 	label="cloned";462; DOTCLONED: 	Node[[FOO2:0x[a-z0-9]+]] [shape=record,tooltip="N[[FOO2]] ContextIds: 1 2 3 4 5",fillcolor="mediumorchid1",style="filled",label="{OrigId: Alloc0{{.*}}\n_Z3foov -\> alloc}"];463; DOTCLONED: 	Node[[AX:0x[a-z0-9]+]] [shape=record,tooltip="N[[AX]] ContextIds: 1 2",fillcolor="mediumorchid1",style="filled",label="{OrigId: 8256774051149711748{{.*}}\n_ZN1A1xEv -\> _Z3foov}"];464; DOTCLONED: 	Node[[AX]] -> Node[[FOO2]][tooltip="ContextIds: 1 2",fillcolor="mediumorchid1"465; DOTCLONED: 	Node[[BAR:0x[a-z0-9]+]] [shape=record,tooltip="N[[BAR]] ContextIds: 1 2 4 5",fillcolor="mediumorchid1",style="filled",label="{OrigId: 13626499562959447861{{.*}}\nnull call (external)}"];466; DOTCLONED: 	Node[[BAR]] -> Node[[AX]][tooltip="ContextIds: 1 2",fillcolor="mediumorchid1"467; DOTCLONED: 	Node[[BAR]] -> Node[[BX:0x[a-z0-9]+]][tooltip="ContextIds: 4 5",fillcolor="mediumorchid1"468; DOTCLONED: 	Node[[MAIN1:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN1]] ContextIds: 1",fillcolor="brown1",style="filled",label="{OrigId: 748269490701775343{{.*}}\nmain -\> _Z3barP1A}"];469; DOTCLONED: 	Node[[MAIN1]] -> Node[[BAR]][tooltip="ContextIds: 1",fillcolor="brown1"470; DOTCLONED: 	Node[[MAIN2:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN2]] ContextIds: 2",fillcolor="cyan",style="filled",label="{OrigId: 12699492813229484831{{.*}}\nmain -\> _Z3barP1A}"];471; DOTCLONED: 	Node[[MAIN2]] -> Node[[BAR]][tooltip="ContextIds: 2",fillcolor="cyan"472; DOTCLONED: 	Node[[MAIN3:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN3]] ContextIds: 3",fillcolor="brown1",style="filled",label="{OrigId: 8632435727821051414{{.*}}\nmain -\> _Z3foov}"];473; DOTCLONED: 	Node[[MAIN3]] -> Node[[FOO2]][tooltip="ContextIds: 3",fillcolor="brown1"474; DOTCLONED: 	Node[[BX]] [shape=record,tooltip="N[[BX]] ContextIds: 4 5",fillcolor="mediumorchid1",style="filled",label="{OrigId: 13614864978754796978{{.*}}\n_ZN1B1xEv -\> _Z3foov}"];475; DOTCLONED: 	Node[[BX]] -> Node[[FOO2]][tooltip="ContextIds: 4 5",fillcolor="mediumorchid1"476; DOTCLONED: 	Node[[MAIN4:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN4]] ContextIds: 4",fillcolor="cyan",style="filled",label="{OrigId: 6792096022461663180{{.*}}\nmain -\> _Z3barP1A}"];477; DOTCLONED: 	Node[[MAIN4]] -> Node[[BAR]][tooltip="ContextIds: 4",fillcolor="cyan"478; DOTCLONED: 	Node[[MAIN5:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN5]] ContextIds: 5",fillcolor="brown1",style="filled",label="{OrigId: 15737101490731057601{{.*}}\nmain -\> _Z3barP1A}"];479; DOTCLONED: 	Node[[MAIN5]] -> Node[[BAR]][tooltip="ContextIds: 5",fillcolor="brown1"480; DOTCLONED: 	Node[[MAIN6:0x[a-z0-9]+]] [shape=record,tooltip="N[[MAIN6]] ContextIds: 6",fillcolor="cyan",style="filled",label="{OrigId: 15025054523792398438{{.*}}\nmain -\> _Z3foov}"];481; DOTCLONED: 	Node[[MAIN6]] -> Node[[FOO2:0x[a-z0-9]+]][tooltip="ContextIds: 6",fillcolor="cyan"482; DOTCLONED: 	Node[[FOO2]] [shape=record,tooltip="N[[FOO2]] ContextIds: 6",fillcolor="cyan",color="blue",style="filled,bold,dashed",label="{OrigId: Alloc0{{.*}}\n_Z3foov -\> alloc}"];483; DOTCLONED: }484