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