On Sun, Jun 3, 2012 at 11:17 PM, Dehao Chen <de...@google.com> wrote:
> I've updated the patch using deferred option.
>
> http://codereview.appspot.com/6281047
>
> Thanks,
> Dehao
>
> The new patch:
>
> 2012-06-01  Dehao Chen  <de...@google.com>
>
>        * gcc/cgraph.c (cgraph_match_attribute_by_name): New function.
>        (cgraph_node): Add attribute to function decl.
>        * gcc/opts-global.c (add_attribute_list_to_vector): New function.
>        (handle_common_deferred_options): Handle new options.
>        * gcc/opts.c (common_handle_option): Handle new options.
>        * gcc/opts.h (attribute_pair): New type.
>        * gcc/common.opt (flag_function_attribute_list): New option.
> Index: gcc/doc/invoke.texi
> ===================================================================
> --- gcc/doc/invoke.texi (revision 188050)
> +++ gcc/doc/invoke.texi (working copy)
> @@ -362,7 +362,8 @@
>  -fdelete-null-pointer-checks -fdse -fdevirtualize -fdse @gol
>  -fearly-inlining -fipa-sra -fexpensive-optimizations -ffast-math @gol
>  -ffinite-math-only -ffloat-store -fexcess-precision=@var{style} @gol
> --fforward-propagate -ffp-contract=@var{style} -ffunction-sections @gol
> +-fforward-propagate -ffp-contract=@var{style} @gol
> +-ffunction-attribute-list -ffunction-sections @gol
>  -fgcse -fgcse-after-reload -fgcse-las -fgcse-lm -fgraphite-identity @gol
>  -fgcse-sm -fif-conversion -fif-conversion2 -findirect-inlining @gol
>  -finline-functions -finline-functions-called-once -finline-limit=@var{n} @gol
> @@ -8585,6 +8586,10 @@
>  specify this option and you may have problems with debugging if
>  you specify both this option and @option{-g}.
>
> +@item -ffunction-attribute-list
> +@opindex ffunction-attribute-list
> +List of function name patterns that will be applied specified attribute.
> +
>  @item -fbranch-target-load-optimize
>  @opindex fbranch-target-load-optimize
>  Perform branch target register load optimization before prologue / epilogue
> Index: gcc/cgraph.c
> ===================================================================
> --- gcc/cgraph.c        (revision 188050)
> +++ gcc/cgraph.c        (working copy)
> @@ -99,6 +99,7 @@
>  #include "ipa-utils.h"
>  #include "lto-streamer.h"
>  #include "l-ipo.h"
> +#include "opts.h"
>
>  const char * const ld_plugin_symbol_resolution_names[]=
>  {
> @@ -520,6 +521,32 @@
>     }
>  }
>
> +/* Match FNDECL's name with user specified patterns. If match is found, add
> +   attributes to FNDECL.
> +   name matches with pattern, iff one of the following conditions satisfy:
> +     1. strcmp (name, pattern) != 0
> +     2. pattern[len - 1] = '*' && strncmp (name, pattern, len - 1) != 0  */

Fix the comment -- !strcmp ...

