[llvm-commits] [llvm] r95466 - in /llvm/trunk: bindings/ocaml/llvm/llvm.ml bindings/ocaml/llvm/llvm.mli docs/LangRef.html include/llvm-c/Core.h include/llvm/Attributes.h include/llvm/Transforms/IPO/InlinerPass.h lib/AsmParser/LLLexer.cpp lib/AsmParser/LLParser.cpp lib/AsmParser/LLToken.h lib/Target/CppBackend/CPPBackend.cpp lib/Transforms/IPO/Inliner.cpp lib/VMCore/Attributes.cpp utils/llvm.grm utils/vim/llvm.vim

Evan Cheng evan.cheng at apple.com
Sat Feb 6 01:08:30 PST 2010


On Feb 5, 2010, at 10:45 PM, Nick Lewycky wrote:

> 
> Jakob, it sounds like this is actually experimental. Assuming you don't 
> make any progress between now and the time the branch is created, should 
> this patch be backed out of the 2.7 release? Realize that if we don't, 
> we're stuck with a bit allocated to the InlineHint function attr in the 
> bitcode until 3.x.

We expect the bit will stay regardless of the result of tuning. The questions are 1) how much should the hint matter, and 2) whether it only matters for C or C++ as well.

Evan

> 
> Nick
> 
> Jakob Stoklund Olesen wrote:
>> Author: stoklund
>> Date: Fri Feb  5 19:16:28 2010
>> New Revision: 95466
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=95466&view=rev
>> Log:
>> Reintroduce the InlineHint function attribute.
>> 
>> This time it's for real! I am going to hook this up in the frontends as well.
>> 
>> The inliner has some experimental heuristics for dealing with the inline hint.
>> When given a -respect-inlinehint option, functions marked with the inline
>> keyword are given a threshold just above the default for -O3.
>> 
>> We need some experiments to determine if that is the right thing to do.
>> 
>> Modified:
>>     llvm/trunk/bindings/ocaml/llvm/llvm.ml
>>     llvm/trunk/bindings/ocaml/llvm/llvm.mli
>>     llvm/trunk/docs/LangRef.html
>>     llvm/trunk/include/llvm-c/Core.h
>>     llvm/trunk/include/llvm/Attributes.h
>>     llvm/trunk/include/llvm/Transforms/IPO/InlinerPass.h
>>     llvm/trunk/lib/AsmParser/LLLexer.cpp
>>     llvm/trunk/lib/AsmParser/LLParser.cpp
>>     llvm/trunk/lib/AsmParser/LLToken.h
>>     llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp
>>     llvm/trunk/lib/Transforms/IPO/Inliner.cpp
>>     llvm/trunk/lib/VMCore/Attributes.cpp
>>     llvm/trunk/utils/llvm.grm
>>     llvm/trunk/utils/vim/llvm.vim
>> 
>> Modified: llvm/trunk/bindings/ocaml/llvm/llvm.ml
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/llvm/llvm.ml?rev=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/bindings/ocaml/llvm/llvm.ml (original)
>> +++ llvm/trunk/bindings/ocaml/llvm/llvm.ml Fri Feb  5 19:16:28 2010
>> @@ -93,6 +93,7 @@
>>    | Noredzone
>>    | Noimplicitfloat
>>    | Naked
>> +  | Inlinehint
>>  end
>> 
>>  module Icmp = struct
>> 
>> Modified: llvm/trunk/bindings/ocaml/llvm/llvm.mli
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/llvm/llvm.mli?rev=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/bindings/ocaml/llvm/llvm.mli (original)
>> +++ llvm/trunk/bindings/ocaml/llvm/llvm.mli Fri Feb  5 19:16:28 2010
>> @@ -143,6 +143,7 @@
>>    | Noredzone
>>    | Noimplicitfloat
>>    | Naked
>> +  | Inlinehint
>>  end
>> 
>>  (** The predicate for an integer comparison ([icmp]) instruction.
>> 
>> Modified: llvm/trunk/docs/LangRef.html
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.html?rev=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/docs/LangRef.html (original)
>> +++ llvm/trunk/docs/LangRef.html Fri Feb  5 19:16:28 2010
>> @@ -1083,6 +1083,11 @@
>>        function into callers whenever possible, ignoring any active inlining size
>>        threshold for this caller.</dd>
>> 
>> +<dt><tt><b>inlinehint</b></tt></dt>
>> +<dd>This attribute indicates that the source code contained a hint that inlining
>> +      this function is desirable (such as the "inline" keyword in C/C++).  It
>> +      is just a hint; it imposes no requirements on the inliner.</dd>
>> +
>>    <dt><tt><b>noinline</b></tt></dt>
>>    <dd>This attribute indicates that the inliner should never inline this
>>        function in any situation. This attribute may not be used together with
>> 
>> Modified: llvm/trunk/include/llvm-c/Core.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Core.h?rev=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/include/llvm-c/Core.h (original)
>> +++ llvm/trunk/include/llvm-c/Core.h Fri Feb  5 19:16:28 2010
>> @@ -118,7 +118,8 @@
>>      LLVMNoCaptureAttribute  = 1<<21,
>>      LLVMNoRedZoneAttribute  = 1<<22,
>>      LLVMNoImplicitFloatAttribute = 1<<23,
>> -    LLVMNakedAttribute      = 1<<24
>> +    LLVMNakedAttribute      = 1<<24,
>> +    LLVMInlineHintAttribute = 1<<25
>>  } LLVMAttribute;
>> 
>>  typedef enum {
>> 
>> Modified: llvm/trunk/include/llvm/Attributes.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Attributes.h?rev=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Attributes.h (original)
>> +++ llvm/trunk/include/llvm/Attributes.h Fri Feb  5 19:16:28 2010
>> @@ -58,6 +58,8 @@
>>  const Attributes NoImplicitFloat = 1<<23; /// disable implicit floating point
>>                                            /// instructions.
>>  const Attributes Naked           = 1<<24; ///<  Naked function
>> +const Attributes InlineHint      = 1<<25; ///<  source said inlining was
>> +                                          ///desirable
>> 
>>  /// @brief Attributes that only apply to function parameters.
>>  const Attributes ParameterOnly = ByVal | Nest | StructRet | NoCapture;
>> @@ -66,7 +68,7 @@
>>  /// be used on return values or function parameters.
>>  const Attributes FunctionOnly = NoReturn | NoUnwind | ReadNone | ReadOnly |
>>    NoInline | AlwaysInline | OptimizeForSize | StackProtect | StackProtectReq |
>> -  NoRedZone | NoImplicitFloat | Naked;
>> +  NoRedZone | NoImplicitFloat | Naked | InlineHint;
>> 
>>  /// @brief Parameter attributes that do not apply to vararg call arguments.
>>  const Attributes VarArgsIncompatible = StructRet;
>> 
>> 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=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Transforms/IPO/InlinerPass.h (original)
>> +++ llvm/trunk/include/llvm/Transforms/IPO/InlinerPass.h Fri Feb  5 19:16:28 2010
>> @@ -52,10 +52,11 @@
>>    unsigned getInlineThreshold() const { return InlineThreshold; }
>> 
>>    /// Calculate the inline threshold for given Caller. This threshold is lower
>> -  /// if Caller is marked with OptimizeForSize and -inline-threshold is not
>> -  /// given on the comand line.
>> +  /// if the caller is marked with OptimizeForSize and -inline-threshold is not
>> +  /// given on the comand line. It is higher if the callee is marked with the
>> +  /// inlinehint attribute.
>>    ///
>> -  unsigned getInlineThreshold(Function* Caller) const;
>> +  unsigned getInlineThreshold(CallSite CS) const;
>> 
>>    /// getInlineCost - This method must be implemented by the subclass to
>>    /// determine the cost of inlining the specified call site.  If the cost
>> 
>> Modified: llvm/trunk/lib/AsmParser/LLLexer.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLLexer.cpp?rev=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/lib/AsmParser/LLLexer.cpp (original)
>> +++ llvm/trunk/lib/AsmParser/LLLexer.cpp Fri Feb  5 19:16:28 2010
>> @@ -558,6 +558,7 @@
>>    KEYWORD(readnone);
>>    KEYWORD(readonly);
>> 
>> +  KEYWORD(inlinehint);
>>    KEYWORD(noinline);
>>    KEYWORD(alwaysinline);
>>    KEYWORD(optsize);
>> 
>> Modified: llvm/trunk/lib/AsmParser/LLParser.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/lib/AsmParser/LLParser.cpp (original)
>> +++ llvm/trunk/lib/AsmParser/LLParser.cpp Fri Feb  5 19:16:28 2010
>> @@ -947,6 +947,7 @@
>>      case lltok::kw_noinline:        Attrs |= Attribute::NoInline; break;
>>      case lltok::kw_readnone:        Attrs |= Attribute::ReadNone; break;
>>      case lltok::kw_readonly:        Attrs |= Attribute::ReadOnly; break;
>> +    case lltok::kw_inlinehint:      Attrs |= Attribute::InlineHint; break;
>>      case lltok::kw_alwaysinline:    Attrs |= Attribute::AlwaysInline; break;
>>      case lltok::kw_optsize:         Attrs |= Attribute::OptimizeForSize; break;
>>      case lltok::kw_ssp:             Attrs |= Attribute::StackProtect; break;
>> 
>> Modified: llvm/trunk/lib/AsmParser/LLToken.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLToken.h?rev=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/lib/AsmParser/LLToken.h (original)
>> +++ llvm/trunk/lib/AsmParser/LLToken.h Fri Feb  5 19:16:28 2010
>> @@ -85,6 +85,7 @@
>>      kw_readnone,
>>      kw_readonly,
>> 
>> +    kw_inlinehint,
>>      kw_noinline,
>>      kw_alwaysinline,
>>      kw_optsize,
>> 
>> Modified: llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp?rev=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp (original)
>> +++ llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp Fri Feb  5 19:16:28 2010
>> @@ -470,6 +470,7 @@
>>          HANDLE_ATTR(Nest);
>>          HANDLE_ATTR(ReadNone);
>>          HANDLE_ATTR(ReadOnly);
>> +        HANDLE_ATTR(InlineHint);
>>          HANDLE_ATTR(NoInline);
>>          HANDLE_ATTR(AlwaysInline);
>>          HANDLE_ATTR(OptimizeForSize);
>> 
>> Modified: llvm/trunk/lib/Transforms/IPO/Inliner.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/Inliner.cpp?rev=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/IPO/Inliner.cpp (original)
>> +++ llvm/trunk/lib/Transforms/IPO/Inliner.cpp Fri Feb  5 19:16:28 2010
>> @@ -41,6 +41,16 @@
>>  InlineLimit("inline-threshold", cl::Hidden, cl::init(225), cl::ZeroOrMore,
>>          cl::desc("Control the amount of inlining to perform (default = 225)"));
>> 
>> +static cl::opt<bool>
>> +RespectHint("respect-inlinehint", cl::Hidden,
>> +            cl::desc("Respect the inlinehint attribute"));
>> +
>> +// Threshold to use when inlinehint is given.
>> +const int HintThreshold = 300;
>> +
>> +// Threshold to use when optsize is specified (and there is no -inline-limit).
>> +const int OptSizeThreshold = 75;
>> +
>>  Inliner::Inliner(void *ID)
>>    : CallGraphSCCPass(ID), InlineThreshold(InlineLimit) {}
>> 
>> @@ -172,13 +182,21 @@
>>    return true;
>>  }
>> 
>> -unsigned Inliner::getInlineThreshold(Function* Caller) const {
>> +unsigned Inliner::getInlineThreshold(CallSite CS) const {
>> +  // Listen to inlinehint when -respect-inlinehint is given.
>> +  Function *Callee = CS.getCalledFunction();
>> +  if (RespectHint&&  Callee&&  !Callee->isDeclaration()&&
>> +      Callee->hasFnAttr(Attribute::InlineHint))
>> +    return HintThreshold;
>> +
>> +  // Listen to optsize when -inline-limit is not given.
>> +  Function *Caller = CS.getCaller();
>>    if (Caller&&  !Caller->isDeclaration()&&
>>        Caller->hasFnAttr(Attribute::OptimizeForSize)&&
>>        InlineLimit.getNumOccurrences() == 0)
>> -    return 75;
>> -  else
>> -    return InlineThreshold;
>> +      return OptSizeThreshold;
>> +
>> +  return InlineThreshold;
>>  }
>> 
>>  /// shouldInline - Return true if the inliner should attempt to inline
>> @@ -200,7 +218,7 @@
>> 
>>    int Cost = IC.getValue();
>>    Function *Caller = CS.getCaller();
>> -  int CurrentThreshold = getInlineThreshold(Caller);
>> +  int CurrentThreshold = getInlineThreshold(CS);
>>    float FudgeFactor = getInlineFudgeFactor(CS);
>>    if (Cost>= (int)(CurrentThreshold * FudgeFactor)) {
>>      DEBUG(dbgs()<<  "    NOT Inlining: cost="<<  Cost
>> @@ -236,8 +254,7 @@
>> 
>>        outerCallsFound = true;
>>        int Cost2 = IC2.getValue();
>> -      Function *Caller2 = CS2.getCaller();
>> -      int CurrentThreshold2 = getInlineThreshold(Caller2);
>> +      int CurrentThreshold2 = getInlineThreshold(CS2);
>>        float FudgeFactor2 = getInlineFudgeFactor(CS2);
>> 
>>        if (Cost2>= (int)(CurrentThreshold2 * FudgeFactor2))
>> 
>> Modified: llvm/trunk/lib/VMCore/Attributes.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Attributes.cpp?rev=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/lib/VMCore/Attributes.cpp (original)
>> +++ llvm/trunk/lib/VMCore/Attributes.cpp Fri Feb  5 19:16:28 2010
>> @@ -56,6 +56,8 @@
>>      Result += "optsize ";
>>    if (Attrs&  Attribute::NoInline)
>>      Result += "noinline ";
>> +  if (Attrs&  Attribute::InlineHint)
>> +    Result += "inlinehint ";
>>    if (Attrs&  Attribute::AlwaysInline)
>>      Result += "alwaysinline ";
>>    if (Attrs&  Attribute::StackProtect)
>> 
>> Modified: llvm/trunk/utils/llvm.grm
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/llvm.grm?rev=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/utils/llvm.grm (original)
>> +++ llvm/trunk/utils/llvm.grm Fri Feb  5 19:16:28 2010
>> @@ -161,6 +161,7 @@
>>   | signext
>>   | readnone
>>   | readonly
>> + | inlinehint
>>   | noinline
>>   | alwaysinline
>>   | optsize
>> 
>> Modified: llvm/trunk/utils/vim/llvm.vim
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/vim/llvm.vim?rev=95466&r1=95465&r2=95466&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/utils/vim/llvm.vim (original)
>> +++ llvm/trunk/utils/vim/llvm.vim Fri Feb  5 19:16:28 2010
>> @@ -51,7 +51,7 @@
>>  syn keyword llvmKeyword x86_stdcallcc x86_fastcallcc
>>  syn keyword llvmKeyword signext zeroext inreg sret nounwind noreturn
>>  syn keyword llvmKeyword nocapture byval nest readnone readonly noalias
>> -syn keyword llvmKeyword noinline alwaysinline optsize ssp sspreq
>> +syn keyword llvmKeyword inlinehint noinline alwaysinline optsize ssp sspreq
>>  syn keyword llvmKeyword noredzone noimplicitfloat naked
>>  syn keyword llvmKeyword module asm align tail to
>>  syn keyword llvmKeyword addrspace section alias sideeffect c gc
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list