[PATCH] New attribute to create target clones

Jeff Law law@redhat.com
Mon Oct 26 15:59:00 GMT 2015


On 10/12/2015 05:35 PM, Evgeny Stupachenko wrote:
> Hi All,
>
> Here is a new version of patch (attached).
> Bootstrap and make check are in progress (all new tests passed).
>
> New test case g++.dg/ext/mvc4.C fails with ICE, when options lower
> than "-mavx" are passed.
> However it has the same behavior if "target_clones" attribute is
> replaced by 2 corresponding "target" attributes.
> I've filed PR67946 on this:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67946
>
> Thanks,
> Evgeny
>
> ChangeLog:
>
> 2015-10-13  Evgeny Stupachenko<evstupac@gmail.com>
> gcc/
>          * Makefile.in (OBJS): Add multiple_target.o.
>          * attrib.c (make_attribute): Moved from config/i386/i386.c
>          * config/i386/i386.c (make_attribute): Deleted.
>          * multiple_target.c (make_attribute): New.
>          (create_dispatcher_calls): Ditto.
>          (get_attr_len): Ditto.
>          (get_attr_str): Ditto.
>          (is_valid_asm_symbol): Ditto.
>          (create_new_asm_name): Ditto.
>          (create_target_clone): Ditto.
>          (expand_target_clones): Ditto.
>          (ipa_target_clone): Ditto.
>          (ipa_dispatcher_calls): Ditto.
>          * passes.def (pass_target_clone): Two new ipa passes.
>          * tree-pass.h (make_pass_target_clone): Ditto.
>
> gcc/c-family
>          * c-common.c (handle_target_clones_attribute): New.
>          * (c_common_attribute_table): Add handle_target_clones_attribute.
>          * (handle_always_inline_attribute): Add check on target_clones
>          attribute.
>          * (handle_target_attribute): Ditto.
>
> gcc/testsuite
>          * gcc.dg/mvc1.c: New test for multiple targets cloning.
>          * gcc.dg/mvc2.c: Ditto.
>          * gcc.dg/mvc3.c: Ditto.
>          * gcc.dg/mvc4.c: Ditto.
>          * gcc.dg/mvc5.c: Ditto.
>          * gcc.dg/mvc6.c: Ditto.
>          * gcc.dg/mvc7.c: Ditto.
>          * g++.dg/ext/mvc1.C: Ditto.
>          * g++.dg/ext/mvc2.C: Ditto.
>          * g++.dg/ext/mvc3.C: Ditto.
>          * g++.dg/ext/mvc4.C: Ditto.
>
> gcc/doc
>          * doc/extend.texi (target_clones): New attribute description.
>

> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
> index 23e6a76..f9d28d1 100644
> --- a/gcc/doc/extend.texi
> +++ b/gcc/doc/extend.texi
> @@ -3066,6 +3066,19 @@ This function attribute make a stack protection of the function if
>   flags @option{fstack-protector} or @option{fstack-protector-strong}
>   or @option{fstack-protector-explicit} are set.
>
> +@item target_clones (@var{options})
> +@cindex @code{target_clones} function attribute
> +The @code{target_clones} attribute is used to specify that a function is to
> +be cloned into multiple versions compiled with different target options
> +than specified on the command line.  The supported options and restrictions
> +are the same as for @code{target}.
"as for @code{target}" -> "as for the @code{target} attribute."

I think that makes it a tiny bit clearer.




> +
> +/*  Creates target clone of NODE.  */
> +
> +static cgraph_node *
> +create_target_clone (cgraph_node *node, bool definition)
> +{
> +  cgraph_node *new_node;
> +  if (definition)
> +    {
> +      new_node = node->create_version_clone_with_body (vNULL, NULL,
> +    						       NULL, false,
> +						       NULL, NULL,
> +						       "target_clone");
> +      new_node->externally_visible = node->externally_visible;
> +      new_node->address_taken = node->address_taken;
> +      new_node->thunk = node->thunk;
> +      new_node->alias = node->alias;
> +      new_node->weakref = node->weakref;
> +      new_node->cpp_implicit_alias = node->cpp_implicit_alias;
> +      new_node->local.local = node->local.local;
So do we need to explicitly clear TREE_PUBLIC here?  It also seems like 
copying externally_visible, address_taken and possibly some of those 
other fields is wrong.  The clone is going to be local to the CU, it 
doesn't inherit those properties from the original -- only the 
dispatcher needs to inherit those properties, right?

> +
> +
> +  for (i = 0; i < attrnum; i++)
> +    {
> +      char *attr = attrs[i];
> +      cgraph_node *new_node = create_target_clone (node, defenition);
> +      char *new_asm_name =
> +	  XNEWVEC (char, strlen (old_asm_name) + strlen (attr) + 2);
> +      create_new_asm_name (old_asm_name, attr, new_asm_name);
I thought after discussions with Jan that this wasn't going to be 
necessary as cloning should create a suitable name for us?


Jeff



More information about the Gcc-patches mailing list