[llvm] r350456 - [Inliner] Optimize shouldBeDeferred

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Sun Jan 6 21:56:33 PST 2019


Could you add a test case for the negative cost situation you mentioned in
the commit description?

On Sat, Jan 5, 2019 at 1:30 PM Easwaran Raman via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: eraman
> Date: Fri Jan  4 18:26:29 2019
> New Revision: 350456
>
> URL: http://llvm.org/viewvc/llvm-project?rev=350456&view=rev
> Log:
> [Inliner] Optimize shouldBeDeferred
>
> This has some minor optimizations to shouldBeDeferred. This is not
> strictly NFC because the early exit inside the loop assumes
> TotalSecondaryCost is monotonically non-decreasing, which is not true if
> the threshold used by CostAnalyzer is negative. AFAICT the thresholds do
> not go below 0 for the default values of the various options we use.
>
> Modified:
>     llvm/trunk/lib/Transforms/IPO/Inliner.cpp
>
> Modified: llvm/trunk/lib/Transforms/IPO/Inliner.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/Inliner.cpp?rev=350456&r1=350455&r2=350456&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/Inliner.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/Inliner.cpp Fri Jan  4 18:26:29 2019
> @@ -311,6 +311,11 @@ shouldBeDeferred(Function *Caller, CallS
>    // 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 @@ shouldBeDeferred(Function *Caller, CallS
>    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 @@ shouldBeDeferred(Function *Caller, CallS
>    // 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())
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190107/99e27f28/attachment.html>


More information about the llvm-commits mailing list