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