public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Diego Novillo <dnovillo@google.com>
To: Sriraman Tallam <tmsriram@google.com>
Cc: Jason Merrill <jason@redhat.com>, Jan Hubicka <jh@suse.cz>,
	 Xinliang David Li <davidxl@google.com>,
	mark@codesourcery.com, nathan@codesourcery.com,
	 "H.J. Lu" <hjl.tools@gmail.com>,
	Richard Guenther <richard.guenther@gmail.com>,
	 Uros Bizjak <ubizjak@gmail.com>,
	reply@codereview.appspotmail.com,
	GCC Patches <gcc-patches@gcc.gnu.org>
Subject: Re: User directed Function Multiversioning via Function Overloading (issue5752064)
Date: Fri, 19 Oct 2012 15:23:00 -0000	[thread overview]
Message-ID: <50816D63.3020908@google.com> (raw)
In-Reply-To: <CAAs8Hmyy9S+Ucg6rTDU3xGMg8JEaa0r3rNjbxhbjuk9H8Sb6wg@mail.gmail.com>

On 2012-10-12 18:19 , Sriraman Tallam wrote:

> When the front-end sees more than one decl for "foo", it calls a target hook to
> determine if they are versions. To prevent duplicate definition errors with other
>  versions of "foo", "decls_match" function in cp/decl.c is made to return false
>  when 2 decls have are deemed versions by the target. This will make all function
> versions of "foo" to be added to the overload list of "foo".

So, this means that this can only work for C++, right?  Or could the 
same trickery be done some other way in other FEs?

I see no handling of different FEs.  If the user tries to use these 
attributes from languages other than C++, we should emit a diagnostic.

> +@deftypefn {Target Hook} tree TARGET_GET_FUNCTION_VERSIONS_DISPATCHER (void *@var{arglist})
> +This hook is used to get the dispatcher function for a set of function
> +versions.  The dispatcher function is called to invoke the rignt function

s/rignt/right/

> +version at run-time. @var{arglist} is the vector of function versions
> +that should be considered for dispatch.
> +@end deftypefn
> +
> +@deftypefn {Target Hook} tree TARGET_GENERATE_VERSION_DISPATCHER_BODY (void *@var{arg})
> +This hook is used to generate the dispatcher logic to invoke the right
> +function version at runtime for a given set of function versions.

s/runtime/run-time/

> +@hook TARGET_GET_FUNCTION_VERSIONS_DISPATCHER
> +This hook is used to get the dispatcher function for a set of function
> +versions.  The dispatcher function is called to invoke the rignt function

s/rignt/right/

> +version at run-time. @var{arglist} is the vector of function versions
> +that should be considered for dispatch.
> +@end deftypefn
> +
> +@hook TARGET_GENERATE_VERSION_DISPATCHER_BODY
> +This hook is used to generate the dispatcher logic to invoke the right
> +function version at runtime for a given set of function versions.

s/runtime/run-time/

> @@ -288,7 +289,6 @@ mark_store (gimple stmt, tree t, void *data)
>       }
>    return false;
>  }
> -
>  /* Create cgraph edges for function calls.
>     Also look for functions and variables having addresses taken.  */

Don't remove vertical white space, please.

