From: Dehao Chen Date: Thu, 24 Aug 2017 21:37:04 +0000 (+0000) Subject: Move accurate-sample-profile into the function attribute. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d38687abb55ffe11f0722b69b2f2f833c7a1ffce;p=llvm Move accurate-sample-profile into the function attribute. Summary: We need to have accurate-sample-profile in function attribute so that it works with LTO. Reviewers: davidxl, rsmith Reviewed By: davidxl Subscribers: sanjoy, mehdi_amini, javed.absar, llvm-commits, eraman Differential Revision: https://reviews.llvm.org/D37113 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311706 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/Attributes.td b/include/llvm/IR/Attributes.td index 76284babc1a..2cf58b0fa41 100644 --- a/include/llvm/IR/Attributes.td +++ b/include/llvm/IR/Attributes.td @@ -185,6 +185,7 @@ def NoInfsFPMath : StrBoolAttr<"no-infs-fp-math">; def NoNansFPMath : StrBoolAttr<"no-nans-fp-math">; def UnsafeFPMath : StrBoolAttr<"unsafe-fp-math">; def NoJumpTables : StrBoolAttr<"no-jump-tables">; +def ProfileSampleAccurate : StrBoolAttr<"profile-sample-accurate">; class CompatRule { // The name of the function called to check the attribute of the caller and @@ -216,6 +217,7 @@ def : MergeRule<"setAND">; def : MergeRule<"setAND">; def : MergeRule<"setOR">; def : MergeRule<"setOR">; +def : MergeRule<"setOR">; def : MergeRule<"adjustCallerSSPLevel">; def : MergeRule<"adjustCallerStackProbes">; def : MergeRule<"adjustCallerStackProbeSize">; diff --git a/lib/Analysis/ProfileSummaryInfo.cpp b/lib/Analysis/ProfileSummaryInfo.cpp index 4bad196a91a..671744f93fb 100644 --- a/lib/Analysis/ProfileSummaryInfo.cpp +++ b/lib/Analysis/ProfileSummaryInfo.cpp @@ -39,8 +39,8 @@ static cl::opt ProfileSummaryCutoffCold( cl::desc("A count is cold if it is below the minimum count" " to reach this percentile of total counts.")); -static cl::opt AccurateSampleProfile( - "accurate-sample-profile", cl::Hidden, cl::init(false), +static cl::opt ProfileSampleAccurate( + "profile-sample-accurate", cl::Hidden, cl::init(false), cl::desc("If the sample profile is accurate, we will mark all un-sampled " "callsite as cold. Otherwise, treat un-sampled callsites as if " "we have no profile.")); @@ -231,7 +231,8 @@ bool ProfileSummaryInfo::isColdCallSite(const CallSite &CS, // If there is no profile for the caller, and we know the profile is // accurate, we consider the callsite as cold. return (hasSampleProfile() && - (CS.getCaller()->getEntryCount() || AccurateSampleProfile)); + (CS.getCaller()->getEntryCount() || ProfileSampleAccurate || + CS.getCaller()->hasFnAttribute("profile-sample-accurate"))); } INITIALIZE_PASS(ProfileSummaryInfoWrapperPass, "profile-summary-info", diff --git a/test/Transforms/Inline/inline-cold-callsite-samplepgo.ll b/test/Transforms/Inline/inline-cold-callsite-samplepgo.ll index 891781eb471..cf2e75757e7 100644 --- a/test/Transforms/Inline/inline-cold-callsite-samplepgo.ll +++ b/test/Transforms/Inline/inline-cold-callsite-samplepgo.ll @@ -1,8 +1,7 @@ -; For SamplePGO, if -accurate-sample-profile is specified, cold callsite +; For SamplePGO, if -profile-sample-accurate is specified, cold callsite ; heuristics should be honored if the caller has no profile. ; RUN: opt < %s -inline -S -inline-cold-callsite-threshold=0 | FileCheck %s -; RUN: opt < %s -inline -S -inline-cold-callsite-threshold=0 -accurate-sample-profile | FileCheck %s --check-prefix=ACCURATE define i32 @callee(i32 %x) { %x1 = add i32 %x, 1 @@ -14,14 +13,23 @@ define i32 @callee(i32 %x) { } define i32 @caller(i32 %y1) { +; CHECK-LABEL: @caller ; CHECK-NOT: call i32 @callee -; ACCURATE: call i32 @callee + %y2 = call i32 @callee(i32 %y1) + ret i32 %y2 +} + +define i32 @caller_accurate(i32 %y1) #0 { +; CHECK-LABEL: @caller_accurate +; CHECK: call i32 @callee %y2 = call i32 @callee(i32 %y1) ret i32 %y2 } declare void @extern() +attributes #0 = { "profile-sample-accurate" } + !llvm.module.flags = !{!1} !1 = !{i32 1, !"ProfileSummary", !2} !2 = !{!3, !4, !5, !6, !7, !8, !9, !10}