mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
c3a521efd8
Summary: The function section prefix for PGO based layout (e.g. hot/unlikely) should look at the hotness of all blocks not just the entry BB. A function with a cold entry but a very hot loop should be placed in the hot section, for example, so that it is located close to other hot functions it may call. For SamplePGO it was already looking at the branch weights on calls, and I made that code conditional on whether this is SamplePGO since it was essentially a noop for instrumentation PGO anyway. Reviewers: davidxl Subscribers: eraman, llvm-commits Differential Revision: https://reviews.llvm.org/D41395 llvm-svn: 321197
85 lines
2.4 KiB
LLVM
85 lines
2.4 KiB
LLVM
; RUN: opt < %s -codegenprepare -S | FileCheck %s
|
|
|
|
target triple = "x86_64-pc-linux-gnu"
|
|
|
|
; This tests that hot/cold functions get correct section prefix assigned
|
|
|
|
; CHECK: hot_func1{{.*}}!section_prefix ![[HOT_ID:[0-9]+]]
|
|
; The entry is hot
|
|
define void @hot_func1() !prof !15 {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: hot_func2{{.*}}!section_prefix ![[HOT_ID:[0-9]+]]
|
|
; Entry is cold but inner block is hot
|
|
define void @hot_func2(i32 %n) !prof !16 {
|
|
entry:
|
|
%n.addr = alloca i32, align 4
|
|
%i = alloca i32, align 4
|
|
store i32 %n, i32* %n.addr, align 4
|
|
store i32 0, i32* %i, align 4
|
|
br label %for.cond
|
|
|
|
for.cond:
|
|
%0 = load i32, i32* %i, align 4
|
|
%1 = load i32, i32* %n.addr, align 4
|
|
%cmp = icmp slt i32 %0, %1
|
|
br i1 %cmp, label %for.body, label %for.end, !prof !19
|
|
|
|
for.body:
|
|
%2 = load i32, i32* %i, align 4
|
|
%inc = add nsw i32 %2, 1
|
|
store i32 %inc, i32* %i, align 4
|
|
br label %for.cond
|
|
|
|
for.end:
|
|
ret void
|
|
}
|
|
|
|
; For instrumentation based PGO, we should only look at block counts,
|
|
; not call site VP metadata (which can exist on value profiled memcpy,
|
|
; or possibly left behind after static analysis based devirtualization).
|
|
; CHECK: cold_func1{{.*}}!section_prefix ![[COLD_ID:[0-9]+]]
|
|
define void @cold_func1() !prof !16 {
|
|
call void @hot_func1(), !prof !17
|
|
call void @hot_func1(), !prof !17
|
|
ret void
|
|
}
|
|
|
|
; CHECK: cold_func2{{.*}}!section_prefix ![[COLD_ID]]
|
|
define void @cold_func2() !prof !16 {
|
|
call void @hot_func1(), !prof !17
|
|
call void @hot_func1(), !prof !18
|
|
call void @hot_func1(), !prof !18
|
|
ret void
|
|
}
|
|
|
|
; CHECK: cold_func3{{.*}}!section_prefix ![[COLD_ID]]
|
|
define void @cold_func3() !prof !16 {
|
|
call void @hot_func1(), !prof !18
|
|
ret void
|
|
}
|
|
|
|
; CHECK: ![[HOT_ID]] = !{!"function_section_prefix", !".hot"}
|
|
; CHECK: ![[COLD_ID]] = !{!"function_section_prefix", !".unlikely"}
|
|
!llvm.module.flags = !{!1}
|
|
!1 = !{i32 1, !"ProfileSummary", !2}
|
|
!2 = !{!3, !4, !5, !6, !7, !8, !9, !10}
|
|
!3 = !{!"ProfileFormat", !"InstrProf"}
|
|
!4 = !{!"TotalCount", i64 10000}
|
|
!5 = !{!"MaxCount", i64 1000}
|
|
!6 = !{!"MaxInternalCount", i64 1}
|
|
!7 = !{!"MaxFunctionCount", i64 1000}
|
|
!8 = !{!"NumCounts", i64 3}
|
|
!9 = !{!"NumFunctions", i64 3}
|
|
!10 = !{!"DetailedSummary", !11}
|
|
!11 = !{!12, !13, !14}
|
|
!12 = !{i32 10000, i64 100, i32 1}
|
|
!13 = !{i32 999000, i64 100, i32 1}
|
|
!14 = !{i32 999999, i64 1, i32 2}
|
|
!15 = !{!"function_entry_count", i64 1000}
|
|
!16 = !{!"function_entry_count", i64 1}
|
|
!17 = !{!"branch_weights", i32 80}
|
|
!18 = !{!"branch_weights", i32 1}
|
|
!19 = !{!"branch_weights", i32 1000, i32 1}
|