[llvm-commits] [llvm] r165367 - /llvm/trunk/lib/Analysis/InlineCost.cpp

Chandler Carruth chandlerc at google.com
Sat Oct 6 19:02:05 PDT 2012


On Sat, Oct 6, 2012 at 6:11 PM, Bob Wilson <bob.wilson at apple.com> wrote:

> Author: bwilson
> Date: Sat Oct  6 20:11:19 2012
> New Revision: 165367
>
> URL: http://llvm.org/viewvc/llvm-project?rev=165367&view=rev
> Log:
> Make sure always-inline functions get inlined. <rdar://problem/12423986>
>
> Without this change, when the estimated cost for inlining a function with
> an "alwaysinline" attribute was lower than the inlining threshold, the
> getInlineCost function was returning that estimated cost rather than the
> special InlineCost::AlwaysInlineCost value. That is fine in the normal
> inlining case, but it can fail when the inliner considers the opportunity
> cost of inlining into an internal or linkonce-odr function. It may decide
> not to inline the always-inline function in that case. The fix here is just
> to make getInlineCost always return the special value for always-inline
> functions. I ran into this building clang with libc++. Tablegen failed to
> link because of an always-inline function that was not inlined. I have been
> unable to reduce the testcase down to a reasonable size.
>

This is a bit of a hack though, and it makes the rest of the inline cost
analysis not make very much sense. If we're never going to even use the
estimated cost when there is an always-inline attribute, why are we
computing it? I never liked the way always inline was handled here, and it
feels like this is a band-aid over the real symptom.

What do you think about instead having the pass manager run the
always-inliner pass much earlier in the compilation? That's what we do for
-O0, and I feel like all of InlineCost would be simpler if we could assert
that it never runs for functions attributed as always-inline.


>
> Modified:
>     llvm/trunk/lib/Analysis/InlineCost.cpp
>
> Modified: llvm/trunk/lib/Analysis/InlineCost.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InlineCost.cpp?rev=165367&r1=165366&r2=165367&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Analysis/InlineCost.cpp (original)
> +++ llvm/trunk/lib/Analysis/InlineCost.cpp Sat Oct  6 20:11:19 2012
> @@ -142,6 +142,7 @@
>
>    int getThreshold() { return Threshold; }
>    int getCost() { return Cost; }
> +  bool isAlwaysInline() { return AlwaysInline; }
>
>    // Keep a bunch of stats about the cost savings found so we can print
> them
>    // out when debugging.
> @@ -1057,7 +1058,8 @@
>    // Check if there was a reason to force inlining or no inlining.
>    if (!ShouldInline && CA.getCost() < CA.getThreshold())
>      return InlineCost::getNever();
> -  if (ShouldInline && CA.getCost() >= CA.getThreshold())
> +  if (ShouldInline && (CA.isAlwaysInline() ||
> +                       CA.getCost() >= CA.getThreshold()))
>      return InlineCost::getAlways();
>
>    return llvm::InlineCost::get(CA.getCost(), CA.getThreshold());
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20121006/a502778e/attachment.html>


More information about the llvm-commits mailing list