diff options
| author | Dehao Chen <dehao@google.com> | 2016-08-05 20:28:41 +0000 |
|---|---|---|
| committer | Dehao Chen <dehao@google.com> | 2016-08-05 20:28:41 +0000 |
| commit | de39cb93843636e7f620918252551a7431044e3b (patch) | |
| tree | cd755411c133e1bd3054b054a9966be0c2862bd7 | |
| parent | b4bbc3bb7ab74a56975f0546646c8491a83676f0 (diff) | |
| download | bcm5719-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.cpp | 23 | ||||
| -rw-r--r-- | llvm/test/Transforms/Inline/inline-hot-callsite.ll | 2 |
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 |

