1*2a6b7991STeresa Johnson; Test to check the callgraph in summary when there is PGO
2*2a6b7991STeresa Johnson; RUN: opt -module-summary %s -o %t.o
3*2a6b7991STeresa Johnson; RUN: llvm-bcanalyzer -dump %t.o | FileCheck %s
4*2a6b7991STeresa Johnson; RUN: opt -module-summary %p/Inputs/thinlto-function-summary-callgraph-profile-summary.ll -o %t2.o
5*2a6b7991STeresa Johnson; RUN: llvm-lto -thinlto -o %t3 %t.o %t2.o
6*2a6b7991STeresa Johnson; RUN: llvm-bcanalyzer -dump %t3.thinlto.bc | FileCheck %s --check-prefix=COMBINED
7*2a6b7991STeresa Johnson
8*2a6b7991STeresa Johnson
9*2a6b7991STeresa Johnson; CHECK: <SOURCE_FILENAME
10*2a6b7991STeresa Johnson; "hot_function"
11*2a6b7991STeresa Johnson; CHECK-NEXT: <FUNCTION op0=0 op1=12
12*2a6b7991STeresa Johnson; "hot1"
13*2a6b7991STeresa Johnson; CHECK-NEXT: <FUNCTION op0=12 op1=4
14*2a6b7991STeresa Johnson; "hot2"
15*2a6b7991STeresa Johnson; CHECK-NEXT: <FUNCTION op0=16 op1=4
16*2a6b7991STeresa Johnson; "hot3"
17*2a6b7991STeresa Johnson; CHECK-NEXT: <FUNCTION op0=20 op1=4
18*2a6b7991STeresa Johnson; "hot4"
19*2a6b7991STeresa Johnson; CHECK-NEXT: <FUNCTION op0=24 op1=4
20*2a6b7991STeresa Johnson; "cold"
21*2a6b7991STeresa Johnson; CHECK-NEXT: <FUNCTION op0=28 op1=4
22*2a6b7991STeresa Johnson; "none1"
23*2a6b7991STeresa Johnson; CHECK-NEXT: <FUNCTION op0=32 op1=5
24*2a6b7991STeresa Johnson; "none2"
25*2a6b7991STeresa Johnson; CHECK-NEXT: <FUNCTION op0=37 op1=5
26*2a6b7991STeresa Johnson; "none3"
27*2a6b7991STeresa Johnson; CHECK-NEXT: <FUNCTION op0=42 op1=5
28*2a6b7991STeresa Johnson; CHECK-LABEL:       <GLOBALVAL_SUMMARY_BLOCK
29*2a6b7991STeresa Johnson; CHECK-NEXT:    <VERSION
30*2a6b7991STeresa Johnson; CHECK-NEXT:    <VALUE_GUID op0=25 op1=123/>
31*2a6b7991STeresa Johnson; op4=hot1 op6=cold op8=hot2 op10=hot4 op12=none1 op14=hot3 op16=none2 op18=none3 op20=123
32*2a6b7991STeresa Johnson; CHECK-NEXT:    <PERMODULE_PROFILE {{.*}} op4=1 op5=3 op6=5 op7=1 op8=2 op9=3 op10=4 op11=3 op12=6 op13=2 op14=3 op15=3 op16=7 op17=2 op18=8 op19=2 op20=25 op21=3/>
33*2a6b7991STeresa Johnson; CHECK-NEXT:  </GLOBALVAL_SUMMARY_BLOCK>
34*2a6b7991STeresa Johnson
35*2a6b7991STeresa Johnson; CHECK: <STRTAB_BLOCK
36*2a6b7991STeresa Johnson; CHECK-NEXT: blob data = 'hot_functionhot1hot2hot3hot4coldnone1none2none3'
37*2a6b7991STeresa Johnson
38*2a6b7991STeresa Johnson; COMBINED:       <GLOBALVAL_SUMMARY_BLOCK
39*2a6b7991STeresa Johnson; COMBINED-NEXT:    <VERSION
40*2a6b7991STeresa Johnson; COMBINED-NEXT:    <VALUE_GUID
41*2a6b7991STeresa Johnson; COMBINED-NEXT:    <VALUE_GUID
42*2a6b7991STeresa Johnson; COMBINED-NEXT:    <VALUE_GUID
43*2a6b7991STeresa Johnson; COMBINED-NEXT:    <VALUE_GUID
44*2a6b7991STeresa Johnson; COMBINED-NEXT:    <VALUE_GUID
45*2a6b7991STeresa Johnson; COMBINED-NEXT:    <VALUE_GUID
46*2a6b7991STeresa Johnson; COMBINED-NEXT:    <VALUE_GUID
47*2a6b7991STeresa Johnson; COMBINED-NEXT:    <VALUE_GUID
48*2a6b7991STeresa Johnson; COMBINED-NEXT:    <COMBINED abbrevid=
49*2a6b7991STeresa Johnson; COMBINED-NEXT:    <COMBINED abbrevid=
50*2a6b7991STeresa Johnson; COMBINED-NEXT:    <COMBINED abbrevid=
51*2a6b7991STeresa Johnson; COMBINED-NEXT:    <COMBINED abbrevid=
52*2a6b7991STeresa Johnson; COMBINED-NEXT:    <COMBINED abbrevid=
53*2a6b7991STeresa Johnson; COMBINED-NEXT:    <COMBINED abbrevid=
54*2a6b7991STeresa Johnson; COMBINED-NEXT:    <COMBINED_PROFILE {{.*}} op5=[[HOT1:.*]] op6=3 op7=[[COLD:.*]] op8=1 op9=[[HOT2:.*]] op10=3 op11=[[NONE1:.*]] op12=2 op13=[[HOT3:.*]] op14=3 op15=[[NONE2:.*]] op16=2 op17=[[NONE3:.*]] op18=2/>
55*2a6b7991STeresa Johnson; COMBINED_NEXT:    <COMBINED abbrevid=
56*2a6b7991STeresa Johnson; COMBINED_NEXT:  </GLOBALVAL_SUMMARY_BLOCK>
57*2a6b7991STeresa Johnson
58*2a6b7991STeresa Johnson
59*2a6b7991STeresa Johnson; ModuleID = 'thinlto-function-summary-callgraph.ll'
60*2a6b7991STeresa Johnsontarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
61*2a6b7991STeresa Johnsontarget triple = "x86_64-unknown-linux-gnu"
62*2a6b7991STeresa Johnson
63*2a6b7991STeresa Johnson; This function have high profile count, so entry block is hot.
64*2a6b7991STeresa Johnsondefine void @hot_function(i1 %a, i1 %a2) !prof !20 {
65*2a6b7991STeresa Johnsonentry:
66*2a6b7991STeresa Johnson    call void @hot1()
67*2a6b7991STeresa Johnson    br i1 %a, label %Cold, label %Hot, !prof !41
68*2a6b7991STeresa JohnsonCold:           ; 1/1000 goes here
69*2a6b7991STeresa Johnson  call void @cold()
70*2a6b7991STeresa Johnson  call void @hot2()
71*2a6b7991STeresa Johnson  call void @hot4(), !prof !15
72*2a6b7991STeresa Johnson  call void @none1()
73*2a6b7991STeresa Johnson  br label %exit
74*2a6b7991STeresa JohnsonHot:            ; 999/1000 goes here
75*2a6b7991STeresa Johnson  call void @hot2()
76*2a6b7991STeresa Johnson  call void @hot3()
77*2a6b7991STeresa Johnson  br i1 %a2, label %None1, label %None2, !prof !42
78*2a6b7991STeresa JohnsonNone1:          ; half goes here
79*2a6b7991STeresa Johnson  call void @none1()
80*2a6b7991STeresa Johnson  call void @none2()
81*2a6b7991STeresa Johnson  br label %exit
82*2a6b7991STeresa JohnsonNone2:          ; half goes here
83*2a6b7991STeresa Johnson  call void @none3()
84*2a6b7991STeresa Johnson  br label %exit
85*2a6b7991STeresa Johnsonexit:
86*2a6b7991STeresa Johnson  ret void
87*2a6b7991STeresa Johnson}
88*2a6b7991STeresa Johnson
89*2a6b7991STeresa Johnsondeclare void @hot1() #1
90*2a6b7991STeresa Johnsondeclare void @hot2() #1
91*2a6b7991STeresa Johnsondeclare void @hot3() #1
92*2a6b7991STeresa Johnsondeclare void @hot4() #1
93*2a6b7991STeresa Johnsondeclare void @cold() #1
94*2a6b7991STeresa Johnsondeclare void @none1() #1
95*2a6b7991STeresa Johnsondeclare void @none2() #1
96*2a6b7991STeresa Johnsondeclare void @none3() #1
97*2a6b7991STeresa Johnson
98*2a6b7991STeresa Johnson
99*2a6b7991STeresa Johnson!41 = !{!"branch_weights", i32 1, i32 1000}
100*2a6b7991STeresa Johnson!42 = !{!"branch_weights", i32 1, i32 1}
101*2a6b7991STeresa Johnson
102*2a6b7991STeresa Johnson
103*2a6b7991STeresa Johnson
104*2a6b7991STeresa Johnson!llvm.module.flags = !{!1}
105*2a6b7991STeresa Johnson!20 = !{!"function_entry_count", i64 110, i64 123}
106*2a6b7991STeresa Johnson
107*2a6b7991STeresa Johnson!1 = !{i32 1, !"ProfileSummary", !2}
108*2a6b7991STeresa Johnson!2 = !{!3, !4, !5, !6, !7, !8, !9, !10}
109*2a6b7991STeresa Johnson!3 = !{!"ProfileFormat", !"SampleProfile"}
110*2a6b7991STeresa Johnson!4 = !{!"TotalCount", i64 10000}
111*2a6b7991STeresa Johnson!5 = !{!"MaxCount", i64 10}
112*2a6b7991STeresa Johnson!6 = !{!"MaxInternalCount", i64 1}
113*2a6b7991STeresa Johnson!7 = !{!"MaxFunctionCount", i64 1000}
114*2a6b7991STeresa Johnson!8 = !{!"NumCounts", i64 3}
115*2a6b7991STeresa Johnson!9 = !{!"NumFunctions", i64 3}
116*2a6b7991STeresa Johnson!10 = !{!"DetailedSummary", !11}
117*2a6b7991STeresa Johnson!11 = !{!12, !13, !14}
118*2a6b7991STeresa Johnson!12 = !{i32 10000, i64 100, i32 1}
119*2a6b7991STeresa Johnson!13 = !{i32 999000, i64 100, i32 1}
120*2a6b7991STeresa Johnson!14 = !{i32 999999, i64 1, i32 2}
121*2a6b7991STeresa Johnson!15 = !{!"branch_weights", i32 100}
122