mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
d9e172d0fb
and indirect call promotion candidate. Profile remapping is a feature to match a function in the module with its profile in sample profile if the function name and the name in profile look different but are equivalent using given remapping rules. This is a useful feature to keep the performance stable by specifying some remapping rules when sampleFDO targets are going through some large scale function signature change. However, currently profile remapping support is only valid for outline function profile in SampleFDO. It cannot match a callee with an inline instance profile if they have different but equivalent names. We found that without the support for inline instance profile, remapping is less effective for some large scale change. To add that support, before any remapping lookup happens, all the names in the profile will be inserted into remapper and the Key to the name mapping will be recorded in a map called NameMap in the remapper. During name lookup, a Key will be returned for the given name and it will be used to extract an equivalent name in the profile from NameMap. So with the help of the NameMap, we can translate any given name to an equivalent name in the profile if it exists. Whenever we try to match a name in the module to a name in the profile, we will try the match with the original name first, and if it doesn't match, we will use the equivalent name got from remapper to try the match for another time. In this way, the patch can enhance the profile remapping support for searching inline instance and searching indirect call promotion candidate. In a planned large scale change of int64 type (long long) to int64_t (long), we found the performance of a google internal benchmark degraded by 2% if nothing was done. If existing profile remapping was enabled, the performance degradation dropped to 1.2%. If the profile remapping with the current patch was enabled, the performance degradation further dropped to 0.14% (Note the experiment was done before searching indirect call promotion candidate was added. We hope with the remapping support of searching indirect call promotion candidate, the degradation can drop to 0% in the end. It will be evaluated post commit). Differential Revision: https://reviews.llvm.org/D86332
75 lines
3.3 KiB
LLVM
75 lines
3.3 KiB
LLVM
; RUN: opt %s -passes=sample-profile -sample-profile-file=%S/Inputs/remap-2.prof -sample-profile-remapping-file=%S/Inputs/remap.map -S | FileCheck %s
|
|
; Check profile remapping works for searching inline instance, searching
|
|
; indirect call promotion candidate and prevent recursive inline.
|
|
|
|
@x.addr = common global i32 zeroinitializer, align 16
|
|
@y.addr = common global i32 zeroinitializer, align 16
|
|
|
|
define i32 @_ZN3foo3barERKN1M1XINS_6detail3quxEEE() #0 !dbg !9 {
|
|
entry:
|
|
%t0 = load i32, i32* @x.addr, align 4
|
|
%t1 = load i32, i32* @y.addr, align 4
|
|
%add = add nsw i32 %t0, %t1
|
|
ret i32 %add
|
|
}
|
|
|
|
define i32 @_ZN1M1XE() #0 !dbg !10 {
|
|
entry:
|
|
%t0 = load i32, i32* @x.addr, align 4
|
|
%t1 = load i32, i32* @y.addr, align 4
|
|
%sub = sub nsw i32 %t0, %t1
|
|
ret i32 %sub
|
|
}
|
|
|
|
define void @test(i32 ()*) #0 !dbg !4 {
|
|
%t2 = alloca i32 ()*
|
|
store i32 ()* %0, i32 ()** %t2
|
|
%t3 = load i32 ()*, i32 ()** %t2
|
|
; Check call i32 %t3 has been indirect call promoted and call i32 @_ZN1M1XE
|
|
; has been inlined.
|
|
; CHECK-LABEL: @test(
|
|
; CHECK: icmp eq i32 ()* %t3, @_ZN3foo3barERKN1M1XINS_6detail3quxEEE
|
|
; CHECK-NOT: call i32 @_ZN1M1XE
|
|
%t4 = call i32 %t3(), !dbg !7
|
|
%t5 = call i32 @_ZN1M1XE(), !dbg !8
|
|
ret void
|
|
}
|
|
|
|
define void @_ZN1M1X1YE(i32 ()*) #0 !dbg !11 {
|
|
%t2 = alloca i32 ()*
|
|
store i32 ()* %0, i32 ()** %t2
|
|
%t3 = load i32 ()*, i32 ()** %t2
|
|
; Check call i32 %t3 has got its profile but is not indirect call promoted
|
|
; because the promotion candidate is a recursive call to the current function.
|
|
; CHECK-LABEL: @_ZN1M1X1YE(
|
|
; CHECK: call i32 %t3(), {{.*}} !prof ![[PROFID:[0-9]+]]
|
|
; CHECK-NOT: icmp eq i32 ()* %t3, @_ZN1M1X1YE
|
|
%t4 = call i32 %t3(), !dbg !12
|
|
ret void
|
|
}
|
|
|
|
; CHECK: ![[PROFID]] = !{!"VP", i32 0, i64 3000
|
|
|
|
attributes #0 = { "use-sample-profile" }
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.module.flags = !{!13, !14}
|
|
!llvm.ident = !{!15}
|
|
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5 ", isOptimized: false, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2)
|
|
!1 = !DIFile(filename: "calls.cc", directory: ".")
|
|
!2 = !{}
|
|
!4 = distinct !DISubprogram(name: "test", line: 3, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 3, file: !1, scope: !5, type: !6, retainedNodes: !2)
|
|
!5 = !DIFile(filename: "calls.cc", directory: ".")
|
|
!6 = !DISubroutineType(types: !2)
|
|
!7 = !DILocation(line: 8, scope: !4)
|
|
!8 = !DILocation(line: 9, scope: !4)
|
|
!9 = distinct !DISubprogram(name: "_ZN3foo3barERKN1M1XINS_6detail3quxEEE", line: 15, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 3, file: !1, scope: !5, type: !6, retainedNodes: !2)
|
|
!10 = distinct !DISubprogram(name: "_ZN1M1XE", line: 20, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 3, file: !1, scope: !5, type: !6, retainedNodes: !2)
|
|
!11 = distinct !DISubprogram(name: "_ZN1M1X1YE", line: 25, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 3, file: !1, scope: !5, type: !6, retainedNodes: !2)
|
|
!12 = !DILocation(line: 30, scope: !11)
|
|
!13 = !{i32 2, !"Dwarf Version", i32 4}
|
|
!14 = !{i32 1, !"Debug Info Version", i32 3}
|
|
!15 = !{!"clang version 3.5 "}
|
|
|