1 ;; Tests optional matching of memprof profile on call to operator new
2 ;; with manual hot/cold hint.
4 ;; Avoid failures on big-endian systems that can't read the profile properly
5 ; REQUIRES: x86_64-linux
7 ;; TODO: Use text profile inputs once that is available for memprof.
8 ;; This test uses the same raw profile used for memprof.ll, see instructions
9 ;; in that file for updating.
11 ;; Generate indexed profile
12 ; RUN: llvm-profdata merge %S/Inputs/memprof.memprofraw --profiled-binary %S/Inputs/memprof.exe -o %t.memprofdata
14 ;; By default we should not match profile on to manually hinted operator
15 ;; new calls, because we don't currently override the manual hints anyway.
16 ; RUN: opt < %s -passes='memprof-use<profile-filename=%t.memprofdata>' -S 2>&1 | FileCheck %s --implicit-check-not !memprof --implicit-check-not !callsite
18 ;; Check that we match profiles onto these manually hinted new calls
19 ;; under the -memprof-match-hot-cold-new=true option.
20 ; RUN: opt < %s -passes='memprof-use<profile-filename=%t.memprofdata>' -S -memprof-match-hot-cold-new=true 2>&1 | FileCheck %s --check-prefixes=MEMPROF
22 ; ModuleID = 'memprof_match_hot_cold_new_calls.cc'
23 source_filename = "memprof_match_hot_cold_new_calls.cc"
24 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
25 target triple = "x86_64-unknown-linux-gnu"
27 %"struct.std::nothrow_t" = type { i8 }
29 @_ZSt7nothrow = external global %"struct.std::nothrow_t", align 1
31 define dso_local noundef ptr @_Z3foov() !dbg !10 {
33 ; MEMPROF: call {{.*}} @_Znwm{{.*}} !memprof ![[M1:[0-9]+]], !callsite ![[C1:[0-9]+]]
34 %call = call noalias noundef align 32 ptr @_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t(i64 noundef 32, i64 noundef 32, ptr noundef nonnull align 1 dereferenceable(1) @_ZSt7nothrow, i8 noundef zeroext 0), !dbg !13
38 declare noundef ptr @_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t(i64 noundef, i64 noundef, ptr noundef nonnull align 1 dereferenceable(1), i8 noundef zeroext)
40 ; MEMPROF: ![[M1]] = !{![[MIB1:[0-9]+]], ![[MIB2:[0-9]+]], ![[MIB3:[0-9]+]], ![[MIB4:[0-9]+]], ![[MIB5:[0-9]+]]}
41 ; MEMPROF: ![[MIB1]] = !{![[STACK1:[0-9]+]], !"cold"}
42 ; MEMPROF: ![[STACK1]] = !{i64 2732490490862098848, i64 748269490701775343}
43 ; MEMPROF: ![[MIB2]] = !{![[STACK2:[0-9]+]], !"cold"}
44 ; MEMPROF: ![[STACK2]] = !{i64 2732490490862098848, i64 2104812325165620841, i64 6281715513834610934, i64 6281715513834610934, i64 6281715513834610934, i64 1544787832369987002}
45 ; MEMPROF: ![[MIB3]] = !{![[STACK3:[0-9]+]], !"notcold"}
46 ; MEMPROF: ![[STACK3]] = !{i64 2732490490862098848, i64 2104812325165620841, i64 6281715513834610934, i64 6281715513834610934, i64 6281715513834610934, i64 6281715513834610934}
47 ; MEMPROF: ![[MIB4]] = !{![[STACK4:[0-9]+]], !"cold"}
48 ; MEMPROF: ![[STACK4]] = !{i64 2732490490862098848, i64 8467819354083268568}
49 ; MEMPROF: ![[MIB5]] = !{![[STACK5:[0-9]+]], !"notcold"}
50 ; MEMPROF: ![[STACK5]] = !{i64 2732490490862098848, i64 8690657650969109624}
51 ; MEMPROF: ![[C1]] = !{i64 2732490490862098848}
54 !llvm.module.flags = !{!2, !3}
56 !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)
57 !1 = !DIFile(filename: "memprof.cc", directory: "/usr/local/google/home/tejohnson/llvm/tmp", checksumkind: CSK_MD5, checksum: "e8c40ebe4b21776b4d60e9632cbc13c2")
58 !2 = !{i32 7, !"Dwarf Version", i32 5}
59 !3 = !{i32 2, !"Debug Info Version", i32 3}
60 !10 = distinct !DISubprogram(name: "foo", linkageName: "_Z3foov", scope: !1, file: !1, line: 4, type: !11, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !12)
61 !11 = !DISubroutineType(types: !12)
63 !13 = !DILocation(line: 5, column: 10, scope: !10)