1;; Tests callsite context graph generation for call graph containing indirect 2;; calls. Currently this should result in conservative behavior, such that the 3;; indirect call receives a null call in its graph node, to prevent subsequent 4;; 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 the 48;; 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 asserts 55; REQUIRES: asserts 56 57; RUN: opt -thinlto-bc %s >%t.o 58; 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=REMARKS 71 72; RUN: cat %t.ccg.postbuild.dot | FileCheck %s --check-prefix=DOT 73;; We should only create a single clone of foo, for the direct call 74;; from main allocating cold memory. 75; RUN: cat %t.ccg.cloned.dot | FileCheck %s --check-prefix=DOTCLONED 76 77; RUN: llvm-dis %t.out.1.4.opt.bc -o - | FileCheck %s --check-prefix=IR 78 79 80;; Try again but with distributed ThinLTO 81; 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=STATS 95 96; RUN: cat %t.ccg.postbuild.dot | FileCheck %s --check-prefix=DOT 97;; We should only create a single clone of foo, for the direct call 98;; from main allocating cold memory. 99; RUN: cat %t.ccg.cloned.dot | FileCheck %s --check-prefix=DOTCLONED 100 101;; Run ThinLTO backend 102; 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=REMARKS 107 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 ptr 113@_ZTVN10__cxxabiv117__class_type_infoE = external global ptr 114 115define internal ptr @_Z3barP1A(ptr %a) #0 { 116entry: 117 ret ptr null 118} 119 120define i32 @main() #0 { 121entry: 122 %call = call ptr @_Z3foov(), !callsite !0 123 %call1 = call ptr @_Z3foov(), !callsite !1 124 %call2 = call ptr @_Z3barP1A(ptr null), !callsite !2 125 %call3 = call ptr @_Z3barP1A(ptr null), !callsite !3 126 %call4 = call ptr @_Z3barP1A(ptr null), !callsite !4 127 %call5 = call ptr @_Z3barP1A(ptr null), !callsite !5 128 ret i32 0 129} 130 131declare void @_ZdaPv() 132 133declare i32 @sleep() 134 135define internal ptr @_ZN1A1xEv() #0 { 136entry: 137 %call = call ptr @_Z3foov(), !callsite !6 138 ret ptr null 139} 140 141define internal ptr @_ZN1B1xEv() #0 { 142entry: 143 %call = call ptr @_Z3foov(), !callsite !7 144 ret ptr null 145} 146 147define internal ptr @_Z3foov() #0 { 148entry: 149 %call = call ptr @_Znam(i64 0), !memprof !8, !callsite !21 150 ret ptr null 151} 152 153declare ptr @_Znam(i64) 154 155; uselistorder directives 156uselistorder 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, 4 189; DUMP: AllocType 2 StackIds: 6, 8, 5 190; DUMP: AllocType 1 StackIds: 0 191; DUMP: AllocType 2 StackIds: 7, 8, 2 192; DUMP: AllocType 1 StackIds: 7, 8, 3 193; DUMP: AllocType 2 StackIds: 1 194; DUMP: (clone 0) 195; DUMP: AllocTypes: NotColdCold 196; DUMP: ContextIds: 1 2 3 4 5 6 197; DUMP: CalleeEdges: 198; DUMP: CallerEdges: 199; DUMP: Edge from Callee [[FOO]] to Caller: [[AX:0x[a-z0-9]+]] AllocTypes: NotColdCold ContextIds: 1 2 200; DUMP: Edge from Callee [[FOO]] to Caller: [[MAIN1:0x[a-z0-9]+]] AllocTypes: NotCold ContextIds: 3 201; DUMP: Edge from Callee [[FOO]] to Caller: [[BX:0x[a-z0-9]+]] AllocTypes: NotColdCold ContextIds: 4 5 202; DUMP: Edge from Callee [[FOO]] to Caller: [[MAIN2:0x[a-z0-9]+]] AllocTypes: Cold ContextIds: 6 203 204; DUMP: Node [[AX]] 205; DUMP: Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 6 (clone 0) 206; DUMP: AllocTypes: NotColdCold 207; DUMP: ContextIds: 1 2 208; DUMP: CalleeEdges: 209; DUMP: Edge from Callee [[FOO]] to Caller: [[AX]] AllocTypes: NotColdCold ContextIds: 1 2 210; DUMP: CallerEdges: 211; DUMP: Edge from Callee [[AX]] to Caller: [[BAR:0x[a-z0-9]+]] AllocTypes: NotColdCold ContextIds: 1 2 212 213;; Bar contains an indirect call, with multiple targets. It's call should be null. 214; DUMP: Node [[BAR]] 215; DUMP: null Call 216; DUMP: AllocTypes: NotColdCold 217; DUMP: ContextIds: 1 2 4 5 218; DUMP: CalleeEdges: 219; DUMP: Edge from Callee [[AX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 1 2 220; DUMP: Edge from Callee [[BX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 4 5 221; DUMP: CallerEdges: 222; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN3:0x[a-z0-9]+]] AllocTypes: NotCold ContextIds: 1 223; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN4:0x[a-z0-9]+]] AllocTypes: Cold ContextIds: 2 224; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN5:0x[a-z0-9]+]] AllocTypes: Cold ContextIds: 4 225; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN6:0x[a-z0-9]+]] AllocTypes: NotCold ContextIds: 5 226 227; DUMP: Node [[MAIN3]] 228; DUMP: Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 4 (clone 0) 229; DUMP: AllocTypes: NotCold 230; DUMP: ContextIds: 1 231; DUMP: CalleeEdges: 232; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN3]] AllocTypes: NotCold ContextIds: 1 233; DUMP: CallerEdges: 234 235; DUMP: Node [[MAIN4]] 236; DUMP: Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 5 (clone 0) 237; DUMP: AllocTypes: Cold 238; DUMP: ContextIds: 2 239; DUMP: CalleeEdges: 240; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN4]] AllocTypes: Cold ContextIds: 2 241; DUMP: CallerEdges: 242 243; DUMP: Node [[MAIN1]] 244; DUMP: Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 0 (clone 0) 245; DUMP: AllocTypes: NotCold 246; DUMP: ContextIds: 3 247; DUMP: CalleeEdges: 248; DUMP: Edge from Callee [[FOO]] to Caller: [[MAIN1]] AllocTypes: NotCold ContextIds: 3 249; DUMP: CallerEdges: 250 251; DUMP: Node [[BX]] 252; DUMP: Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 7 (clone 0) 253; DUMP: AllocTypes: NotColdCold 254; DUMP: ContextIds: 4 5 255; DUMP: CalleeEdges: 256; DUMP: Edge from Callee [[FOO]] to Caller: [[BX]] AllocTypes: NotColdCold ContextIds: 4 5 257; DUMP: CallerEdges: 258; DUMP: Edge from Callee [[BX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 4 5 259 260; DUMP: Node [[MAIN5]] 261; DUMP: Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 2 (clone 0) 262; DUMP: AllocTypes: Cold 263; DUMP: ContextIds: 4 264; DUMP: CalleeEdges: 265; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN5]] AllocTypes: Cold ContextIds: 4 266; DUMP: CallerEdges: 267 268; DUMP: Node [[MAIN6]] 269; DUMP: Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 3 (clone 0) 270; DUMP: AllocTypes: NotCold 271; DUMP: ContextIds: 5 272; DUMP: CalleeEdges: 273; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN6]] AllocTypes: NotCold ContextIds: 5 274; DUMP: CallerEdges: 275 276; DUMP: Node [[MAIN2]] 277; DUMP: Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 1 (clone 0) 278; DUMP: AllocTypes: Cold 279; DUMP: ContextIds: 6 280; DUMP: CalleeEdges: 281; DUMP: Edge from Callee [[FOO]] to Caller: [[MAIN2]] AllocTypes: Cold ContextIds: 6 282; 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, 4 289; DUMP: AllocType 2 StackIds: 6, 8, 5 290; DUMP: AllocType 1 StackIds: 0 291; DUMP: AllocType 2 StackIds: 7, 8, 2 292; DUMP: AllocType 1 StackIds: 7, 8, 3 293; DUMP: AllocType 2 StackIds: 1 294; DUMP: (clone 0) 295; DUMP: AllocTypes: NotColdCold 296; DUMP: ContextIds: 1 2 3 4 5 297; DUMP: CalleeEdges: 298; DUMP: CallerEdges: 299; DUMP: Edge from Callee [[FOO]] to Caller: [[AX]] AllocTypes: NotColdCold ContextIds: 1 2 300; DUMP: Edge from Callee [[FOO]] to Caller: [[BX]] AllocTypes: NotColdCold ContextIds: 4 5 301; DUMP: Edge from Callee [[FOO]] to Caller: [[MAIN1]] AllocTypes: NotCold ContextIds: 3 302; 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: NotColdCold 307; DUMP: ContextIds: 1 2 308; DUMP: CalleeEdges: 309; DUMP: Edge from Callee [[FOO]] to Caller: [[AX]] AllocTypes: NotColdCold ContextIds: 1 2 310; DUMP: CallerEdges: 311; DUMP: Edge from Callee [[AX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 1 2 312 313; DUMP: Node [[BAR]] 314; DUMP: null Call 315; DUMP: AllocTypes: NotColdCold 316; DUMP: ContextIds: 1 2 4 5 317; DUMP: CalleeEdges: 318; DUMP: Edge from Callee [[AX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 1 2 319; DUMP: Edge from Callee [[BX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 4 5 320; DUMP: CallerEdges: 321; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN3]] AllocTypes: NotCold ContextIds: 1 322; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN4]] AllocTypes: Cold ContextIds: 2 323; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN5]] AllocTypes: Cold ContextIds: 4 324; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN6]] AllocTypes: NotCold ContextIds: 5 325 326; DUMP: Node [[MAIN3]] 327; DUMP: Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 4 (clone 0) 328; DUMP: AllocTypes: NotCold 329; DUMP: ContextIds: 1 330; DUMP: CalleeEdges: 331; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN3]] AllocTypes: NotCold ContextIds: 1 332; DUMP: CallerEdges: 333 334; DUMP: Node [[MAIN4]] 335; DUMP: Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 5 (clone 0) 336; DUMP: AllocTypes: Cold 337; DUMP: ContextIds: 2 338; DUMP: CalleeEdges: 339; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN4]] AllocTypes: Cold ContextIds: 2 340; DUMP: CallerEdges: 341 342; DUMP: Node [[MAIN1]] 343; DUMP: Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 0 (clone 0) 344; DUMP: AllocTypes: NotCold 345; DUMP: ContextIds: 3 346; DUMP: CalleeEdges: 347; DUMP: Edge from Callee [[FOO]] to Caller: [[MAIN1]] AllocTypes: NotCold ContextIds: 3 348; DUMP: CallerEdges: 349 350; DUMP: Node [[BX]] 351; DUMP: Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 7 (clone 0) 352; DUMP: AllocTypes: NotColdCold 353; DUMP: ContextIds: 4 5 354; DUMP: CalleeEdges: 355; DUMP: Edge from Callee [[FOO]] to Caller: [[BX]] AllocTypes: NotColdCold ContextIds: 4 5 356; DUMP: CallerEdges: 357; DUMP: Edge from Callee [[BX]] to Caller: [[BAR]] AllocTypes: NotColdCold ContextIds: 4 5 358 359; DUMP: Node [[MAIN5]] 360; DUMP: Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 2 (clone 0) 361; DUMP: AllocTypes: Cold 362; DUMP: ContextIds: 4 363; DUMP: CalleeEdges: 364; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN5]] AllocTypes: Cold ContextIds: 4 365; DUMP: CallerEdges: 366 367; DUMP: Node [[MAIN6]] 368; DUMP: Callee: 2040285415115148168 (_Z3barP1A) Clones: 0 StackIds: 3 (clone 0) 369; DUMP: AllocTypes: NotCold 370; DUMP: ContextIds: 5 371; DUMP: CalleeEdges: 372; DUMP: Edge from Callee [[BAR]] to Caller: [[MAIN6]] AllocTypes: NotCold ContextIds: 5 373; DUMP: CallerEdges: 374 375; DUMP: Node [[MAIN2]] 376; DUMP: Callee: 15844184524768596045 (_Z3foov) Clones: 0 StackIds: 1 (clone 0) 377; DUMP: AllocTypes: Cold 378; DUMP: ContextIds: 6 379; DUMP: CalleeEdges: 380; DUMP: Edge from Callee [[FOO2]] to Caller: [[MAIN2]] AllocTypes: Cold ContextIds: 6 381; DUMP: CallerEdges: 382 383; DUMP: Node [[FOO2]] 384; DUMP: Versions: 1 MIB: 385; DUMP: AllocType 1 StackIds: 6, 8, 4 386; DUMP: AllocType 2 StackIds: 6, 8, 5 387; DUMP: AllocType 1 StackIds: 0 388; DUMP: AllocType 2 StackIds: 7, 8, 2 389; DUMP: AllocType 1 StackIds: 7, 8, 3 390; DUMP: AllocType 2 StackIds: 1 391; DUMP: (clone 0) 392; DUMP: AllocTypes: Cold 393; DUMP: ContextIds: 6 394; DUMP: CalleeEdges: 395; DUMP: CallerEdges: 396; DUMP: Edge from Callee [[FOO2]] to Caller: [[MAIN2]] AllocTypes: Cold ContextIds: 6 397; DUMP: Clone of [[FOO]] 398 399 400; REMARKS: call in clone main assigned to call function clone _Z3foov.memprof.1 401; REMARKS: created clone _Z3foov.memprof.1 402; REMARKS: call in clone _Z3foov marked with memprof allocation attribute notcold 403; REMARKS: call in clone _Z3foov.memprof.1 marked with memprof allocation attribute cold 404 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 backend 425; 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 backend 427; STATS-BE: 2 memprof-context-disambiguation - Number of allocation versions (including clones) during ThinLTO backend 428; STATS: 1 memprof-context-disambiguation - Number of function clones created during whole program analysis 429; STATS-BE: 1 memprof-context-disambiguation - Number of function clones created during ThinLTO backend 430; STATS-BE: 1 memprof-context-disambiguation - Number of functions that had clones created during ThinLTO backend 431; STATS-BE: 2 memprof-context-disambiguation - Maximum number of allocation versions created for an original allocation during ThinLTO backend 432; STATS-BE: 1 memprof-context-disambiguation - Number of original (not cloned) allocations with memprof profiles during ThinLTO backend 433 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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",style="filled",color="blue",style="filled,bold,dashed",label="{OrigId: Alloc0\n_Z3foov -\> alloc}"]; 483; DOTCLONED: } 484