File: memprof_discard_threshold.ll

package info (click to toggle)
llvm-toolchain-21 1%3A21.1.6-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,245,028 kB
  • sloc: cpp: 7,619,726; ansic: 1,434,018; asm: 1,058,748; python: 252,740; f90: 94,671; objc: 70,685; lisp: 42,813; pascal: 18,401; sh: 8,601; ml: 5,111; perl: 4,720; makefile: 3,675; awk: 3,523; javascript: 2,409; xml: 892; fortran: 770
file content (163 lines) | stat: -rw-r--r-- 8,723 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
;; Tests option to discard small noncold contexts.

;; Avoid failures on big-endian systems that can't read the profile properly
; REQUIRES: x86_64-linux

;; Generate the profile and the IR.
; RUN: split-file %s %t

;; Generate indexed profile
; RUN: llvm-profdata merge %t/memprof_discard_threshold.yaml -o %t.memprofdata

;; Test default (threshold 100%). We should get the same results with and
;; without -memprof-keep-all-not-cold-contexts.

; RUN: opt < %t/memprof_discard_threshold.ll -passes='memprof-use<profile-filename=%t.memprofdata>' -S 2>&1 | FileCheck %s --check-prefixes=CALL,MEMPROF

;; Test discarding (threshold 80%). We should get the same results with and
;; without -memprof-keep-all-not-cold-contexts.

; RUN: opt < %t/memprof_discard_threshold.ll -passes='memprof-use<profile-filename=%t.memprofdata>' -S -memprof-report-hinted-sizes -memprof-keep-all-not-cold-contexts 2>&1 | FileCheck %s --check-prefixes=CALL,MEMPROF,REPORT

; RUN: opt < %t/memprof_discard_threshold.ll -passes='memprof-use<profile-filename=%t.memprofdata>' -memprof-callsite-cold-threshold=80 -S 2>&1 | FileCheck %s --check-prefixes=CALL,MEMPROF80

; RUN: opt < %t/memprof_discard_threshold.ll -passes='memprof-use<profile-filename=%t.memprofdata>' -S -memprof-callsite-cold-threshold=80 -memprof-report-hinted-sizes -memprof-keep-all-not-cold-contexts 2>&1 | FileCheck %s --check-prefixes=CALL,MEMPROF80,REPORT80

;; One context should have been discarded, with exactly 80-20 behavior.
; REPORT80: MemProf hinting: Total size for discarded non-cold full allocation context hash 7175328747938231822 for 80.00% cold bytes: 20

