mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-24 03:25:00 +00:00
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:
parent
4613003000
commit
ffccedb490
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user