Replace hot-callsite based heuristic to use its own threshold parameter instead of share inline-hint parameter

Summary: Hot callsites should have higher threshold than inline hints. This patch uses separate threshold parameter for hot callsites.

Reviewers: davidxl, eraman

Subscribers: Prazek, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277860 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dehao Chen 2016-08-05 20:28:41 +00:00
parent 4613003000
commit ffccedb490
2 changed files with 18 additions and 7 deletions

View File

@ -66,6 +66,11 @@ static cl::opt<int> ColdThreshold(
"inlinecold-threshold", cl::Hidden, cl::init(225),
cl::desc("Threshold for inlining functions with cold attribute"));
static cl::opt<int>
HotCallSiteThreshold("hot-callsite-threshold", cl::Hidden, cl::init(3000),
cl::ZeroOrMore,
cl::desc("Threshold for hot callsites "));
namespace {
class CallAnalyzer : public InstVisitor<CallAnalyzer, bool> {
@ -635,27 +640,33 @@ void CallAnalyzer::updateThreshold(CallSite CS, Function &Callee) {
}
bool HotCallsite = false;
bool ColdCallsite = false;
uint64_t TotalWeight;
if (CS.getInstruction()->extractProfTotalWeight(TotalWeight) &&
PSI->isHotCount(TotalWeight))
HotCallsite = true;
if (CS.getInstruction()->extractProfTotalWeight(TotalWeight))
if (PSI->isHotCount(TotalWeight))
HotCallsite = true;
else if (PSI->isColdCount(TotalWeight))
ColdCallsite = true;
// Listen to the inlinehint attribute or profile based hotness information
// when it would increase the threshold and the caller does not need to
// minimize its size.
bool InlineHint = Callee.hasFnAttribute(Attribute::InlineHint) ||
PSI->isHotFunction(&Callee) ||
HotCallsite;
PSI->isHotFunction(&Callee);
if (InlineHint && HintThreshold > Threshold && !Caller->optForMinSize())
Threshold = HintThreshold;
if (HotCallsite && HotCallSiteThreshold > Threshold &&
!Caller->optForMinSize())
Threshold = HotCallSiteThreshold;
bool ColdCallee = PSI->isColdFunction(&Callee);
// Command line argument for DefaultInlineThreshold will override the default
// ColdThreshold. If we have -inline-threshold but no -inlinecold-threshold,
// do not use the default cold threshold even if it is smaller.
if ((DefaultInlineThreshold.getNumOccurrences() == 0 ||
ColdThreshold.getNumOccurrences() > 0) &&
ColdCallee && ColdThreshold < Threshold)
(ColdCallee || ColdCallsite) && ColdThreshold < Threshold)
Threshold = ColdThreshold;
// Finally, take the target-specific inlining threshold multiplier into

View File

@ -1,4 +1,4 @@
; RUN: opt < %s -inline -inline-threshold=0 -inlinehint-threshold=100 -S | FileCheck %s
; RUN: opt < %s -inline -inline-threshold=0 -hot-callsite-threshold=100 -S | FileCheck %s
; This tests that a hot callsite gets the (higher) inlinehint-threshold even without
; without inline hints and gets inlined because the cost is less than