[PATCH] D109102: [CSSPGO] Allow inlining recursive call for preinliner
Wenlei He via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 1 15:44:43 PDT 2021
wenlei created this revision.
Herald added subscribers: ormris, hoy, modimo, lxfind, haicheng, hiraditya, eraman.
wenlei requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D109102
Files:
llvm/include/llvm/Analysis/InlineCost.h
llvm/lib/Analysis/InlineCost.cpp
llvm/lib/Transforms/IPO/SampleProfile.cpp
Index: llvm/lib/Transforms/IPO/SampleProfile.cpp
===================================================================
--- llvm/lib/Transforms/IPO/SampleProfile.cpp
+++ llvm/lib/Transforms/IPO/SampleProfile.cpp
@@ -1283,7 +1283,11 @@
assert(Callee && "Expect a definition for inline candidate of direct call");
InlineParams Params = getInlineParams();
+ // We will ignore the threshold from inline cost, so always get full cost.
Params.ComputeFullInlineCost = true;
+ // If preinline decision is used we want to allow inline recursive call.
+ // TODO: Evaluate if this is helpful for AutoFDO too in general.
+ Params.AllowRecursiveCall = ProfileIsCS && UsePreInlinerDecision;
// Checks if there is anything in the reachable portion of the callee at
// this callsite that makes this inlining potentially illegal. Need to
// set ComputeFullInlineCost, otherwise getInlineCost may return early
Index: llvm/lib/Analysis/InlineCost.cpp
===================================================================
--- llvm/lib/Analysis/InlineCost.cpp
+++ llvm/lib/Analysis/InlineCost.cpp
@@ -333,6 +333,10 @@
/// whenever we simplify away the stores that would otherwise cause them to be
/// loads.
bool EnableLoadElimination;
+
+ /// Whether we allow inlining for recursive call.
+ bool AllowRecursiveCall;
+
SmallPtrSet<Value *, 16> LoadAddrSet;
AllocaInst *getSROAArgForValueOrNull(Value *V) const {
@@ -421,7 +425,8 @@
OptimizationRemarkEmitter *ORE = nullptr)
: TTI(TTI), GetAssumptionCache(GetAssumptionCache), GetBFI(GetBFI),
PSI(PSI), F(Callee), DL(F.getParent()->getDataLayout()), ORE(ORE),
- CandidateCall(Call), EnableLoadElimination(true) {}
+ CandidateCall(Call), EnableLoadElimination(true),
+ AllowRecursiveCall(false) {}
InlineResult analyze();
@@ -930,7 +935,9 @@
Params(Params), Threshold(Params.DefaultThreshold),
BoostIndirectCalls(BoostIndirect), IgnoreThreshold(IgnoreThreshold),
CostBenefitAnalysisEnabled(isCostBenefitAnalysisEnabled()),
- Writer(this) {}
+ Writer(this) {
+ AllowRecursiveCall = Params.AllowRecursiveCall.getValue();
+ }
/// Annotation Writer for instruction details
InlineCostAnnotationWriter Writer;
@@ -2098,7 +2105,8 @@
// This flag will fully abort the analysis, so don't bother with anything
// else.
IsRecursiveCall = true;
- return false;
+ if (!AllowRecursiveCall)
+ return false;
}
if (TTI.isLoweredToCall(F)) {
@@ -2336,7 +2344,7 @@
using namespace ore;
// If the visit this instruction detected an uninlinable pattern, abort.
InlineResult IR = InlineResult::success();
- if (IsRecursiveCall)
+ if (IsRecursiveCall && !AllowRecursiveCall)
IR = InlineResult::failure("recursive");
else if (ExposesReturnsTwice)
IR = InlineResult::failure("exposes returns twice");
Index: llvm/include/llvm/Analysis/InlineCost.h
===================================================================
--- llvm/include/llvm/Analysis/InlineCost.h
+++ llvm/include/llvm/Analysis/InlineCost.h
@@ -213,6 +213,9 @@
/// Indicate whether we should allow inline deferral.
Optional<bool> EnableDeferral = true;
+
+ /// Indicate whether we allow inlining for recursive call.
+ Optional<bool> AllowRecursiveCall = false;
};
/// Generate the parameters to tune the inline cost analysis based only on the
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D109102.370090.patch
Type: text/x-patch
Size: 3447 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210901/295dfa88/attachment.bin>
More information about the llvm-commits
mailing list