> +static void
> +cgraph_match_attribute_by_name (tree fndecl)
> +{
> +  unsigned i;
> +  attribute_pair_p p;
> +  const char *name = lang_hooks.decl_printable_name(fndecl, 0);

It should probably use mangled name here.

> +
> +  if (!name)
> +    return;
> +
> +  FOR_EACH_VEC_ELT (attribute_pair_p, function_attribute_list, i, p)
> +    {
> +      char *n = p->name;
> +      int len = strlen (n);
> +      if ((n[len - 1] == '*' && !strncmp (name, n, len - 1))
> +          || !strcmp (name, n))
> +        decl_attributes (&fndecl, tree_cons (
> +            get_identifier (p->attribute), NULL, NULL), 0);
> +    }
> +}
> +
>  /* Return cgraph node assigned to DECL.  Create new one when needed.  */
>
>  struct cgraph_node *
> @@ -554,6 +581,7 @@
>       node->origin->nested = node;
>     }
>   cgraph_add_assembler_hash_node (node);
> +  cgraph_match_attribute_by_name (decl);
>   return node;
>  }
>
> Index: gcc/opts.c
> ===================================================================
> --- gcc/opts.c  (revision 188050)
> +++ gcc/opts.c  (working copy)
> @@ -1647,6 +1647,10 @@
>       /* Deferred.  */
>       break;
>
> +    case OPT_ffunction_attribute_list_:
> +      /* Deferred.  */
> +      break;
> +
>     case OPT_fsched_verbose_:
>  #ifdef INSN_SCHEDULING
>       /* Handled with Var in common.opt.  */
> Index: gcc/opts.h
> ===================================================================
> --- gcc/opts.h  (revision 188050)
> +++ gcc/opts.h  (working copy)
> @@ -272,6 +272,15 @@
>   struct cl_option_handler_func handlers[3];
>  };
>
> +typedef struct {
> +  char *name;
> +  char *attribute;
> +} attribute_pair;
> +typedef attribute_pair *attribute_pair_p;
> +DEF_VEC_P(attribute_pair_p);
> +DEF_VEC_ALLOC_P(attribute_pair_p,heap);
> +extern VEC(attribute_pair_p,heap) *function_attribute_list;
> +
>  /* Input file names.  */
>
>  extern const char **in_fnames;
> Index: gcc/common.opt
> ===================================================================
> --- gcc/common.opt      (revision 188050)
> +++ gcc/common.opt      (working copy)
> @@ -1242,6 +1242,10 @@
>  Common Report Var(flag_function_sections)
>  Place each function into its own section
>
> +ffunction-attribute-list=
> +Common Joined RejectNegative Var(common_deferred_options) Defer
> +-ffunction-attribute-list=attribute:name,...  Add attribute to named 
> functions
> +
>  fgcda=
>  Common Joined RejectNegative Var(gcov_da_name)
>  Set the gcov data file name.
> Index: gcc/opts-global.c
> ===================================================================
> --- gcc/opts-global.c   (revision 188050)
> +++ gcc/opts-global.c   (working copy)
> @@ -50,6 +50,8 @@
>  const char **in_fnames;
>  unsigned num_in_fnames;
>
> +VEC(attribute_pair_p,heap) *function_attribute_list;
> +
>  /* Return a malloced slash-separated list of languages in MASK.  */
>
>  static char *
> @@ -79,6 +81,66 @@
>   return result;
>  }
>
> +/* Add strings like attribute_str:name1,name2... to a char_pair_p vector.  */
> +
> +static void
> +add_attribute_list_to_vector (void **pvec, const char *arg)
> +{
> +  char *tmp;
> +  char *r;
> +  char *w;
> +  char *token_start;
> +  char *attribute;
> +  VEC(attribute_pair_p,heap) *vec = (VEC(attribute_pair_p,heap) *) *pvec;
> +
> +  /* We never free this string.  */
> +  tmp = xstrdup (arg);
> +  attribute = tmp;
> +
> +  for (r = tmp; *r != '\0' && *r != ':'; ++r)
> +    ;
> +
> +  if (*r != ':')
> +    return;

Use 'strchr'.

> +
> +  *r = '\0';
> +  ++r;
> +  w = r;
> +  token_start = r;
> +
> +  while (*r != '\0')
> +    {
> +      if (*r == ',')
> +       {
> +         attribute_pair_p p =
> +             (attribute_pair_p) xmalloc (sizeof (attribute_pair));
> +         p->name = token_start;
> +         p->attribute = attribute;
> +         *w++ = '\0';
> +         ++r;
> +         VEC_safe_push (attribute_pair_p, heap, vec, p);
> +         token_start = w;
> +       }
> +      if (*r == '\\' && r[1] == ',')
> +       {
> +         *w++ = ',';
> +         r += 2;
> +       }
> +      else
> +       *w++ = *r++;
> +    }


Simplify the code with 'strchr'.


thanks,

David

> +  if (*token_start != '\0')
> +    {
> +      attribute_pair_p p =
> +         (attribute_pair_p) xmalloc (sizeof (attribute_pair));
> +      p->name = token_start;
> +      p->attribute = attribute;
> +      VEC_safe_push (attribute_pair_p, heap, vec, p);
> +    }
> +
> +  *pvec = vec;
> +}
> +
>  /* Complain that switch DECODED does not apply to this front end (mask
>    LANG_MASK).  */
>
> @@ -452,6 +514,10 @@
>          set_random_seed (opt->arg);
>          break;
>
> +       case OPT_ffunction_attribute_list_:
> +         add_attribute_list_to_vector(&function_attribute_list, opt->arg);
> +         break;
> +
>        case OPT_fstack_limit:
>          /* The real switch is -fno-stack-limit.  */
>          if (!opt->value)
>
> On Sun, Jun 3, 2012 at 9:14 PM, Dehao Chen <de...@google.com> wrote:
>> Thank you guys for the comments, I'll update the patch to :
>>
>> 1. generalize the flag to enable other annotations such always_inline.
>> 2. change to use deferred option.
>>
>> Thanks,
>> Dehao
>>
>> On Sun, Jun 3, 2012 at 12:40 PM, Xinliang David Li <davi...@google.com> 
>> wrote:
>>> On Sat, Jun 2, 2012 at 11:11 AM, Jan Hubicka <hubi...@ucw.cz> wrote:
>>>>> Actually Dehao also plans to teach the static predictor to understand
>>>>> standard library functions more (e.g IO functions) and add more naming
>>>>
>>>> How this differ from annotating the library?
>>>
>>> I find them more suitable to be compiler heuristic than being
>>> function's attribute -- attribute is a much stronger assertion.
>>>
>>>>
>>>> There are indeed quite some possibilities to do about library calls....
>>>>
>>>> One thing I always wondered about is how to tell predictor that paths 
>>>> containing
>>>> heavy IO functions don't need to be really opimized to death, since their 
>>>> execution
>>>> time is dominated by the IO...
>>>>
>>>
>>> Yes -- if branch predictor does the right thing and if function
>>> splitter is powerful enough, the IO code can be outlined and optimized
>>> for size :)
>>>
>>>
>>>>> based heuristics such as 'error, success, failure, fatal etc).
>>>>
>>>> yeah, this is also mentioned by some branch prediction papers. It is bit 
>>>> kludgy
>>>> in nature (i.e. it won't understand programs written in Czech language) 
>>>> but it
>>>> is an heuristics after all.
>>>>
>>>
>>> right.
>>>
>>> thanks,
>>>
>>> David
>>>
>>>> Honza
>>>>>
>>>>> thanks,
>>>>>
>>>>> David
>>>>>
>>>>> > Honza
>>>>> >>
>>>>> >> thanks,
>>>>> >>
>>>>> >> David
>>>>> >> > Honza

Reply via email to