From 287fe256411e5506aaf927596b387fc927a33372 Mon Sep 17 00:00:00 2001 From: Dehao Chen Date: Tue, 21 Mar 2017 19:55:36 +0000 Subject: [PATCH] Do not inline hot callsites for samplepgo in thinlto compile phase. Summary: Because SamplePGO passes will be invoked twice in ThinLTO build: once at compile phase, the other at backend. We want to make sure the IR at the 2nd phase matches the hot part in profile, thus we do not want to inline hot callsites in the first phase. Reviewers: tejohnson, eraman Reviewed By: tejohnson Subscribers: mehdi_amini, llvm-commits, Prazek Differential Revision: https://reviews.llvm.org/D31201 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@298428 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Transforms/IPO.h | 3 ++- lib/Analysis/InlineCost.cpp | 2 +- lib/Transforms/IPO/InlineSimple.cpp | 8 ++++++-- tools/bugpoint/bugpoint.cpp | 3 ++- tools/opt/opt.cpp | 2 +- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/include/llvm/Transforms/IPO.h b/include/llvm/Transforms/IPO.h index eded0de9a8c..9f374896095 100644 --- a/include/llvm/Transforms/IPO.h +++ b/include/llvm/Transforms/IPO.h @@ -108,7 +108,8 @@ Pass *createFunctionImportPass(); /// threshold given here. Pass *createFunctionInliningPass(); Pass *createFunctionInliningPass(int Threshold); -Pass *createFunctionInliningPass(unsigned OptLevel, unsigned SizeOptLevel); +Pass *createFunctionInliningPass(unsigned OptLevel, unsigned SizeOptLevel, + bool DisableInlineHotCallSite); Pass *createFunctionInliningPass(InlineParams &Params); //===----------------------------------------------------------------------===// diff --git a/lib/Analysis/InlineCost.cpp b/lib/Analysis/InlineCost.cpp index 0789b8cee0a..ec14d1bf003 100644 --- a/lib/Analysis/InlineCost.cpp +++ b/lib/Analysis/InlineCost.cpp @@ -670,7 +670,7 @@ void CallAnalyzer::updateThreshold(CallSite CS, Function &Callee) { BlockFrequencyInfo *CallerBFI = GetBFI ? &((*GetBFI)(*Caller)) : nullptr; if (PSI->isHotCallSite(CS, CallerBFI)) { DEBUG(dbgs() << "Hot callsite.\n"); - Threshold = MaxIfValid(Threshold, Params.HotCallSiteThreshold); + Threshold = Params.HotCallSiteThreshold.getValue(); } else if (PSI->isFunctionEntryHot(&Callee)) { DEBUG(dbgs() << "Hot callee.\n"); // If callsite hotness can not be determined, we may still know diff --git a/lib/Transforms/IPO/InlineSimple.cpp b/lib/Transforms/IPO/InlineSimple.cpp index 514baa81090..50e7cc89a3b 100644 --- a/lib/Transforms/IPO/InlineSimple.cpp +++ b/lib/Transforms/IPO/InlineSimple.cpp @@ -93,8 +93,12 @@ Pass *llvm::createFunctionInliningPass(int Threshold) { } Pass *llvm::createFunctionInliningPass(unsigned OptLevel, - unsigned SizeOptLevel) { - return new SimpleInliner(llvm::getInlineParams(OptLevel, SizeOptLevel)); + unsigned SizeOptLevel, + bool DisableInlineHotCallSite) { + auto Param = llvm::getInlineParams(OptLevel, SizeOptLevel); + if (DisableInlineHotCallSite) + Param.HotCallSiteThreshold = 0; + return new SimpleInliner(Param); } Pass *llvm::createFunctionInliningPass(InlineParams &Params) { diff --git a/tools/bugpoint/bugpoint.cpp b/tools/bugpoint/bugpoint.cpp index a5de953b2b7..85c1ddd8277 100644 --- a/tools/bugpoint/bugpoint.cpp +++ b/tools/bugpoint/bugpoint.cpp @@ -181,7 +181,8 @@ int main(int argc, char **argv) { if (OptLevelO1) Builder.Inliner = createAlwaysInlinerLegacyPass(); else if (OptLevelOs || OptLevelO2) - Builder.Inliner = createFunctionInliningPass(2, OptLevelOs ? 1 : 0); + Builder.Inliner = createFunctionInliningPass( + 2, OptLevelOs ? 1 : 0, false); else Builder.Inliner = createFunctionInliningPass(275); Builder.populateFunctionPassManager(PM); diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index e61bc915bf8..48eda15bd1e 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -268,7 +268,7 @@ static void AddOptimizationPasses(legacy::PassManagerBase &MPM, if (DisableInline) { // No inlining pass } else if (OptLevel > 1) { - Builder.Inliner = createFunctionInliningPass(OptLevel, SizeLevel); + Builder.Inliner = createFunctionInliningPass(OptLevel, SizeLevel, false); } else { Builder.Inliner = createAlwaysInlinerLegacyPass(); } -- 2.40.0