[llvm] r268107 - [inliner]: Refactor inline deferring logic into its own method /NFC
Pete Cooper via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 29 14:42:53 PDT 2016
Hey David
Looks like this broke the bot (http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_build/23731/console):
/Users/buildslave/jenkins/sharedspace/incremental at 2/llvm/lib/Transforms/IPO/Inliner.cpp:334:42: error: use of undeclared identifier 'TotalSecondaryCost'
<< ", outer Cost = " << TotalSecondaryCost << '\n');
Mind taking a look?
Thanks,
Pete
> On Apr 29, 2016, at 2:21 PM, Xinliang David Li via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
> Author: davidxl
> Date: Fri Apr 29 16:21:44 2016
> New Revision: 268107
>
> URL: http://llvm.org/viewvc/llvm-project?rev=268107&view=rev
> Log:
> [inliner]: Refactor inline deferring logic into its own method /NFC
>
> The implemented heuristic has a large body of code which better sits
> in its own function for better readability. It also allows adding more
> heuristics easier in the future.
>
> Modified:
> llvm/trunk/include/llvm/Transforms/IPO/InlinerPass.h
> llvm/trunk/lib/Transforms/IPO/Inliner.cpp
>
> Modified: llvm/trunk/include/llvm/Transforms/IPO/InlinerPass.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/IPO/InlinerPass.h?rev=268107&r1=268106&r2=268107&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/IPO/InlinerPass.h (original)
> +++ llvm/trunk/include/llvm/Transforms/IPO/InlinerPass.h Fri Apr 29 16:21:44 2016
> @@ -69,6 +69,10 @@ private:
> /// shouldInline - Return true if the inliner should attempt to
> /// inline at the given CallSite.
> bool shouldInline(CallSite CS);
> + /// Return true if inlining of CS can block the caller from being
> + /// inlined which is proved to be more beneficial. \p IC is the
> + /// estimated inline cost associated with callsite \p CS.
> + bool shouldBeDeferred(Function *Caller, CallSite CS, InlineCost IC);
>
> protected:
> AssumptionCacheTracker *ACT;
>
> Modified: llvm/trunk/lib/Transforms/IPO/Inliner.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/Inliner.cpp?rev=268107&r1=268106&r2=268107&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/Inliner.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/Inliner.cpp Fri Apr 29 16:21:44 2016
> @@ -227,6 +227,75 @@ static void emitAnalysis(CallSite CS, co
> emitOptimizationRemarkAnalysis(Ctx, DEBUG_TYPE, *Caller, DLoc, Msg);
> }
>
> +bool Inliner::shouldBeDeferred(Function *Caller, CallSite CS, InlineCost IC) {
> +
> + // For now we only handle local or inline functions.
> + if (!Caller->hasLocalLinkage() && !Caller->hasLinkOnceODRLinkage())
> + 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
> + // that inlining it into B would make B too big to inline later. In these
> + // circumstances it may be best not to inline C into B, but to inline B into
> + // its callers.
> + //
> + // This only applies to static and linkonce-ODR functions because those are
> + // expected to be available for inlining in the translation units where they
> + // are used. Thus we will always have the opportunity to make local inlining
> + // decisions. Importantly the linkonce-ODR linkage covers inline functions
> + // and templates in C++.
> + //
> + // FIXME: All of this logic should be sunk into getInlineCost. It relies on
> + // the internal implementation of the inline cost metrics rather than
> + // treating them as truly abstract units etc.
> + int TotalSecondaryCost = 0;
> + // The candidate cost to be imposed upon the current function.
> + int CandidateCost = IC.getCost() - (InlineConstants::CallPenalty + 1);
> + // This bool tracks what happens if we do NOT inline C into B.
> + bool callerWillBeRemoved = Caller->hasLocalLinkage();
> + // This bool tracks what happens if we DO inline C into B.
> + bool inliningPreventsSomeOuterInline = false;
> + for (User *U : Caller->users()) {
> + 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;
> + continue;
> + }
> +
> + InlineCost IC2 = getInlineCost(CS2);
> + ++NumCallerCallersAnalyzed;
> + if (!IC2) {
> + callerWillBeRemoved = false;
> + continue;
> + }
> + if (IC2.isAlways())
> + continue;
> +
> + // See if inlining or original callsite would erase the cost delta of
> + // this callsite. We subtract off the penalty for the call instruction,
> + // which we would be deleting.
> + if (IC2.getCostDelta() <= CandidateCost) {
> + inliningPreventsSomeOuterInline = true;
> + TotalSecondaryCost += IC2.getCost();
> + }
> + }
> + // If all outer calls to Caller would get inlined, the cost for the last
> + // 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->use_empty())
> + TotalSecondaryCost += InlineConstants::LastCallToStaticBonus;
> +
> + if (inliningPreventsSomeOuterInline && TotalSecondaryCost < IC.getCost())
> + return true;
> +
> + return false;
> +}
> +
> /// Return true if the inliner should attempt to inline at the given CallSite.
> bool Inliner::shouldInline(CallSite CS) {
> InlineCost IC = getInlineCost(CS);
> @@ -258,77 +327,16 @@ bool Inliner::shouldInline(CallSite CS)
> Twine(IC.getCostDelta() + IC.getCost()) + ")");
> 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
> - // that inlining it into B would make B too big to inline later. In these
> - // circumstances it may be best not to inline C into B, but to inline B into
> - // its callers.
> - //
> - // This only applies to static and linkonce-ODR functions because those are
> - // expected to be available for inlining in the translation units where they
> - // are used. Thus we will always have the opportunity to make local inlining
> - // decisions. Importantly the linkonce-ODR linkage covers inline functions
> - // and templates in C++.
> - //
> - // FIXME: All of this logic should be sunk into getInlineCost. It relies on
> - // the internal implementation of the inline cost metrics rather than
> - // treating them as truly abstract units etc.
> - if (Caller->hasLocalLinkage() || Caller->hasLinkOnceODRLinkage()) {
> - int TotalSecondaryCost = 0;
> - // The candidate cost to be imposed upon the current function.
> - int CandidateCost = IC.getCost() - (InlineConstants::CallPenalty + 1);
> - // This bool tracks what happens if we do NOT inline C into B.
> - bool callerWillBeRemoved = Caller->hasLocalLinkage();
> - // This bool tracks what happens if we DO inline C into B.
> - bool inliningPreventsSomeOuterInline = false;
> - for (User *U : Caller->users()) {
> - 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;
> - continue;
> - }
> -
> - InlineCost IC2 = getInlineCost(CS2);
> - ++NumCallerCallersAnalyzed;
> - if (!IC2) {
> - callerWillBeRemoved = false;
> - continue;
> - }
> - if (IC2.isAlways())
> - continue;
> -
> - // See if inlining or original callsite would erase the cost delta of
> - // this callsite. We subtract off the penalty for the call instruction,
> - // which we would be deleting.
> - if (IC2.getCostDelta() <= CandidateCost) {
> - inliningPreventsSomeOuterInline = true;
> - TotalSecondaryCost += IC2.getCost();
> - }
> - }
> - // If all outer calls to Caller would get inlined, the cost for the last
> - // 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->use_empty())
> - TotalSecondaryCost += InlineConstants::LastCallToStaticBonus;
> -
> - if (inliningPreventsSomeOuterInline && TotalSecondaryCost < IC.getCost()) {
> - DEBUG(dbgs() << " NOT Inlining: " << *CS.getInstruction() <<
> - " Cost = " << IC.getCost() <<
> - ", outer Cost = " << TotalSecondaryCost << '\n');
> - emitAnalysis(
> - CS, Twine("Not inlining. Cost of inlining " +
> - CS.getCalledFunction()->getName() +
> - " increases the cost of inlining " +
> - CS.getCaller()->getName() + " in other contexts"));
> - return false;
> - }
> +
> + if (shouldBeDeferred(Caller, CS, IC)) {
> + DEBUG(dbgs() << " NOT Inlining: " << *CS.getInstruction()
> + << " Cost = " << IC.getCost()
> + << ", outer Cost = " << TotalSecondaryCost << '\n');
> + emitAnalysis(CS, Twine("Not inlining. Cost of inlining " +
> + CS.getCalledFunction()->getName() +
> + " increases the cost of inlining " +
> + CS.getCaller()->getName() + " in other contexts"));
> + return false;
> }
>
> DEBUG(dbgs() << " Inlining: cost=" << 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/20160429/a3f4218a/attachment.html>
More information about the llvm-commits
mailing list