forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 55
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[CSSPGO] Fix the issue of missing callee profile matches (llvm#85715)
Two fixes related to the callee/inlinee profile: 1. Fix the bug that the matching results are missing to distribute to the callee profiles (should be pass-by-reference). 2. Narrow imported function matching to checksum mismatched functions. More context: before we run matchings for all imported functions even checksums are matched, however, after we fix 1), we got a regression, it's likely due to the matching is not no-op for checksum matched function, so we want to make it consistent to only run matching for checksum mismatched (imported)functions. Since the metadata(pseudo_probe_desc) are dropped for imported function, we leverage the function attribute mechanism and add a new function attribute(`profile-checksum-mismatch`) to transfer the info from pre-link to post-link.
- Loading branch information
Showing
7 changed files
with
194 additions
and
27 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
16 changes: 16 additions & 0 deletions
16
llvm/test/Transforms/SampleProfile/Inputs/pseudo-probe-callee-profile-mismatch.prof
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
main:252:0 | ||
1: 0 | ||
2: 50 | ||
5: 50 | ||
7: bar:102 | ||
1: 51 | ||
2: baz:51 | ||
1: 51 | ||
!CFGChecksum: 4294967295 | ||
!Attributes: 3 | ||
!CFGChecksum: 281479271677951 | ||
!Attributes: 2 | ||
!CFGChecksum: 281582081721716 | ||
bar:1:1 | ||
1: 1 | ||
!CFGChecksum: 281479271677951 |
67 changes: 67 additions & 0 deletions
67
llvm/test/Transforms/SampleProfile/csspgo-profile-checksum-mismatch-attr.ll
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
; REQUIRES: x86_64-linux | ||
; REQUIRES: asserts | ||
; RUN: opt < %s -passes='thinlto-pre-link<O2>' -pgo-kind=pgo-sample-use-pipeline -sample-profile-file=%S/Inputs/pseudo-probe-callee-profile-mismatch.prof -pass-remarks=inline -S -o %t 2>&1 | FileCheck %s --check-prefix=INLINE | ||
; RUN: FileCheck %s < %t | ||
; RUN: FileCheck %s < %t --check-prefix=MERGE | ||
|
||
|
||
; Make sure bar is inlined into main for attr merging verification. | ||
; INLINE: 'bar' inlined into 'main' | ||
|
||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" | ||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
define i32 @baz() #0 { | ||
entry: | ||
ret i32 0 | ||
} | ||
|
||
define i32 @bar() #0 !dbg !11 { | ||
; CHECK: define {{.*}} @bar() {{.*}} #[[#BAR_ATTR:]] ! | ||
entry: | ||
%call = call i32 @baz() | ||
ret i32 0 | ||
} | ||
|
||
define i32 @main() #0 { | ||
; MERGE: define {{.*}} @main() {{.*}} #[[#MAIN_ATTR:]] ! | ||
entry: | ||
br label %for.cond | ||
|
||
for.cond: ; preds = %for.cond, %entry | ||
%call = call i32 @bar(), !dbg !14 | ||
br label %for.cond | ||
} | ||
|
||
; CHECK: attributes #[[#BAR_ATTR]] = {{{.*}} "profile-checksum-mismatch" {{.*}}} | ||
|
||
; Verify the attribute is not merged into the caller. | ||
; MERGE-NOT: attributes #[[#MAIN_ATTR]] = {{{.*}} "profile-checksum-mismatch" {{.*}}} | ||
|
||
attributes #0 = { "use-sample-profile" } | ||
|
||
!llvm.dbg.cu = !{!0} | ||
!llvm.module.flags = !{!7} | ||
!llvm.pseudo_probe_desc = !{!8, !9, !10} | ||
|
||
!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, producer: "clang version 19.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, globals: !2, splitDebugInlining: false, nameTableKind: None) | ||
!1 = !DIFile(filename: "test.c", directory: "/home", checksumkind: CSK_MD5, checksum: "0df0c950a93a603a7d13f0a9d4623642") | ||
!2 = !{!3} | ||
!3 = !DIGlobalVariableExpression(var: !4, expr: !DIExpression()) | ||
!4 = distinct !DIGlobalVariable(name: "x", scope: !0, file: !1, line: 2, type: !5, isLocal: false, isDefinition: true) | ||
!5 = !DIDerivedType(tag: DW_TAG_volatile_type, baseType: !6) | ||
!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) | ||
!7 = !{i32 2, !"Debug Info Version", i32 3} | ||
!8 = !{i64 7546896869197086323, i64 4294967295, !"baz"} | ||
!9 = !{i64 -2012135647395072713, i64 281530612780802, !"bar"} | ||
!10 = !{i64 -2624081020897602054, i64 281582081721716, !"main"} | ||
!11 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 5, type: !12, scopeLine: 5, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !13) | ||
!12 = distinct !DISubroutineType(types: !13) | ||
!13 = !{} | ||
!14 = !DILocation(line: 15, column: 10, scope: !15) | ||
!15 = !DILexicalBlockFile(scope: !16, file: !1, discriminator: 186646591) | ||
!16 = distinct !DILexicalBlock(scope: !17, file: !1, line: 14, column: 40) | ||
!17 = distinct !DILexicalBlock(scope: !18, file: !1, line: 14, column: 3) | ||
!18 = distinct !DILexicalBlock(scope: !19, file: !1, line: 14, column: 3) | ||
!19 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 12, type: !20, scopeLine: 13, flags: DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !13) | ||
!20 = !DISubroutineType(types: !13) |
63 changes: 63 additions & 0 deletions
63
llvm/test/Transforms/SampleProfile/pseudo-probe-callee-profile-mismatch.ll
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
; REQUIRES: x86_64-linux | ||
; REQUIRES: asserts | ||
; RUN: opt < %s -passes=sample-profile -sample-profile-file=%S/Inputs/pseudo-probe-callee-profile-mismatch.prof --salvage-stale-profile -S --debug-only=sample-profile,sample-profile-impl -pass-remarks=inline 2>&1 | FileCheck %s | ||
|
||
|
||
; CHECK: Run stale profile matching for bar | ||
; CHECK: Callsite with callee:baz is matched from 4 to 2 | ||
; CHECK: 'baz' inlined into 'main' to match profiling context with (cost=always): preinliner at callsite bar:3:8.4 @ main:3:10.7 | ||
|
||
; CHECK: Probe descriptor missing for Function bar | ||
; CHECK: Profile is invalid due to CFG mismatch for Function bar | ||
|
||
|
||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" | ||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
define i32 @main() #0 { | ||
%1 = call i32 @bar(), !dbg !13 | ||
ret i32 0 | ||
} | ||
|
||
define available_externally i32 @bar() #1 !dbg !21 { | ||
%1 = call i32 @baz(), !dbg !23 | ||
ret i32 0 | ||
} | ||
|
||
define available_externally i32 @baz() #0 !dbg !25 { | ||
ret i32 0 | ||
} | ||
|
||
attributes #0 = { "use-sample-profile" } | ||
attributes #1 = { "profile-checksum-mismatch" "use-sample-profile" } | ||
|
||
!llvm.dbg.cu = !{!0, !7, !9} | ||
!llvm.module.flags = !{!11} | ||
!llvm.pseudo_probe_desc = !{!12} | ||
|
||
!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, producer: "clang version 19.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, globals: !2, splitDebugInlining: false, nameTableKind: None) | ||
!1 = !DIFile(filename: "test.c", directory: "/home/test", checksumkind: CSK_MD5, checksum: "7220f1a2d70ff869f1a6ab7958e3c393") | ||
!2 = !{!3} | ||
!3 = !DIGlobalVariableExpression(var: !4, expr: !DIExpression()) | ||
!4 = distinct !DIGlobalVariable(name: "x", scope: !0, file: !1, line: 2, type: !5, isLocal: false, isDefinition: true) | ||
!5 = !DIDerivedType(tag: DW_TAG_volatile_type, baseType: !6) | ||
!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) | ||
!7 = distinct !DICompileUnit(language: DW_LANG_C11, file: !8, producer: "clang version 19.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) | ||
!8 = !DIFile(filename: "test1.v1.c", directory: "/home/test", checksumkind: CSK_MD5, checksum: "76696bd6bfe16a9f227fe03cfdb6a82c") | ||
!9 = distinct !DICompileUnit(language: DW_LANG_C11, file: !10, producer: "clang version 19.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) | ||
!10 = !DIFile(filename: "test2.c", directory: "/home/test", checksumkind: CSK_MD5, checksum: "553093afc026f9c73562eb3b0c5b7532") | ||
!11 = !{i32 2, !"Debug Info Version", i32 3} | ||
!12 = !{i64 -2624081020897602054, i64 281582081721716, !"main"} | ||
!13 = !DILocation(line: 8, column: 10, scope: !14) | ||
!14 = !DILexicalBlockFile(scope: !15, file: !1, discriminator: 186646591) | ||
!15 = distinct !DILexicalBlock(scope: !16, file: !1, line: 7, column: 40) | ||
!16 = distinct !DILexicalBlock(scope: !17, file: !1, line: 7, column: 3) | ||
!17 = distinct !DILexicalBlock(scope: !18, file: !1, line: 7, column: 3) | ||
!18 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 5, type: !19, scopeLine: 6, flags: DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !20) | ||
!19 = distinct !DISubroutineType(types: !20) | ||
!20 = !{} | ||
!21 = distinct !DISubprogram(name: "bar", scope: !8, file: !8, line: 3, type: !22, scopeLine: 3, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !7, retainedNodes: !20) | ||
!22 = !DISubroutineType(types: !20) | ||
!23 = !DILocation(line: 6, column: 8, scope: !24) | ||
!24 = !DILexicalBlockFile(scope: !21, file: !8, discriminator: 186646567) | ||
!25 = distinct !DISubprogram(name: "baz", scope: !10, file: !10, line: 1, type: !22, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !9, retainedNodes: !20) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters