[PATCH] D34919: [Inliner] Optimize shouldBeDeferred
Easwaran Raman via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 4 14:37:28 PST 2019
eraman updated this revision to Diff 180327.
eraman added a comment.
Fix variable naming.
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D34919/new/
https://reviews.llvm.org/D34919
Files:
lib/Transforms/IPO/Inliner.cpp
Index: lib/Transforms/IPO/Inliner.cpp
===================================================================
--- lib/Transforms/IPO/Inliner.cpp
+++ lib/Transforms/IPO/Inliner.cpp
@@ -311,6 +311,11 @@
// For now we only handle local or inline functions.
if (!Caller->hasLocalLinkage() && !Caller->hasLinkOnceODRLinkage())
return false;
+ // If the cost of inlining CS is non-positive, it is not going to prevent the
+ // caller from being inlined into its callers and hence we don't need to
+ // defer.
+ if (IC.getCost() <= 0)
+ return false;
// Try to detect the case where the current inlining candidate caller (call
// it B) is a static or linkonce-ODR function and is an inlining candidate
// elsewhere, and the current candidate callee (call it C) is large enough
@@ -330,25 +335,31 @@
TotalSecondaryCost = 0;
// The candidate cost to be imposed upon the current function.
int CandidateCost = IC.getCost() - 1;
- // This bool tracks what happens if we do NOT inline C into B.
- bool callerWillBeRemoved = Caller->hasLocalLinkage();
+ // If the caller has local linkage and can be inlined to all its callers, we
+ // can apply a huge negative bonus to TotalSecondaryCost.
+ bool ApplyLastCallBonus = Caller->hasLocalLinkage() && !Caller->hasOneUse();
// This bool tracks what happens if we DO inline C into B.
bool inliningPreventsSomeOuterInline = false;
for (User *U : Caller->users()) {
+ // If the caller will not be removed (either because it does not have a
+ // local linkage or because the LastCallToStaticBonus has been already
+ // applied), then we can exit the loop early.
+ if (!ApplyLastCallBonus && TotalSecondaryCost >= IC.getCost())
+ return false;
CallSite CS2(U);
// If this isn't a call to Caller (it could be some other sort
// of reference) skip it. Such references will prevent the caller
// from being removed.
if (!CS2 || CS2.getCalledFunction() != Caller) {
- callerWillBeRemoved = false;
+ ApplyLastCallBonus = false;
continue;
}
InlineCost IC2 = GetInlineCost(CS2);
++NumCallerCallersAnalyzed;
if (!IC2) {
- callerWillBeRemoved = false;
+ ApplyLastCallBonus = false;
continue;
}
if (IC2.isAlways())
@@ -366,7 +377,7 @@
// one is set very low by getInlineCost, in anticipation that Caller will
// be removed entirely. We did not account for this above unless there
// is only one caller of Caller.
- if (callerWillBeRemoved && !Caller->hasOneUse())
+ if (ApplyLastCallBonus)
TotalSecondaryCost -= InlineConstants::LastCallToStaticBonus;
if (inliningPreventsSomeOuterInline && TotalSecondaryCost < IC.getCost())
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D34919.180327.patch
Type: text/x-patch
Size: 2722 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190104/a6aec654/attachment.bin>
More information about the llvm-commits
mailing list