1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00
Wei Mi 7cc7328f4b [SampleFDO] Add profile remapping support for profile on-demand loading used
by ExtBinary format profile

Profile on-demand loading was added for ExtBinary format profile in rL374233,
but currently profile on-demand loading doesn't work well with profile
remapping. The patch adds the support.

Suppose a function in the current module has outline instance in the profile.
The function name in the module is different from the name of the outline
instance, but remapper knows the two names are equal. When loading profile
on-demand, the outline instance has to be loaded with remapper's help.

At the same time SampleProfileReaderItaniumRemapper is changed from a proxy
of SampleProfileReader to a helper member in SampleProfileReader.

Differential Revision: https://reviews.llvm.org/D68901

llvm-svn: 375295
2019-10-18 22:35:20 +00:00

65 lines
2.5 KiB
LLVM

; RUN: opt %s -passes=sample-profile -sample-profile-file=%S/Inputs/remap.prof -sample-profile-remapping-file=%S/Inputs/remap.map | opt -analyze -branch-prob | FileCheck %s
;
; Check whether profile remapping work with loading profile on demand used by extbinary format profile.
; RUN: llvm-profdata merge -sample -extbinary %S/Inputs/remap.prof -o %t.extbinary.afdo
; RUN: opt %s -passes=sample-profile -sample-profile-file=%S/Inputs/remap.prof -sample-profile-remapping-file=%S/Inputs/remap.map | opt -analyze -branch-prob | FileCheck %s
;
; Reduced from branch.ll
declare i1 @foo()
define void @_ZN3foo3barERKN1M1XINS_6detail3quxEEE() !dbg !2 {
; CHECK: Printing analysis 'Branch Probability Analysis' for function '_ZN3foo3barERKN1M1XINS_6detail3quxEEE':
entry:
%cmp = call i1 @foo(), !dbg !6
br i1 %cmp, label %if.then, label %if.end
; CHECK: edge entry -> if.then probability is 0x4ccf6b16 / 0x80000000 = 60.01%
; CHECK: edge entry -> if.end probability is 0x333094ea / 0x80000000 = 39.99%
if.then:
br label %return
if.end:
%cmp1 = call i1 @foo(), !dbg !7
br i1 %cmp1, label %if.then.2, label %if.else
; CHECK: edge if.end -> if.then.2 probability is 0x6652c748 / 0x80000000 = 79.94%
; CHECK: edge if.end -> if.else probability is 0x19ad38b8 / 0x80000000 = 20.06%
if.then.2:
call i1 @foo(), !dbg !8
br label %for.cond
for.cond:
%cmp5 = call i1 @foo()
br i1 %cmp5, label %for.body, label %for.end, !prof !9
; CHECK: edge for.cond -> for.body probability is 0x73333333 / 0x80000000 = 90.00%
; CHECK: edge for.cond -> for.end probability is 0x0ccccccd / 0x80000000 = 10.00%
for.body:
br label %for.cond
for.end:
br label %return
if.else:
br label %return
return:
ret void
}
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!4, !5}
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "foo++", isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug, enums: !{}, retainedTypes: !{})
!1 = !DIFile(filename: "test.cc", directory: "/foo/bar")
!2 = distinct !DISubprogram(name: "_ZN3foo3barERKN1M1XINS_6detail3quxEEE", scope: !1, file: !1, line: 4, type: !3, isLocal: false, isDefinition: true, scopeLine: 4, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !{})
!3 = !DISubroutineType(types: !{})
!4 = !{i32 2, !"Dwarf Version", i32 4}
!5 = !{i32 2, !"Debug Info Version", i32 3}
!6 = !DILocation(line: 5, column: 8, scope: !2)
!7 = !DILocation(line: 8, column: 6, scope: !2)
!8 = !DILocation(line: 10, column: 11, scope: !2)
!9 = !{!"branch_weights", i32 90, i32 10}