1*408bb9a3SMingming Liu; Tests that hot callsite threshold is set to 0 artifically for thinlto-prelink pipeline.
2*408bb9a3SMingming Liu;
3*408bb9a3SMingming Liu; Function `sum` is annotated with inline cost -1 and function `sum1` is
4*408bb9a3SMingming Liu; annotated with inline cost 0, by function attribute `function-inline-cost`.
5*408bb9a3SMingming Liu;
6*408bb9a3SMingming Liu; `if.then` basic block is hot so the callsite threshold is set to 0.
7*408bb9a3SMingming Liu; `while.body.split` basic block is cold so threshold is calculated using
8*408bb9a3SMingming Liu; the rest of default heuristics, which should be sufficient to inline a
9*408bb9a3SMingming Liu; function with 0 cost.
10*408bb9a3SMingming Liu
11*408bb9a3SMingming Liu; RUN: opt < %s -pass-remarks=inline -pass-remarks-missed=inline -passes='thinlto-pre-link<O2>' -pgo-kind=pgo-sample-use-pipeline -sample-profile-file=%S/Inputs/new-pm-thinlto-prelink-samplepgo-inline-threshold.prof -S | FileCheck %s
12*408bb9a3SMingming Liu
13*408bb9a3SMingming Liu; RUN: opt < %s -pass-remarks=inline -pass-remarks-missed=inline -passes='thinlto-pre-link<O2>' -pgo-kind=pgo-sample-use-pipeline -sample-profile-file=%S/Inputs/new-pm-thinlto-prelink-samplepgo-inline-threshold.prof -S 2>&1 | FileCheck %s -check-prefix=REMARK
14*408bb9a3SMingming Liu
15*408bb9a3SMingming Liu; Original C++ test case
16*408bb9a3SMingming Liu;
17*408bb9a3SMingming Liu; #include <stdio.h>
18*408bb9a3SMingming Liu
19*408bb9a3SMingming Liu; int sum(int x, int y) { return x + y; }
20*408bb9a3SMingming Liu
21*408bb9a3SMingming Liu; int sum1(int x, int y) { return x + y; }
22*408bb9a3SMingming Liu
23*408bb9a3SMingming Liu; int main() {
24*408bb9a3SMingming Liu;   int s, i = 0;
25*408bb9a3SMingming Liu;   while (i++ < 20000 * 20000) {
26*408bb9a3SMingming Liu;     if (i != 100) s = sum(i, s);
27*408bb9a3SMingming Liu;     s = sum1(i, s);
28*408bb9a3SMingming Liu;   }
29*408bb9a3SMingming Liu;   printf("sum is %d\n", s);
30*408bb9a3SMingming Liu;   return 0;
31*408bb9a3SMingming Liu; }
32*408bb9a3SMingming Liu;
33*408bb9a3SMingming Liu
34*408bb9a3SMingming Liu; REMARK: test.cc:14:9: '_Z4sum1ii' inlined into 'main' with (cost=0, threshold=45) at callsite main:4:9;
35*408bb9a3SMingming Liu; REMARK: test.cc:13:23: '_Z3sumii' inlined into 'main' with (cost=-1, threshold=0) at callsite main:3:23.2;
36*408bb9a3SMingming Liu; REMARK: test.cc:14:9: '_Z4sum1ii' not inlined into 'main' because too costly to inline (cost=0, threshold=0)
37*408bb9a3SMingming Liu
38*408bb9a3SMingming Liu; ModuleID = 'test.cc'
39*408bb9a3SMingming Liusource_filename = "test.cc"
40*408bb9a3SMingming Liutarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
41*408bb9a3SMingming Liutarget triple = "x86_64-unknown-linux-gnu"
42*408bb9a3SMingming Liu
43*408bb9a3SMingming Liu@.str = constant [11 x i8] c"sum is %d\0A\00", align 1
44*408bb9a3SMingming Liu
45*408bb9a3SMingming Liudefine i32 @_Z3sumii(i32 %x, i32 %y) "function-inline-cost"="-1" #0 !dbg !7 {
46*408bb9a3SMingming Liuentry:
47*408bb9a3SMingming Liu  %add = add nsw i32 %y, %x, !dbg !10
48*408bb9a3SMingming Liu  ret i32 %add, !dbg !11
49*408bb9a3SMingming Liu}
50*408bb9a3SMingming Liu
51*408bb9a3SMingming Liudefine i32 @_Z4sum1ii(i32 %x, i32 %y) "function-inline-cost"="0" #0 !dbg !12 {
52*408bb9a3SMingming Liuentry:
53*408bb9a3SMingming Liu  %add = add nsw i32 %y, %x, !dbg !13
54*408bb9a3SMingming Liu  ret i32 %add, !dbg !14
55*408bb9a3SMingming Liu}
56*408bb9a3SMingming Liu
57*408bb9a3SMingming Liudefine i32 @main() #0 !dbg !15 {
58*408bb9a3SMingming Liuentry:
59*408bb9a3SMingming Liu  br label %while.body, !dbg !16
60*408bb9a3SMingming Liu
61*408bb9a3SMingming Liuwhile.body:                                       ; preds = %entry, %if.end
62*408bb9a3SMingming Liu  %inc14 = phi i32 [ 1, %entry ], [ %inc, %if.end ]
63*408bb9a3SMingming Liu  %s.013 = phi i32 [ undef, %entry ], [ %phi.call, %if.end ]
64*408bb9a3SMingming Liu  %cmp1.not = icmp eq i32 %inc14, 100, !dbg !17
65*408bb9a3SMingming Liu  br i1 %cmp1.not, label %while.body.split, label %if.then, !dbg !18
66*408bb9a3SMingming Liu
67*408bb9a3SMingming Liuwhile.body.split:                                 ; preds = %while.body
68*408bb9a3SMingming Liu; CHECK-NOT: call noundef i32 @_Z4sum1ii
69*408bb9a3SMingming Liu  %call211 = call noundef i32 @_Z4sum1ii(i32 100, i32 %s.013), !dbg !19
70*408bb9a3SMingming Liu  br label %if.end, !dbg !18
71*408bb9a3SMingming Liu
72*408bb9a3SMingming Liuif.then:                                          ; preds = %while.body
73*408bb9a3SMingming Liu; CHECK-NOT: call i32 @_Z3sumii
74*408bb9a3SMingming Liu; CHECK: call i32 @_Z4sum1ii
75*408bb9a3SMingming Liu  %call = call i32 @_Z3sumii(i32 %inc14, i32 %s.013), !dbg !20
76*408bb9a3SMingming Liu  %call212 = call i32 @_Z4sum1ii(i32 %inc14, i32 %call), !dbg !19
77*408bb9a3SMingming Liu  br label %if.end, !dbg !21
78*408bb9a3SMingming Liu
79*408bb9a3SMingming Liuif.end:                                           ; preds = %while.body.split, %if.then
80*408bb9a3SMingming Liu  %phi.call = phi i32 [ %call211, %while.body.split ], [ %call212, %if.then ], !dbg !19
81*408bb9a3SMingming Liu  %inc = add i32 %inc14, 1, !dbg !22
82*408bb9a3SMingming Liu  %exitcond.not = icmp eq i32 %inc, 400000001, !dbg !23
83*408bb9a3SMingming Liu  br i1 %exitcond.not, label %while.end, label %while.body, !dbg !16, !llvm.loop !24
84*408bb9a3SMingming Liu
85*408bb9a3SMingming Liuwhile.end:                                        ; preds = %if.end
86*408bb9a3SMingming Liu  %call3 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i64 0, i64 0), i32 %phi.call), !dbg !27
87*408bb9a3SMingming Liu  ret i32 0, !dbg !28
88*408bb9a3SMingming Liu}
89*408bb9a3SMingming Liu
90*408bb9a3SMingming Liudeclare i32 @printf(i8* nocapture noundef readonly, ...)
91*408bb9a3SMingming Liu
92*408bb9a3SMingming Liuattributes #0 = {"use-sample-profile"}
93*408bb9a3SMingming Liu
94*408bb9a3SMingming Liu!llvm.dbg.cu = !{!0}
95*408bb9a3SMingming Liu!llvm.module.flags = !{!2, !3}
96*408bb9a3SMingming Liu
97*408bb9a3SMingming Liu!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 14.0.0 (https://github.com/llvm/llvm-project.git 329fda39c507e8740978d10458451dcdb21563be)", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, splitDebugInlining: false, nameTableKind: None)
98*408bb9a3SMingming Liu!1 = !DIFile(filename: "test.cc", directory: "", checksumkind: CSK_MD5, checksum: "e8c44edbdcc2c41f9f891ac2b2ddd591")
99*408bb9a3SMingming Liu!2 = !{i32 7, !"Dwarf Version", i32 5}
100*408bb9a3SMingming Liu!3 = !{i32 2, !"Debug Info Version", i32 3}
101*408bb9a3SMingming Liu!7 = distinct !DISubprogram(name: "sum", scope: !1, file: !1, line: 6, type: !8, scopeLine: 6, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !9)
102*408bb9a3SMingming Liu!8 = !DISubroutineType(types: !9)
103*408bb9a3SMingming Liu!9 = !{}
104*408bb9a3SMingming Liu!10 = !DILocation(line: 6, column: 60, scope: !7)
105*408bb9a3SMingming Liu!11 = !DILocation(line: 6, column: 51, scope: !7)
106*408bb9a3SMingming Liu!12 = distinct !DISubprogram(name: "sum1", scope: !1, file: !1, line: 8, type: !8, scopeLine: 8, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !9)
107*408bb9a3SMingming Liu!13 = !DILocation(line: 8, column: 61, scope: !12)
108*408bb9a3SMingming Liu!14 = !DILocation(line: 8, column: 52, scope: !12)
109*408bb9a3SMingming Liu!15 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 10, type: !8, scopeLine: 10, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !9)
110*408bb9a3SMingming Liu!16 = !DILocation(line: 12, column: 3, scope: !15)
111*408bb9a3SMingming Liu!17 = !DILocation(line: 13, column: 11, scope: !15)
112*408bb9a3SMingming Liu!18 = !DILocation(line: 13, column: 9, scope: !15)
113*408bb9a3SMingming Liu!19 = !DILocation(line: 14, column: 9, scope: !15)
114*408bb9a3SMingming Liu!20 = !DILocation(line: 13, column: 23, scope: !15)
115*408bb9a3SMingming Liu!21 = !DILocation(line: 13, column: 19, scope: !15)
116*408bb9a3SMingming Liu!22 = !DILocation(line: 12, column: 11, scope: !15)
117*408bb9a3SMingming Liu!23 = !DILocation(line: 12, column: 14, scope: !15)
118*408bb9a3SMingming Liu!24 = distinct !{!24, !16, !25, !26}
119*408bb9a3SMingming Liu!25 = !DILocation(line: 15, column: 3, scope: !15)
120*408bb9a3SMingming Liu!26 = !{!"llvm.loop.mustprogress"}
121*408bb9a3SMingming Liu!27 = !DILocation(line: 16, column: 3, scope: !15)
122*408bb9a3SMingming Liu!28 = !DILocation(line: 17, column: 3, scope: !15)
123