
Reverts llvm/llvm-project#142718 Breaks ppc aix builds: https://lab.llvm.org/buildbot/#/builders/64/builds/4036
164 lines
8.5 KiB
LLVM
164 lines
8.5 KiB
LLVM
;; 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)
|