1*ac8a9f8fSKazu Hirata; REQUIRES: x86_64-linux 2*ac8a9f8fSKazu Hirata 3*ac8a9f8fSKazu Hirata; Make sure that we can undrift the MemProf profile and annotate the IR 4*ac8a9f8fSKazu Hirata; accordingly. 5*ac8a9f8fSKazu Hirata; 6*ac8a9f8fSKazu Hirata; The IR was generated from: 7*ac8a9f8fSKazu Hirata; 8*ac8a9f8fSKazu Hirata; char *foo() { return ::new char[4]; } 9*ac8a9f8fSKazu Hirata; char *leaf() { return ::new char[4]; } 10*ac8a9f8fSKazu Hirata; char *middle() { return leaf(); } 11*ac8a9f8fSKazu Hirata; char *aaa() { return middle(); } 12*ac8a9f8fSKazu Hirata; char *bbb() { return middle(); } 13*ac8a9f8fSKazu Hirata; 14*ac8a9f8fSKazu Hirata; int main() { 15*ac8a9f8fSKazu Hirata; foo(); 16*ac8a9f8fSKazu Hirata; 17*ac8a9f8fSKazu Hirata; char *a = aaa(); 18*ac8a9f8fSKazu Hirata; char *b = bbb(); 19*ac8a9f8fSKazu Hirata; a[0] = 'a'; 20*ac8a9f8fSKazu Hirata; b[0] = 'b'; 21*ac8a9f8fSKazu Hirata; delete[] a; 22*ac8a9f8fSKazu Hirata; sleep(10); 23*ac8a9f8fSKazu Hirata; delete[] b; 24*ac8a9f8fSKazu Hirata; 25*ac8a9f8fSKazu Hirata; return 0; 26*ac8a9f8fSKazu Hirata; } 27*ac8a9f8fSKazu Hirata 28*ac8a9f8fSKazu Hirata; RUN: split-file %s %t 29*ac8a9f8fSKazu Hirata; RUN: llvm-profdata merge %t/memprof_undrift.yaml -o %t/memprof_undrift.memprofdata 30*ac8a9f8fSKazu Hirata; RUN: opt < %t/memprof_undrift.ll -passes='memprof-use<profile-filename=%t/memprof_undrift.memprofdata>' -memprof-salvage-stale-profile -memprof-ave-lifetime-cold-threshold=5 -S 2>&1 | FileCheck %s 31*ac8a9f8fSKazu Hirata 32*ac8a9f8fSKazu Hirata;--- memprof_undrift.yaml 33*ac8a9f8fSKazu Hirata--- 34*ac8a9f8fSKazu HirataHeapProfileRecords: 35*ac8a9f8fSKazu Hirata - GUID: _Z3aaav 36*ac8a9f8fSKazu Hirata AllocSites: [] 37*ac8a9f8fSKazu Hirata CallSites: 38*ac8a9f8fSKazu Hirata - - { Function: _Z3aaav, LineOffset: 5, Column: 33, IsInlineFrame: false } 39*ac8a9f8fSKazu Hirata - GUID: _Z6middlev 40*ac8a9f8fSKazu Hirata AllocSites: [] 41*ac8a9f8fSKazu Hirata CallSites: 42*ac8a9f8fSKazu Hirata - - { Function: _Z6middlev, LineOffset: 5, Column: 33, IsInlineFrame: false } 43*ac8a9f8fSKazu Hirata - GUID: _Z3foov 44*ac8a9f8fSKazu Hirata AllocSites: 45*ac8a9f8fSKazu Hirata - Callstack: 46*ac8a9f8fSKazu Hirata - { Function: _Z3foov, LineOffset: 5, Column: 33, IsInlineFrame: false } 47*ac8a9f8fSKazu Hirata - { Function: main, LineOffset: 5, Column: 33, IsInlineFrame: false } 48*ac8a9f8fSKazu Hirata MemInfoBlock: 49*ac8a9f8fSKazu Hirata AllocCount: 1 50*ac8a9f8fSKazu Hirata TotalSize: 4 51*ac8a9f8fSKazu Hirata TotalLifetime: 10000 52*ac8a9f8fSKazu Hirata TotalLifetimeAccessDensity: 0 53*ac8a9f8fSKazu Hirata CallSites: [] 54*ac8a9f8fSKazu Hirata - GUID: _Z4leafv 55*ac8a9f8fSKazu Hirata AllocSites: 56*ac8a9f8fSKazu Hirata - Callstack: 57*ac8a9f8fSKazu Hirata - { Function: _Z4leafv, LineOffset: 5, Column: 33, IsInlineFrame: false } 58*ac8a9f8fSKazu Hirata - { Function: _Z6middlev, LineOffset: 5, Column: 33, IsInlineFrame: false } 59*ac8a9f8fSKazu Hirata - { Function: _Z3aaav, LineOffset: 5, Column: 33, IsInlineFrame: false } 60*ac8a9f8fSKazu Hirata - { Function: main, LineOffset: 5, Column: 33, IsInlineFrame: false } 61*ac8a9f8fSKazu Hirata MemInfoBlock: 62*ac8a9f8fSKazu Hirata AllocCount: 1 63*ac8a9f8fSKazu Hirata TotalSize: 4 64*ac8a9f8fSKazu Hirata TotalLifetime: 0 65*ac8a9f8fSKazu Hirata TotalLifetimeAccessDensity: 25000 66*ac8a9f8fSKazu Hirata - Callstack: 67*ac8a9f8fSKazu Hirata - { Function: _Z4leafv, LineOffset: 5, Column: 33, IsInlineFrame: false } 68*ac8a9f8fSKazu Hirata - { Function: _Z6middlev, LineOffset: 5, Column: 33, IsInlineFrame: false } 69*ac8a9f8fSKazu Hirata - { Function: _Z3bbbv, LineOffset: 5, Column: 33, IsInlineFrame: false } 70*ac8a9f8fSKazu Hirata - { Function: main, LineOffset: 5, Column: 33, IsInlineFrame: false } 71*ac8a9f8fSKazu Hirata MemInfoBlock: 72*ac8a9f8fSKazu Hirata AllocCount: 1 73*ac8a9f8fSKazu Hirata TotalSize: 4 74*ac8a9f8fSKazu Hirata TotalLifetime: 10000 75*ac8a9f8fSKazu Hirata TotalLifetimeAccessDensity: 2 76*ac8a9f8fSKazu Hirata CallSites: [] 77*ac8a9f8fSKazu Hirata - GUID: _Z3bbbv 78*ac8a9f8fSKazu Hirata AllocSites: [] 79*ac8a9f8fSKazu Hirata CallSites: 80*ac8a9f8fSKazu Hirata - - { Function: _Z3bbbv, LineOffset: 5, Column: 33, IsInlineFrame: false } 81*ac8a9f8fSKazu Hirata... 82*ac8a9f8fSKazu Hirata;--- memprof_undrift.ll 83*ac8a9f8fSKazu Hiratadefine dso_local ptr @_Z3foov() !dbg !5 { 84*ac8a9f8fSKazu Hirata; CHECK-LABEL: @_Z3foov() 85*ac8a9f8fSKazu Hirataentry: 86*ac8a9f8fSKazu Hirata %call = call ptr @_Znam(i64 4) #1, !dbg !8 87*ac8a9f8fSKazu Hirata; CHECK: call ptr @_Znam(i64 4) #[[ATTR:[0-9]+]] 88*ac8a9f8fSKazu Hirata ret ptr %call, !dbg !9 89*ac8a9f8fSKazu Hirata} 90*ac8a9f8fSKazu Hirata 91*ac8a9f8fSKazu Hirata; Function Attrs: nobuiltin allocsize(0) 92*ac8a9f8fSKazu Hiratadeclare ptr @_Znam(i64 noundef) #0 93*ac8a9f8fSKazu Hirata 94*ac8a9f8fSKazu Hiratadefine dso_local ptr @_Z4leafv() !dbg !10 { 95*ac8a9f8fSKazu Hirata; CHECK-LABEL: @_Z4leafv() 96*ac8a9f8fSKazu Hirataentry: 97*ac8a9f8fSKazu Hirata %call = call ptr @_Znam(i64 4) #1, !dbg !11 98*ac8a9f8fSKazu Hirata; CHECK: call ptr @_Znam(i64 4) {{.*}}, !memprof ![[M1:[0-9]+]], !callsite ![[C1:[0-9]+]] 99*ac8a9f8fSKazu Hirata ret ptr %call, !dbg !12 100*ac8a9f8fSKazu Hirata} 101*ac8a9f8fSKazu Hirata 102*ac8a9f8fSKazu Hiratadefine dso_local ptr @_Z6middlev() !dbg !13 { 103*ac8a9f8fSKazu Hirata; CHECK-LABEL: @_Z6middlev() 104*ac8a9f8fSKazu Hirataentry: 105*ac8a9f8fSKazu Hirata %call.i = call ptr @_Znam(i64 4) #1, !dbg !14 106*ac8a9f8fSKazu Hirata; CHECK: call ptr @_Znam(i64 4) {{.*}}, !callsite ![[C2:[0-9]+]] 107*ac8a9f8fSKazu Hirata ret ptr %call.i, !dbg !16 108*ac8a9f8fSKazu Hirata} 109*ac8a9f8fSKazu Hirata 110*ac8a9f8fSKazu Hiratadefine dso_local ptr @_Z3aaav() !dbg !17 { 111*ac8a9f8fSKazu Hirata; CHECK-LABEL: @_Z3aaav() 112*ac8a9f8fSKazu Hirataentry: 113*ac8a9f8fSKazu Hirata %call.i.i = call ptr @_Znam(i64 4) #1, !dbg !18 114*ac8a9f8fSKazu Hirata; CHECK: call ptr @_Znam(i64 4) {{.*}}, !callsite ![[C3:[0-9]+]] 115*ac8a9f8fSKazu Hirata ret ptr %call.i.i, !dbg !21 116*ac8a9f8fSKazu Hirata} 117*ac8a9f8fSKazu Hirata 118*ac8a9f8fSKazu Hiratadefine dso_local ptr @_Z3bbbv() !dbg !22 { 119*ac8a9f8fSKazu Hirata; CHECK-LABEL: @_Z3bbbv() 120*ac8a9f8fSKazu Hirataentry: 121*ac8a9f8fSKazu Hirata %call.i.i = call ptr @_Znam(i64 4) #1, !dbg !23 122*ac8a9f8fSKazu Hirata; CHECK: call ptr @_Znam(i64 4) {{.*}}, !callsite ![[C4:[0-9]+]] 123*ac8a9f8fSKazu Hirata ret ptr %call.i.i, !dbg !26 124*ac8a9f8fSKazu Hirata} 125*ac8a9f8fSKazu Hirata 126*ac8a9f8fSKazu Hirataattributes #0 = { nobuiltin allocsize(0) } 127*ac8a9f8fSKazu Hirataattributes #1 = { builtin allocsize(0) } 128*ac8a9f8fSKazu Hirata 129*ac8a9f8fSKazu Hirata!llvm.dbg.cu = !{!0} 130*ac8a9f8fSKazu Hirata!llvm.module.flags = !{!2, !3} 131*ac8a9f8fSKazu Hirata 132*ac8a9f8fSKazu Hirata!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1) 133*ac8a9f8fSKazu Hirata!1 = !DIFile(filename: "undrift.cc", directory: "/") 134*ac8a9f8fSKazu Hirata!2 = !{i32 7, !"Dwarf Version", i32 5} 135*ac8a9f8fSKazu Hirata!3 = !{i32 2, !"Debug Info Version", i32 3} 136*ac8a9f8fSKazu Hirata!4 = !{} 137*ac8a9f8fSKazu Hirata!5 = distinct !DISubprogram(name: "foo", linkageName: "_Z3foov", scope: !1, file: !1, line: 56, type: !6, unit: !0) 138*ac8a9f8fSKazu Hirata!6 = !DISubroutineType(types: !7) 139*ac8a9f8fSKazu Hirata!7 = !{} 140*ac8a9f8fSKazu Hirata!8 = !DILocation(line: 56, column: 22, scope: !5) 141*ac8a9f8fSKazu Hirata!9 = !DILocation(line: 56, column: 15, scope: !5) 142*ac8a9f8fSKazu Hirata!10 = distinct !DISubprogram(name: "leaf", linkageName: "_Z4leafv", scope: !1, file: !1, line: 58, type: !6, unit: !0) 143*ac8a9f8fSKazu Hirata!11 = !DILocation(line: 58, column: 23, scope: !10) 144*ac8a9f8fSKazu Hirata!12 = !DILocation(line: 58, column: 16, scope: !10) 145*ac8a9f8fSKazu Hirata!13 = distinct !DISubprogram(name: "middle", linkageName: "_Z6middlev", scope: !1, file: !1, line: 59, type: !6, unit: !0) 146*ac8a9f8fSKazu Hirata!14 = !DILocation(line: 58, column: 23, scope: !10, inlinedAt: !15) 147*ac8a9f8fSKazu Hirata!15 = distinct !DILocation(line: 59, column: 25, scope: !13) 148*ac8a9f8fSKazu Hirata!16 = !DILocation(line: 59, column: 18, scope: !13) 149*ac8a9f8fSKazu Hirata!17 = distinct !DISubprogram(name: "aaa", linkageName: "_Z3aaav", scope: !1, file: !1, line: 61, type: !6, unit: !0) 150*ac8a9f8fSKazu Hirata!18 = !DILocation(line: 58, column: 23, scope: !10, inlinedAt: !19) 151*ac8a9f8fSKazu Hirata!19 = distinct !DILocation(line: 59, column: 25, scope: !13, inlinedAt: !20) 152*ac8a9f8fSKazu Hirata!20 = distinct !DILocation(line: 61, column: 22, scope: !17) 153*ac8a9f8fSKazu Hirata!21 = !DILocation(line: 61, column: 15, scope: !17) 154*ac8a9f8fSKazu Hirata!22 = distinct !DISubprogram(name: "bbb", linkageName: "_Z3bbbv", scope: !1, file: !1, line: 62, type: !6, unit: !0) 155*ac8a9f8fSKazu Hirata!23 = !DILocation(line: 58, column: 23, scope: !10, inlinedAt: !24) 156*ac8a9f8fSKazu Hirata!24 = distinct !DILocation(line: 59, column: 25, scope: !13, inlinedAt: !25) 157*ac8a9f8fSKazu Hirata!25 = distinct !DILocation(line: 62, column: 22, scope: !22) 158*ac8a9f8fSKazu Hirata!26 = !DILocation(line: 62, column: 15, scope: !22) 159*ac8a9f8fSKazu Hirata 160*ac8a9f8fSKazu Hirata; CHECK: attributes #[[ATTR]] = { builtin allocsize(0) "memprof"="cold" } 161*ac8a9f8fSKazu Hirata 162*ac8a9f8fSKazu Hirata; CHECK: ![[M1]] = !{![[M1L:[0-9]+]], ![[M1R:[0-9]+]]} 163*ac8a9f8fSKazu Hirata; CHECK: ![[M1L]] = !{![[M1LL:[0-9]+]], !"cold"} 164*ac8a9f8fSKazu Hirata; CHECK: ![[M1LL]] = !{i64 -7165227774426488445, i64 6179674587295384169, i64 7749555980993309703} 165*ac8a9f8fSKazu Hirata; CHECK: ![[M1R]] = !{![[M1RL:[0-9]+]], !"notcold"} 166*ac8a9f8fSKazu Hirata; CHECK: ![[M1RL]] = !{i64 -7165227774426488445, i64 6179674587295384169, i64 -4748707735015301746} 167*ac8a9f8fSKazu Hirata 168*ac8a9f8fSKazu Hirata; CHECK: ![[C1]] = !{i64 -7165227774426488445} 169*ac8a9f8fSKazu Hirata 170*ac8a9f8fSKazu Hirata; CHECK: ![[C2]] = !{i64 6179674587295384169} 171*ac8a9f8fSKazu Hirata 172*ac8a9f8fSKazu Hirata; CHECK: ![[C3]] = !{i64 -4748707735015301746} 173*ac8a9f8fSKazu Hirata 174*ac8a9f8fSKazu Hirata; CHECK: ![[C4]] = !{i64 7749555980993309703} 175