;--- memprof_discard_threshold.yaml
---
HeapProfileRecords:
  - GUID:            A
    AllocSites:
      - Callstack:
          - { Function: A, LineOffset: 1, Column: 10, IsInlineFrame: false }
          - { Function: B, LineOffset: 6, Column: 13, IsInlineFrame: false }
          - { Function: C, LineOffset: 7, Column: 11, IsInlineFrame: false }
	# Cold
        MemInfoBlock:
          AllocCount:      1
          TotalSize:       100
          TotalLifetime:   200000
          TotalLifetimeAccessDensity: 0
      - Callstack:
          - { Function: A, LineOffset: 1, Column: 10, IsInlineFrame: false }
          - { Function: B, LineOffset: 6, Column: 13, IsInlineFrame: false }
          - { Function: D, LineOffset: 8, Column: 20, IsInlineFrame: false }
	# Not cold
	# While this one is pruned without -memprof-keep-all-not-cold-contexts,
	# if we don't track the aggregate total/cold bytes correctly for
	# discarded contexts we might think that at callsite B we are more than
	# 80% cold and discard all the non-cold contexts.
        MemInfoBlock:
          AllocCount:      1
          TotalSize:       500
          TotalLifetime:   0
          TotalLifetimeAccessDensity: 20000
      - Callstack:
          - { Function: A, LineOffset: 1, Column: 10, IsInlineFrame: false }
          - { Function: B, LineOffset: 6, Column: 13, IsInlineFrame: false }
          - { Function: E, LineOffset: 5, Column: 4, IsInlineFrame: false }
          - { Function: F, LineOffset: 4, Column: 5, IsInlineFrame: false }
	# Not cold
        MemInfoBlock:
          AllocCount:      1
          TotalSize:       30
          TotalLifetime:   0
          TotalLifetimeAccessDensity: 20000
      - Callstack:
          - { Function: A, LineOffset: 1, Column: 10, IsInlineFrame: false }
          - { Function: B, LineOffset: 6, Column: 13, IsInlineFrame: false }
          - { Function: E, LineOffset: 5, Column: 4, IsInlineFrame: false }
          - { Function: G, LineOffset: 3, Column: 7, IsInlineFrame: false }
          - { Function: H, LineOffset: 2, Column: 15, IsInlineFrame: false }
	# Cold
        MemInfoBlock:
          AllocCount:      1
          TotalSize:       80
          TotalLifetime:   200000
          TotalLifetimeAccessDensity: 0
      - Callstack:
          - { Function: A, LineOffset: 1, Column: 10, IsInlineFrame: false }
          - { Function: B, LineOffset: 6, Column: 13, IsInlineFrame: false }
          - { Function: E, LineOffset: 5, Column: 4, IsInlineFrame: false }
          - { Function: G, LineOffset: 3, Column: 7, IsInlineFrame: false }
          - { Function: I, LineOffset: 7, Column: 16, IsInlineFrame: false }
	# Not cold
        MemInfoBlock:
          AllocCount:      1
          TotalSize:       20
          TotalLifetime:   0
          TotalLifetimeAccessDensity: 20000
    CallSites:       []

;--- memprof_discard_threshold.ll
; ModuleID = 'memprof_discard_threshold.cc'
source_filename = "memprof_discard_threshold.cc"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

define dso_local noundef ptr @A() !dbg !10 {
entry:
  ; CALL: call {{.*}} @_Znam{{.*}} !memprof ![[M1:[0-9]+]], !callsite ![[C1:[0-9]+]]
  %call = call noalias noundef nonnull ptr @_Znam(i64 noundef 32), !dbg !13
  ret ptr %call
}

declare noundef nonnull ptr @_Znam(i64 noundef)

; MEMPROF: ![[M1]] = !{![[MIB1:[0-9]+]],
; REPORT-SAME: ![[MIB2:[0-9]+]],
; MEMPROF-SAME: ![[MIB3:[0-9]+]], ![[MIB4:[0-9]+]]
; REPORT-SAME:	, ![[MIB5:[0-9]+]]}
; MEMPROF: ![[MIB1]] = !{![[STACK1:[0-9]+]], !"cold"
; REPORT-SAME:  , ![[SIZE1:[0-9]+]]}
; MEMPROF: ![[STACK1]] = !{i64 -2647357475745718070, i64 869302454322824036, i64 705268496523263927}
; REPORT: ![[SIZE1]] = !{i64 -7154823362113119138, i64 100}
; REPORT: ![[MIB2]] = !{![[STACK2:[0-9]+]], !"notcold", ![[SIZE2:[0-9]+]]}
; REPORT: ![[STACK2]] = !{i64 -2647357475745718070, i64 869302454322824036, i64 -6015552466537626283, i64 7621414677325196405}
; REPORT: ![[SIZE2]] = !{i64 4574148894276641937, i64 30}
; MEMPROF: ![[MIB3]] = !{![[STACK3:[0-9]+]], !"cold"
; REPORT-SAME: , ![[SIZE3:[0-9]+]]}
; MEMPROF: ![[STACK3]] = !{i64 -2647357475745718070, i64 869302454322824036, i64 -6015552466537626283, i64 -2897722569788633560, i64 3206456850862191843}
; REPORT: ![[SIZE3]] = !{i64 2848517899452258040, i64 80}
; MEMPROF: ![[MIB4]] = !{![[STACK4:[0-9]+]], !"notcold"
; REPORT-SAME: , ![[SIZE4:[0-9]+]]}
; MEMPROF: ![[STACK4]] = !{i64 -2647357475745718070, i64 869302454322824036, i64 -6015552466537626283, i64 -2897722569788633560, i64 -1037739922429764316}
; REPORT: ![[SIZE4]] = !{i64 7175328747938231822, i64 20}
; REPORT: ![[MIB5]] = !{![[STACK5:[0-9]+]], !"notcold", ![[SIZE5:[0-9]+]]}
; REPORT: ![[STACK5]] = !{i64 -2647357475745718070, i64 869302454322824036, i64 -3111772584478263690}
; REPORT: ![[SIZE5]] = !{i64 8469515017747579284, i64 500}
; MEMPROF: ![[C1]] = !{i64 -2647357475745718070}

