summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDehao Chen <dehao@google.com>2016-08-05 20:28:41 +0000
committerDehao Chen <dehao@google.com>2016-08-05 20:28:41 +0000
commitde39cb93843636e7f620918252551a7431044e3b (patch)
treecd755411c133e1bd3054b054a9966be0c2862bd7
parentb4bbc3bb7ab74a56975f0546646c8491a83676f0 (diff)
downloadbcm5719-llvm-de39cb93843636e7f620918252551a7431044e3b.tar.gz
bcm5719-llvm-de39cb93843636e7f620918252551a7431044e3b.zip
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 llvm-svn: 277860
-rw-r--r--llvm/lib/Analysis/InlineCost.cpp23
-rw-r--r--llvm/test/Transforms/Inline/inline-hot-callsite.ll2
2 files changed, 18 insertions, 7 deletions
diff --git a/llvm/lib/Analysis/InlineCost.cpp b/llvm/lib/Analysis/InlineCost.cpp
index 54205bcc341..9f648df12d0 100644
--- a/llvm/lib/Analysis/InlineCost.cpp
+++ b/llvm/lib/Analysis/InlineCost.cpp
@@ -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
diff --git a/llvm/test/Transforms/Inline/inline-hot-callsite.ll b/llvm/test/Transforms/Inline/inline-hot-callsite.ll
index 36d9407142e..46993f49cc6 100644
--- a/llvm/test/Transforms/Inline/inline-hot-callsite.ll
+++ b/llvm/test/Transforms/Inline/inline-hot-callsite.ll
@@ -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
OpenPOWER on IntegriCloud