svn commit: r242393 - stable/9/contrib/llvm/lib/Analysis

Dimitry Andric dim at FreeBSD.org
Wed Oct 31 07:57:50 UTC 2012


Author: dim
Date: Wed Oct 31 07:57:49 2012
New Revision: 242393
URL: http://svn.freebsd.org/changeset/base/242393

Log:
  MFC r242007:
  
  Pull in r165367 from upstream llvm trunk:
  
    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 should fix the link errors that were reported when atf-run was
  compiled with clang -stdlib=libc++.  In this case, at -O3 optimization,
  some calls to basic_ios::clear() were not inlined, even when the
  function was marked __always_inline__.
  
  Reported by:	Jan Beich <jbeich at tormail.org>

Modified:
  stable/9/contrib/llvm/lib/Analysis/InlineCost.cpp
Directory Properties:
  stable/9/contrib/llvm/   (props changed)

Modified: stable/9/contrib/llvm/lib/Analysis/InlineCost.cpp
==============================================================================
--- stable/9/contrib/llvm/lib/Analysis/InlineCost.cpp	Wed Oct 31 06:35:50 2012	(r242392)
+++ stable/9/contrib/llvm/lib/Analysis/InlineCost.cpp	Wed Oct 31 07:57:49 2012	(r242393)
@@ -138,6 +138,7 @@ public:
 
   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.
@@ -1015,7 +1016,8 @@ InlineCost InlineCostAnalyzer::getInline
   // 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());


More information about the svn-src-stable-9 mailing list