> +		{
> +		  struct cgraph_node *callee = cgraph_get_create_node (decl);
> +	          /* If a call to a multiversioned function dispatcher is
> +		     found, generate the body to dispatch the right function
> +		     at run-time.  */
> +		  if (callee->dispatcher_function)
> +		    {
> +		      tree resolver_decl;
> +		      gcc_assert (callee->function_version.next);

What if callee is the last version in the list?  Not sure what you are 
trying to check here.


> @@ -8601,9 +8601,22 @@ handle_target_attribute (tree *node, tree name, tr
>        warning (OPT_Wattributes, "%qE attribute ignored", name);
>        *no_add_attrs = true;
>      }
> -  else if (! targetm.target_option.valid_attribute_p (*node, name, args,
> -						      flags))
> -    *no_add_attrs = true;
> +  else
> +    {
> +      /* When a target attribute is invalid, it may also be because the
> +	 target for the compilation unit and the attribute match.  For
> +         instance, target attribute "xxx" is invalid when -mxxx is used.
> +         When used with multiversioning, removing the attribute will lead
> +         to duplicate definitions if a default version is provided.
> +	 So, generate a warning here and remove the attribute.  */
> +      if (!targetm.target_option.valid_attribute_p (*node, name, args, flags))
> +	{
> +	  warning (OPT_Wattributes,
> +		   "Invalid target attribute in function %qE, ignored.",
> +		   *node);
> +	  *no_add_attrs = true;

If you do this, isn't the compiler going to generate two warning 
messages?  One for the invalid target attribute, the second for the 
duplicate definition.

> @@ -228,6 +228,26 @@ struct GTY(()) cgraph_node {
>    struct cgraph_node *prev_sibling_clone;
>    struct cgraph_node *clones;
>    struct cgraph_node *clone_of;
> +
> +  /* Function Multiversioning info.  */
> +  struct {
> +    /* Chains all the semantically identical function versions.  The
> +       first function in this chain is the default function.  */
> +    struct cgraph_node *prev;
> +    /* If this node is a dispatcher for function versions, this points
> +       to the default function version, the first function in the chain.  */
> +    struct cgraph_node *next;

Why not a VEC of function decls?  Seems easier to manage and less size 
overhead.


> @@ -3516,8 +3522,8 @@ struct GTY(()) tree_function_decl {
>    unsigned looping_const_or_pure_flag : 1;
>    unsigned has_debug_args_flag : 1;
>    unsigned tm_clone_flag : 1;
> -
> -  /* 1 bit left */
> +  unsigned versioned_function : 1;
> +  /* No bits left.  */

You ate the last bit!  How rude ;)

> @@ -8132,6 +8176,38 @@ joust (struct z_candidate *cand1, struct z_candida
>        && (IS_TYPE_OR_DECL_P (cand1->fn)))
>      return 1;
>
> +  /* For Candidates of a multi-versioned function,  make the version with

s/Candidates/candidates/

> +  old_current_function_decl = current_function_decl;
> +  push_cfun (DECL_STRUCT_FUNCTION (function_decl));
> +  current_function_decl = function_decl;

push_cfun will set current_function_decl for you.  No need to keep track 
of old_current_function_decl.

> +  enum feature_priority
> +  {
> +    P_ZERO = 0,
> +    P_MMX,
> +    P_SSE,
> +    P_SSE2,
> +    P_SSE3,
> +    P_SSSE3,
> +    P_PROC_SSSE3,
> +    P_SSE4_a,
> +    P_PROC_SSE4_a,
> +    P_SSE4_1,
> +    P_SSE4_2,
> +    P_PROC_SSE4_2,
> +    P_POPCNT,
> +    P_AVX,
> +    P_AVX2,
> +    P_FMA,
> +    P_PROC_FMA
> +  };

There's no need to have this list dynamically defined, right?

> +	}
> +    }
> +
> +  /* Process feature name.  */
> +  tok_str =  (char *) xmalloc (strlen (attrs_str) + 1);

XNEWVEC(char, strlen (attrs_str) + 1);

> +  /* Atleast one more version other than the default.  */

s/Atleast/At least/

> +  num_versions = VEC_length (tree, fndecls);
> +  gcc_assert (num_versions >= 2);
> +
> +  function_version_info = (struct _function_version_info *)
> +    xmalloc ((num_versions - 1) * sizeof (struct _function_version_info));

Better use VEC() here.

> +
> +  /* The first version in the vector is the default decl.  */
> +  default_decl = VEC_index (tree, fndecls, 0);
> +
> +  old_current_function_decl = current_function_decl;
> +  push_cfun (DECL_STRUCT_FUNCTION (dispatch_decl));
> +  current_function_decl = dispatch_decl;

No need to set current_function_decl.

> +
> +  gseq = bb_seq (*empty_bb);
> +  /* Function version dispatch is via IFUNC.  IFUNC resolvers fire before
> +     constructors, so explicity call __builtin_cpu_init here.  */
> +  ifunc_cpu_init_stmt = gimple_build_call_vec (
> +                     ix86_builtins [(int) IX86_BUILTIN_CPU_INIT], NULL);
> +  gimple_seq_add_stmt (&gseq, ifunc_cpu_init_stmt);
> +  gimple_set_bb (ifunc_cpu_init_stmt, *empty_bb);
> +  set_bb_seq (*empty_bb, gseq);
> +
> +  pop_cfun ();
> +  current_function_decl = old_current_function_decl;

Likewise here.

> +/* This function returns true if fn1 and fn2 are versions of the same function.
> +   Returns false if only one of the function decls has the target attribute
> +   set or if the targets of the function decls are different.  This assumes
> +   the fn1 and fn2 have the same signature.  */

Mention the arguments in capitals.

> +  for (i = 0; i < strlen (str); i++)
> +    if (str[i] == ',')
> +      argnum++;
> +
> +  attr_str = (char *)xmalloc (strlen (str) + 1);

XNEWVEC()

> +  strcpy (attr_str, str);
> +
> +  /* Replace "=,-" with "_".  */
> +  for (i = 0; i < strlen (attr_str); i++)
> +    if (attr_str[i] == '=' || attr_str[i]== '-')
> +      attr_str[i] = '_';
> +
> +  if (argnum == 1)
> +    return attr_str;
> +
> +  args = (char **)xmalloc (argnum * sizeof (char *));

VEC()?

> +  if (DECL_DECLARED_INLINE_P (decl)
> +      && lookup_attribute ("gnu_inline",
> +			   DECL_ATTRIBUTES (decl)))
> +    error_at (DECL_SOURCE_LOCATION (decl),
> +	      "Function versions cannot be marked as gnu_inline,"
> +	      " bodies have to be generated\n");

No newline at the end of the error message.

> +  sprintf (assembler_name, "%s.%s", orig_name, attr_str);
> +  if (dump_file)
> +    fprintf (stderr, "Assembler name set to %s for function version %s\n",
> +	     assembler_name, IDENTIFIER_POINTER (id));

This dumps to stderr instead of dump_file.  Also, use the new dumping 
facility?

> +/* Return a new name by appending SUFFIX to the DECL name.  If
> +   make_unique is true, append the full path name.  */

Full path name of what?

> +
> +static char *
> +make_name (tree decl, const char *suffix, bool make_unique)
> +{
> +  char *global_var_name;
> +  int name_len;
> +  const char *name;
> +  const char *unique_name = NULL;
> +
> +  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
> +
> +  /* Get a unique name that can be used globally without any chances
> +     of collision at link time.  */
> +  if (make_unique)
> +    unique_name = IDENTIFIER_POINTER (get_file_function_name ("\0"));
> +
> +  name_len = strlen (name) + strlen (suffix) + 2;
> +
> +  if (make_unique)
> +    name_len += strlen (unique_name) + 1;
> +  global_var_name = (char *) xmalloc (name_len);

XNEWVEC.



Diego.

  reply	other threads:[~2012-10-19 15:10 UTC|newest]

Thread overview: 93+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-07  0:47 Sriraman Tallam
2012-03-07 14:05 ` Richard Guenther
2012-03-07 19:08   ` Sriraman Tallam
2012-03-08 21:37     ` Xinliang David Li
2012-03-08 21:00   ` Xinliang David Li
2012-03-09 20:04   ` Sriraman Tallam
2012-04-27  5:09     ` Sriraman Tallam
2012-04-27 13:39       ` H.J. Lu
2012-04-27 14:35         ` Sriraman Tallam
2012-04-27 14:39           ` H.J. Lu
2012-04-27 14:53             ` Sriraman Tallam
2012-04-27 15:36               ` H.J. Lu
2012-04-27 15:45                 ` Sriraman Tallam
2012-05-01 23:51                 ` Sriraman Tallam
2012-05-02  0:09                   ` H.J. Lu
2012-05-02  2:45                     ` Sriraman Tallam
2012-05-02 13:42                       ` H.J. Lu
2012-05-02 15:08                         ` Sriraman Tallam
2012-05-02 16:06                           ` H.J. Lu
2012-05-02 17:44                             ` Sriraman Tallam
2012-05-02 18:04                               ` H.J. Lu
2012-05-07 16:58                                 ` Sriraman Tallam
2012-05-09 19:01                                   ` Sriraman Tallam
2012-05-10 17:55                                     ` H.J. Lu
2012-05-12  2:04                                       ` Sriraman Tallam
2012-05-12 13:38                                         ` H.J. Lu
2012-05-14 18:29                                           ` Sriraman Tallam
2012-05-26  0:07                                             ` H.J. Lu
2012-05-26  0:16                                               ` Sriraman Tallam
2012-05-26  0:27                                                 ` H.J. Lu
2012-05-26  1:54                                                   ` Sriraman Tallam
     [not found]                                                     ` <CAMe9rOowm9K7r1xnRdRjW5Y4Ay+WxgSsBLTgGvq24z=i42AS+g@mail.gmail.com>
     [not found]                                                       ` <CAAs8HmzeQigcLQyfkC02u=6gCTLkjLLa_jYmp+b1HEtpMCrYWw@mail.gmail.com>
2012-05-26  5:06                                                         ` H.J. Lu
2012-05-26 22:35                                                           ` Sriraman Tallam
2012-05-26 23:56                                                             ` H.J. Lu
2012-05-27  0:24                                                               ` Sriraman Tallam
2012-05-27  2:06                                                                 ` H.J. Lu
2012-05-27  2:23                                                                   ` Sriraman Tallam
2012-05-27  2:31                                                                     ` H.J. Lu
2012-05-27 19:02                                                                     ` Ian Lance Taylor
2012-06-04 19:01                                             ` Sriraman Tallam
2012-06-04 21:36                                               ` H.J. Lu
2012-06-04 22:29                                                 ` Sriraman Tallam
2012-06-05 13:56                                                   ` H.J. Lu
2012-06-14 20:35                                               ` Sriraman Tallam
2012-06-20  1:10                                                 ` Sriraman Tallam
2012-07-06  9:14                                                 ` Richard Guenther
2012-07-06 17:38                                                   ` Sriraman Tallam
2012-07-07  6:06                                                 ` Jason Merrill
2012-07-07 18:38                                                   ` Xinliang David Li
2012-07-08 11:21                                                     ` Jason Merrill
2012-07-09 21:27                                                       ` Xinliang David Li
2012-07-10  9:46                                                         ` Jason Merrill
2012-07-10 16:09                                                           ` Xinliang David Li
     [not found]                                                             ` <CAAs8HmxHF38ktt6syjWp-MpjiX+6NcXh7_8Xn6iKnAiF2vRymQ@mail.gmail.com>
2012-07-19 20:40                                                               ` Jason Merrill
2012-07-30 19:16                                                                 ` Sriraman Tallam
2012-08-25  0:34                                                                   ` Sriraman Tallam
2012-09-18 16:29                                                                     ` Sriraman Tallam
2012-10-05 17:07                                                                       ` Xinliang David Li
2012-10-05 17:44                                                                     ` Jason Merrill
2012-10-05 18:14                                                                       ` Jason Merrill
2012-10-05 21:58                                                                       ` Sriraman Tallam
2012-10-05 22:50                                                                         ` Jason Merrill
2012-10-05 23:45                                                                           ` Sriraman Tallam
2012-10-05 18:32                                                                     ` Jason Merrill
2012-10-11  0:13                                                                       ` Sriraman Tallam
2012-10-12 22:41                                                                         ` Sriraman Tallam
2012-10-19 15:23                                                                           ` Diego Novillo [this message]
2012-10-20  4:29                                                                             ` Sriraman Tallam
2012-10-23 21:21                                                                               ` Sriraman Tallam
2012-10-26 16:53                                                                                 ` Jan Hubicka
2012-10-28  4:31                                                                                   ` Sriraman Tallam
2012-10-29 13:05                                                                                     ` Jan Hubicka
2012-10-29 17:56                                                                                       ` Sriraman Tallam
2012-10-30 19:18                                                                                     ` Jason Merrill
2012-10-31  0:58                                                                                       ` Sriraman Tallam
     [not found]                                                                                       ` <CAAs8Hmw09giv-5_v0irhByTjTJV=kD58rCAD2SAz7M8zrwjBOA@mail.gmail.com>
2012-10-31 14:27                                                                                         ` Jason Merrill
2012-11-02  2:53                                                                                           ` Sriraman Tallam
2012-11-06  2:38                                                                                             ` Sriraman Tallam
2012-11-06 15:52                                                                                               ` Jason Merrill
2012-11-06 18:17                                                                                                 ` Sriraman Tallam
2012-11-10  1:33                                                                                                 ` Sriraman Tallam
2012-11-12  5:04                                                                                                   ` Jason Merrill
2012-11-13  1:11                                                                                                     ` Sriraman Tallam
2012-11-13  2:39                                                                                                       ` Jason Merrill
2012-11-13 21:57                                                                                                         ` Sriraman Tallam
2012-11-17 22:23                                                                                                           ` H.J. Lu
2012-11-06 22:15                                                                                               ` Gerald Pfeifer
2012-10-26 14:11                                                                               ` Diego Novillo
2012-10-26 16:54 Xinliang David Li
2012-10-26 17:28 ` Sriraman Tallam
2012-11-06 22:17 Dominique Dhumieres
2012-11-07  1:16 ` Gerald Pfeifer
2012-11-07  8:53   ` Dominique Dhumieres

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50816D63.3020908@google.com \
    --to=dnovillo@google.com \
    --cc=davidxl@google.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=hjl.tools@gmail.com \
    --cc=jason@redhat.com \
    --cc=jh@suse.cz \
    --cc=mark@codesourcery.com \
    --cc=nathan@codesourcery.com \
    --cc=reply@codereview.appspotmail.com \
    --cc=richard.guenther@gmail.com \
    --cc=tmsriram@google.com \
    --cc=ubizjak@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).