[PATCH] D78730: [llvm][NFC] Add an explicit 'ComputeFullInlineCost' API
Mircea Trofin via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 24 12:26:45 PDT 2020
mtrofin updated this revision to Diff 259959.
mtrofin added a comment.
comments
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D78730/new/
https://reviews.llvm.org/D78730
Files:
llvm/include/llvm/Analysis/InlineCost.h
llvm/lib/Analysis/InlineCost.cpp
Index: llvm/lib/Analysis/InlineCost.cpp
===================================================================
--- llvm/lib/Analysis/InlineCost.cpp
+++ llvm/lib/Analysis/InlineCost.cpp
@@ -407,7 +407,8 @@
/// FIXME: if it is necessary to derive from InlineCostCallAnalyzer, note
/// the FIXME in onLoweredCall, when instantiating an InlineCostCallAnalyzer
-class InlineCostCallAnalyzer final : public CallAnalyzer {
+class InlineCostCallAnalyzer : public CallAnalyzer {
+protected:
const int CostUpperBound = INT_MAX - InlineConstants::InstrCost - 1;
const bool ComputeFullInlineCost;
int LoadEliminationCost = 0;
@@ -710,6 +711,60 @@
int getThreshold() { return Threshold; }
int getCost() { return Cost; }
};
+
+/// Calculate inline cost irrespective of thresholds.
+class CompleteInlineCostAnalyzer final : public InlineCostCallAnalyzer {
+public:
+ CompleteInlineCostAnalyzer(
+ const TargetTransformInfo &TTI,
+ std::function<AssumptionCache &(Function &)> &GetAssumptionCache,
+ Optional<function_ref<BlockFrequencyInfo &(Function &)>> &GetBFI,
+ ProfileSummaryInfo *PSI, OptimizationRemarkEmitter *ORE, Function &Callee,
+ CallBase &Call,
+ const InlineParams Params = {/* DefaultThreshold*/ 0,
+ /*HintThreshold*/ {},
+ /*ColdThreshold*/ {},
+ /*OptSizeThreshold*/ {},
+ /*OptMinSizeThreshold*/ {},
+ /*HotCallSiteThreshold*/ {},
+ /*LocallyHotCallSiteThreshold*/ {},
+ /*ColdCallSiteThreshold*/ {},
+ /* ComputeFullInlineCost*/ true},
+ bool BoostIndirect = true)
+ : InlineCostCallAnalyzer(TTI, GetAssumptionCache, GetBFI, PSI, ORE,
+ Callee, Call, Params, BoostIndirect) {}
+
+ // Ignore parent's result, and just return success.
+ InlineResult finalizeAnalysis() override {
+ InlineCostCallAnalyzer::finalizeAnalysis();
+ return InlineResult::success();
+ }
+
+ bool shouldStop() override { return false; }
+
+ // Same as parent's onLoweredCall, just that it uses itself internally. Not
+ // worth doing something more elegant, because this implementation will go
+ // away.
+ void onLoweredCall(Function *F, CallBase &Call,
+ bool IsIndirectCall) override {
+ addCost(Call.arg_size() * InlineConstants::InstrCost);
+
+ if (IsIndirectCall && BoostIndirectCalls) {
+ auto IndirectCallParams = Params;
+ IndirectCallParams.DefaultThreshold =
+ InlineConstants::IndirectCallThreshold;
+ CompleteInlineCostAnalyzer CA(TTI, GetAssumptionCache, GetBFI, PSI, ORE,
+ *F, Call, IndirectCallParams, false);
+ if (CA.analyze().isSuccess()) {
+ // We were able to inline the indirect call! Subtract the cost from the
+ // threshold to get the bonus we want to apply, but don't go below zero.
+ Cost -= std::max(0, CA.getThreshold() - CA.getCost());
+ }
+ } else
+ // Otherwise simply add the cost for merely making the call.
+ addCost(InlineConstants::CallPenalty);
+ }
+};
} // namespace
/// Test whether the given value is an Alloca-derived function argument.
Index: llvm/include/llvm/Analysis/InlineCost.h
===================================================================
--- llvm/include/llvm/Analysis/InlineCost.h
+++ llvm/include/llvm/Analysis/InlineCost.h
@@ -246,6 +246,20 @@
CallBase &Call, Function *Callee, TargetTransformInfo &CalleeTTI,
function_ref<const TargetLibraryInfo &(Function &)> GetTLI);
+/// Get the cost estimate ignoring thresholds. This is similar to getInlineCost
+/// when passed InlineParams::ComputeFullInlineCost, or a non-null ORE. It
+/// uses default InlineParams otherwise.
+/// Contrary to getInlineCost, which makes a threshold-based final evaluation of
+/// should/shouldn't inline, captured in InlineResult, getInliningCostEstimate
+/// returns:
+/// - None, if the inlining cannot happen (is illegal)
+/// - an integer, representing the cost.
+Optional<int> getInliningCostEstimate(
+ CallBase &Call, TargetTransformInfo &CalleeTTI,
+ std::function<AssumptionCache &(Function &)> &GetAssumptionCache,
+ Optional<function_ref<BlockFrequencyInfo &(Function &)>> GetBFI,
+ ProfileSummaryInfo *PSI, OptimizationRemarkEmitter *ORE);
+
/// Minimal filter to detect invalid constructs for inlining.
InlineResult isInlineViable(Function &Callee);
} // namespace llvm
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D78730.259959.patch
Type: text/x-patch
Size: 4636 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200424/73311054/attachment-0001.bin>
More information about the llvm-commits
mailing list