; MEMPROF80: ![[M1]] = !{![[MIB1:[0-9]+]], ![[MIB2:[0-9]+]], ![[MIB3:[0-9]+]]
; REPORT80-SAME:	, ![[MIB5:[0-9]+]]}
; MEMPROF80: ![[MIB1]] = !{![[STACK1:[0-9]+]], !"cold"
; REPORT80-SAME:  , ![[SIZE1:[0-9]+]]}
; MEMPROF80: ![[STACK1]] = !{i64 -2647357475745718070, i64 869302454322824036, i64 705268496523263927}
; REPORT80: ![[SIZE1]] = !{i64 -7154823362113119138, i64 100}
; MEMPROF80: ![[MIB2]] = !{![[STACK2:[0-9]+]], !"notcold"
; REPORT80-SAME: , ![[SIZE2:[0-9]+]]}
; MEMPROF80: ![[STACK2]] = !{i64 -2647357475745718070, i64 869302454322824036, i64 -6015552466537626283, i64 7621414677325196405}
; REPORT80: ![[SIZE2]] = !{i64 4574148894276641937, i64 30}
; MEMPROF80: ![[MIB3]] = !{![[STACK3:[0-9]+]], !"cold"
; REPORT80-SAME: , ![[SIZE3:[0-9]+]]}
; MEMPROF80: ![[STACK3]] = !{i64 -2647357475745718070, i64 869302454322824036, i64 -6015552466537626283, i64 -2897722569788633560, i64 3206456850862191843}
; REPORT80: ![[SIZE3]] = !{i64 2848517899452258040, i64 80}
; REPORT80: ![[MIB5]] = !{![[STACK5:[0-9]+]], !"notcold", ![[SIZE5:[0-9]+]]}
; REPORT80: ![[STACK5]] = !{i64 -2647357475745718070, i64 869302454322824036, i64 -3111772584478263690}
; REPORT80: ![[SIZE5]] = !{i64 8469515017747579284, i64 500}
; MEMPROF80: ![[C1]] = !{i64 -2647357475745718070}

!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!2, !3}

!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 15.0.0 (https://github.com/llvm/llvm-project.git 6cbe6284d1f0a088b5c6482ae27b738f03d82fe7)", isOptimized: false, runtimeVersion: 0, emissionKind: LineTablesOnly, splitDebugInlining: false, debugInfoForProfiling: true, nameTableKind: None)
!1 = !DIFile(filename: "memprof.cc", directory: ".", checksumkind: CSK_MD5, checksum: "e8c40ebe4b21776b4d60e9632cbc13c2")
!2 = !{i32 7, !"Dwarf Version", i32 5}
!3 = !{i32 2, !"Debug Info Version", i32 3}
!10 = distinct !DISubprogram(name: "A", linkageName: "A", scope: !1, file: !1, line: 4, type: !11, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !12)
!11 = !DISubroutineType(types: !12)
!12 = !{}
!13 = !DILocation(line: 5, column: 10, scope: !10)