[llvm] r350456 - [Inliner] Optimize shouldBeDeferred

Easwaran Raman via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 9 11:34:50 PST 2019


r350751 adds an assert that the threshold cannot be negative. With this
change,  the commit description no longer applies.

On Sun, Jan 6, 2019 at 9:56 PM David Blaikie <dblaikie at gmail.com> wrote:

> 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/20190109/131bf50d/attachment.html>


More information about the llvm-commits mailing list