diff options
| author | Wei Mi <wmi@google.com> | 2018-12-12 17:09:27 +0000 |
|---|---|---|
| committer | Wei Mi <wmi@google.com> | 2018-12-12 17:09:27 +0000 |
| commit | 7da5a08e1a50ca5da1a35a4fa83673bf96f37d3c (patch) | |
| tree | f00c62ddb71f39d23e82c2a3d5515989d20455f6 | |
| parent | d4f7d6a7a1ba16287a6a18422b8921534d846d18 (diff) | |
| download | bcm5719-llvm-7da5a08e1a50ca5da1a35a4fa83673bf96f37d3c.tar.gz bcm5719-llvm-7da5a08e1a50ca5da1a35a4fa83673bf96f37d3c.zip | |
[SampleFDO] Extend profile-sample-accurate option to cover isFunctionColdInCallGraph
For SampleFDO, when a callsite doesn't appear in the profile, it will not be marked as cold callsite unless the option -profile-sample-accurate is specified.
But profile-sample-accurate doesn't cover function isFunctionColdInCallGraph which is used to decide whether a function should be put into text.unlikely section, so even if the user knows the profile is accurate and specifies profile-sample-accurate, those functions not appearing in the sample profile are still not be put into text.unlikely section right now.
The patch fixes that.
Differential Revision: https://reviews.llvm.org/D55567
llvm-svn: 348940
| -rw-r--r-- | llvm/lib/Analysis/ProfileSummaryInfo.cpp | 9 | ||||
| -rw-r--r-- | llvm/test/Transforms/CodeGenPrepare/section-samplepgo.ll | 29 |
2 files changed, 37 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/ProfileSummaryInfo.cpp b/llvm/lib/Analysis/ProfileSummaryInfo.cpp index bd8459ddb82..4326e53b43b 100644 --- a/llvm/lib/Analysis/ProfileSummaryInfo.cpp +++ b/llvm/lib/Analysis/ProfileSummaryInfo.cpp @@ -261,7 +261,14 @@ bool ProfileSummaryInfo::isHotBlock(const BasicBlock *BB, BlockFrequencyInfo *BF bool ProfileSummaryInfo::isColdBlock(const BasicBlock *BB, BlockFrequencyInfo *BFI) { auto Count = BFI->getBlockProfileCount(BB); - return Count && isColdCount(*Count); + if (Count) + return isColdCount(*Count); + if (!hasSampleProfile()) + return false; + + const Function *F = BB->getParent(); + return ProfileSampleAccurate || + (F && F->hasFnAttribute("profile-sample-accurate")); } bool ProfileSummaryInfo::isHotCallSite(const CallSite &CS, diff --git a/llvm/test/Transforms/CodeGenPrepare/section-samplepgo.ll b/llvm/test/Transforms/CodeGenPrepare/section-samplepgo.ll index 93d2a5f2542..8b59e7d8c62 100644 --- a/llvm/test/Transforms/CodeGenPrepare/section-samplepgo.ll +++ b/llvm/test/Transforms/CodeGenPrepare/section-samplepgo.ll @@ -1,16 +1,19 @@ ; RUN: opt < %s -codegenprepare -S | FileCheck %s +; RUN: opt < %s -codegenprepare -profile-sample-accurate -S | FileCheck %s --check-prefix ACCURATE target triple = "x86_64-pc-linux-gnu" ; This tests that hot/cold functions get correct section prefix assigned ; CHECK: hot_func{{.*}}!section_prefix ![[HOT_ID:[0-9]+]] +; ACCURATE: hot_func{{.*}}!section_prefix ![[HOT_ID:[0-9]+]] ; The entry is hot define void @hot_func() !prof !15 { ret void } ; CHECK: hot_call_func{{.*}}!section_prefix ![[HOT_ID]] +; ACCURATE: hot_call_func{{.*}}!section_prefix ![[HOT_ID]] ; The sum of 2 callsites are hot define void @hot_call_func() !prof !16 { call void @hot_func(), !prof !17 @@ -19,6 +22,7 @@ define void @hot_call_func() !prof !16 { } ; CHECK-NOT: normal_func{{.*}}!section_prefix +; ACCURATE-NOT: normal_func{{.*}}!section_prefix ; The sum of all callsites are neither hot or cold define void @normal_func() !prof !16 { call void @hot_func(), !prof !17 @@ -28,12 +32,36 @@ define void @normal_func() !prof !16 { } ; CHECK: cold_func{{.*}}!section_prefix ![[COLD_ID:[0-9]+]] +; ACCURATE: cold_func{{.*}}!section_prefix ![[COLD_ID:[0-9]+]] ; The entry and the callsite are both cold define void @cold_func() !prof !16 { call void @hot_func(), !prof !18 ret void } + +; CHECK-NOT: foo_not_in_profile{{.*}}!section_prefix +; The function not appearing in profile is neither hot nor cold +; +; ACCURATE: foo_not_in_profile{{.*}}!section_prefix ![[COLD_ID:[0-9]+]] +; The function not appearing in profile is cold when -profile-sample-accurate +; is on +define void @foo_not_in_profile() !prof !19 { + call void @hot_func() + ret void +} + +; CHECK: bar_not_in_profile{{.*}}!section_prefix ![[COLD_ID:[0-9]+]] +; ACCURATE: bar_not_in_profile{{.*}}!section_prefix ![[COLD_ID:[0-9]+]] +; The function not appearing in profile is cold when the func has +; profile-sample-accurate attribute +define void @bar_not_in_profile() #0 !prof !19 { + call void @hot_func() + ret void +} + +attributes #0 = { "profile-sample-accurate" } + ; CHECK: ![[HOT_ID]] = !{!"function_section_prefix", !".hot"} ; CHECK: ![[COLD_ID]] = !{!"function_section_prefix", !".unlikely"} !llvm.module.flags = !{!1} @@ -55,3 +83,4 @@ define void @cold_func() !prof !16 { !16 = !{!"function_entry_count", i64 1} !17 = !{!"branch_weights", i32 80} !18 = !{!"branch_weights", i32 1} +!19 = !{!"function_entry_count", i64 -1} |

