aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/InlineCost.cpp
diff options
context:
space:
mode:
authorPhilipp Krones <philipp.krones@embecosm.com>2021-07-14 12:21:40 +0100
committerSimon Cook <simon.cook@embecosm.com>2021-07-26 12:07:49 +0100
commit46c03668774c27877bd96957931fafae24383e3f (patch)
treee22ea5e686cb8ee518cd05fd15cee4a7c3b16299 /llvm/lib/Analysis/InlineCost.cpp
parentd995d63767624a60a5d3276f9f16d7b995435af1 (diff)
downloadllvm-46c03668774c27877bd96957931fafae24383e3f.zip
llvm-46c03668774c27877bd96957931fafae24383e3f.tar.gz
llvm-46c03668774c27877bd96957931fafae24383e3f.tar.bz2
[Inliner] Make the CallPenalty configurable
Tests with multiple benchmarks, like Embench [1], showed that the CallPenalty magic number has the most influence on inlining decisions when optimizing for size. On the other hand, there was no good default value for this parameter. Some benchmarks profited strongly from a reduced call penalty. On example is the picojpeg benchmark compiled for RISC-V, which got 6% smaller with a CallPenalty of 10 instead of 12. Other benchmarks increased in size, like matmult. This commit makes the compromise of turning the magic number constant of CallPenalty into a configurable value. This introduces the flag `--inline-call-penalty`. With that flag users can fine tune the inliner to their needs. The CallPenalty constant was also used for loops. This commit replaces the CallPenalty constant with a new LoopPenalty constant that is now used instead. This is a slimmed down version of https://reviews.llvm.org/D30899 [1]: https://github.com/embench/embench-iot Differential Revision: https://reviews.llvm.org/D105976
Diffstat (limited to 'llvm/lib/Analysis/InlineCost.cpp')
-rw-r--r--llvm/lib/Analysis/InlineCost.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/llvm/lib/Analysis/InlineCost.cpp b/llvm/lib/Analysis/InlineCost.cpp
index 030bfc1..4c2413e 100644
--- a/llvm/lib/Analysis/InlineCost.cpp
+++ b/llvm/lib/Analysis/InlineCost.cpp
@@ -113,6 +113,10 @@ static cl::opt<int> HotCallSiteRelFreq(
"entry frequency, for a callsite to be hot in the absence of "
"profile information."));
+static cl::opt<int> CallPenalty(
+ "inline-call-penalty", cl::Hidden, cl::init(25),
+ cl::desc("Call penalty that is applied per callsite when inlining"));
+
static cl::opt<bool> OptComputeFullInlineCost(
"inline-cost-full", cl::Hidden, cl::init(false), cl::ZeroOrMore,
cl::desc("Compute the full inline cost of a call site even when the cost "
@@ -554,7 +558,7 @@ class InlineCostCallAnalyzer final : public CallAnalyzer {
addCost(LoadEliminationCost);
LoadEliminationCost = 0;
}
- void onCallPenalty() override { addCost(InlineConstants::CallPenalty); }
+ void onCallPenalty() override { addCost(CallPenalty); }
void onCallArgumentSetup(const CallBase &Call) override {
// Pay the price of the argument setup. We account for the average 1
// instruction per call argument setup here.
@@ -589,7 +593,7 @@ class InlineCostCallAnalyzer final : public CallAnalyzer {
}
} else
// Otherwise simply add the cost for merely making the call.
- addCost(InlineConstants::CallPenalty);
+ addCost(CallPenalty);
}
void onFinalizeSwitch(unsigned JumpTableSize,
@@ -832,7 +836,7 @@ class InlineCostCallAnalyzer final : public CallAnalyzer {
continue;
NumLoops++;
}
- addCost(NumLoops * InlineConstants::CallPenalty);
+ addCost(NumLoops * InlineConstants::LoopPenalty);
}
// We applied the maximum possible vector bonus at the beginning. Now,
@@ -993,8 +997,7 @@ private:
}
void onCallPenalty() override {
- increment(InlineCostFeatureIndex::CallPenalty,
- InlineConstants::CallPenalty);
+ increment(InlineCostFeatureIndex::CallPenalty, CallPenalty);
}
void onCallArgumentSetup(const CallBase &Call) override {
@@ -1092,7 +1095,7 @@ private:
if (DeadBlocks.count(L->getHeader()))
continue;
increment(InlineCostFeatureIndex::NumLoops,
- InlineConstants::CallPenalty);
+ InlineConstants::LoopPenalty);
}
}
set(InlineCostFeatureIndex::DeadBlocks, DeadBlocks.size());
@@ -2679,7 +2682,7 @@ int llvm::getCallsiteCost(CallBase &Call, const DataLayout &DL) {
}
}
// The call instruction also disappears after inlining.
- Cost += InlineConstants::InstrCost + InlineConstants::CallPenalty;
+ Cost += InlineConstants::InstrCost + CallPenalty;
return Cost;
}