On Sun, Jun 3, 2012 at 11:17 PM, Dehao Chen <[email protected]> wrote:
> I've updated the patch using deferred option.
>
> http://codereview.appspot.com/6281047
>
> Thanks,
> Dehao
>
> The new patch:
>
> 2012-06-01 Dehao Chen <[email protected]>
>
> * 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 <[email protected]> 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 <[email protected]>
>> wrote:
>>> On Sat, Jun 2, 2012 at 11:11 AM, Jan Hubicka <[email protected]> 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