1;; Test to check the callgraph in summary when partial sample profile scaling 2;; enabled. 3; RUN: opt -module-summary %s -o %t.o -scale-partial-sample-profile-working-set-size 4; RUN: llvm-bcanalyzer -dump %t.o | FileCheck %s --check-prefix=PERMODULE 5; RUN: opt -module-summary %p/Inputs/thinlto-function-summary-callgraph-partial-sample-profile-summary.ll -o %t2.o -scale-partial-sample-profile-working-set-size 6; RUN: llvm-lto -thinlto -o %t3 %t.o %t2.o 7; RUN: llvm-bcanalyzer -dump %t3.thinlto.bc | FileCheck %s --check-prefix=COMBINED 8 9;; Check that we don't get block count records when it isn't explicitly enabled. 10; RUN: opt -module-summary %s -o %t.o 11; RUN: llvm-bcanalyzer -dump %t.o | FileCheck %s --implicit-check-not=BLOCK_COUNT 12; RUN: opt -module-summary %p/Inputs/thinlto-function-summary-callgraph-partial-sample-profile-summary.ll -o %t2.o 13; RUN: llvm-lto -thinlto -o %t3 %t.o %t2.o 14; RUN: llvm-bcanalyzer -dump %t3.thinlto.bc | FileCheck %s --implicit-check-not=BLOCK_COUNT 15 16; PERMODULE: <SOURCE_FILENAME 17; "hot_function" 18; PERMODULE-NEXT: <FUNCTION op0=0 op1=12 19; "hot1" 20; PERMODULE-NEXT: <FUNCTION op0=12 op1=4 21; "hot2" 22; PERMODULE-NEXT: <FUNCTION op0=16 op1=4 23; "hot3" 24; PERMODULE-NEXT: <FUNCTION op0=20 op1=4 25; "hot4" 26; PERMODULE-NEXT: <FUNCTION op0=24 op1=5 27; "cold" 28; PERMODULE-NEXT: <FUNCTION op0=29 op1=5 29; "none1" 30; PERMODULE-NEXT: <FUNCTION op0=34 op1=5 31; "none2" 32; PERMODULE-NEXT: <FUNCTION op0=39 op1=5 33; "none3" 34; PERMODULE-NEXT: <FUNCTION op0=44 op1=5 35; PERMODULE-NEXT: <FUNCTION op0=49 op1=5 36 37; PERMODULE-LABEL: <GLOBALVAL_SUMMARY_BLOCK 38; PERMODULE-NEXT: <VERSION 39; PERMODULE-NEXT: <FLAGS 40; PERMODULE-NEXT: <VALUE_GUID op0=27 op1=123/> 41; op4=none1 op6=hot1 op8=cold1 op10=none2 op12=hot2 op14=cold2 op16=none3 op18=hot3 op20=cold3 op22=123 42; PERMODULE-NEXT: <PERMODULE_PROFILE {{.*}} op7=7 op8=0 op9=1 op10=3 op11=4 op12=1 op13=8 op14=0 op15=2 op16=3 op17=5 op18=1 op19=9 op20=0 op21=3 op22=3 op23=6 op24=1 op25=27 op26=4/> 43; PERMODULE-NEXT: <BLOCK_COUNT op0=4/> 44; PERMODULE-NEXT: </GLOBALVAL_SUMMARY_BLOCK> 45 46; PERMODULE: <STRTAB_BLOCK 47; PERMODULE-NEXT: blob data = 'hot_functionhot1hot2hot3cold1cold2cold3none1none2none3{{.*}}' 48 49; COMBINED: <GLOBALVAL_SUMMARY_BLOCK 50; COMBINED-NEXT: <VERSION 51; COMBINED-NEXT: <FLAGS 52; COMBINED-NEXT: <VALUE_GUID 53; COMBINED-NEXT: <VALUE_GUID 54; COMBINED-NEXT: <VALUE_GUID 55; COMBINED-NEXT: <VALUE_GUID 56; COMBINED-NEXT: <VALUE_GUID 57; COMBINED-NEXT: <VALUE_GUID 58; COMBINED-NEXT: <VALUE_GUID 59; COMBINED-NEXT: <VALUE_GUID 60; COMBINED-NEXT: <VALUE_GUID 61; COMBINED-NEXT: <VALUE_GUID 62; COMBINED-NEXT: <COMBINED abbrevid= 63; COMBINED-NEXT: <COMBINED abbrevid= 64; COMBINED-NEXT: <COMBINED abbrevid= 65; COMBINED-NEXT: <COMBINED abbrevid= 66; COMBINED-NEXT: <COMBINED abbrevid= 67; COMBINED-NEXT: <COMBINED abbrevid= 68; COMBINED-NEXT: <COMBINED abbrevid= 69; COMBINED-NEXT: <COMBINED abbrevid= 70; COMBINED-NEXT: <COMBINED_PROFILE {{.*}} op9=[[NONE1:.*]] op10=0 op11=[[HOT1:.*]] op12=3 op13=[[COLD1:.*]] op14=1 op15=[[NONE2:.*]] op16=0 op17=[[HOT2:.*]] op18=3 op19=[[COLD2:.*]] op20=1 op21=[[NONE3:.*]] op22=0 op23=[[HOT3:.*]] op24=3 op25=[[COLD3:.*]] op26=1/> 71; COMBINED-NEXT: <COMBINED abbrevid= 72; COMBINED-NEXT: <BLOCK_COUNT op0=13/> 73; COMBINED-NEXT: </GLOBALVAL_SUMMARY_BLOCK> 74 75 76; ModuleID = 'thinlto-function-summary-callgraph.ll' 77target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 78target triple = "x86_64-unknown-linux-gnu" 79 80; This function have high profile count, so entry block is hot. 81define void @hot_function(i1 %a, i1 %a2) !prof !20 { 82entry: 83 call void @none1() 84 call void @hot1(), !prof !17 85 call void @cold1(), !prof !18 86 br i1 %a, label %Cold, label %Hot, !prof !41 87Cold: ; 1/1000 goes here 88 call void @none2() 89 call void @hot2(), !prof !17 90 call void @cold2(), !prof !18 91 br label %exit 92Hot: ; 999/1000 goes here 93 call void @none3() 94 call void @hot3(), !prof !17 95 call void @cold3(), !prof !18 96 br label %exit 97exit: 98 ret void 99} 100 101declare void @hot1() #1 102declare void @hot2() #1 103declare void @hot3() #1 104declare void @cold1() #1 105declare void @cold2() #1 106declare void @cold3() #1 107declare void @none1() #1 108declare void @none2() #1 109declare void @none3() #1 110 111!41 = !{!"branch_weights", i32 1, i32 1000} 112 113!llvm.module.flags = !{!1} 114!20 = !{!"function_entry_count", i64 110, i64 123} 115 116!1 = !{i32 1, !"ProfileSummary", !2} 117!2 = !{!3, !4, !5, !6, !7, !8, !9, !10, !11, !12} 118!3 = !{!"ProfileFormat", !"SampleProfile"} 119!4 = !{!"TotalCount", i64 10000} 120!5 = !{!"MaxCount", i64 10} 121!6 = !{!"MaxInternalCount", i64 1} 122!7 = !{!"MaxFunctionCount", i64 1000} 123!8 = !{!"NumCounts", i64 3} 124!9 = !{!"NumFunctions", i64 3} 125!10 = !{!"IsPartialProfile", i64 1} 126!11 = !{!"PartialProfileRatio", double 0.5} 127!12 = !{!"DetailedSummary", !13} 128!13 = !{!14, !15, !16} 129!14 = !{i32 10000, i64 100, i32 1} 130!15 = !{i32 999000, i64 100, i32 1} 131!16 = !{i32 999999, i64 1, i32 2} 132!17 = !{!"branch_weights", i32 100} 133!18 = !{!"branch_weights", i32 1} 134