https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81706

--- Comment #5 from rguenther at suse dot de <rguenther at suse dot de> ---
On Fri, 4 Aug 2017, jakub at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81706
> 
> --- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> The C/C++ FE change would be something like:
> --- gcc/tree.c.jj       2017-07-29 09:48:40.000000000 +0200
> +++ gcc/tree.c  2017-08-04 12:06:35.636072718 +0200
> @@ -5022,8 +5022,8 @@ attribute_value_equal (const_tree attr1,
>                                      TREE_VALUE (attr2)) == 1);
>      }
> 
> -  if ((flag_openmp || flag_openmp_simd)
> -      && TREE_VALUE (attr1) && TREE_VALUE (attr2)
> +  if (TREE_VALUE (attr1)
> +      && TREE_VALUE (attr2)
>        && TREE_CODE (TREE_VALUE (attr1)) == OMP_CLAUSE
>        && TREE_CODE (TREE_VALUE (attr2)) == OMP_CLAUSE)
>      return omp_declare_simd_clauses_equal (TREE_VALUE (attr1),
> --- gcc/cp/decl.c.jj    2017-08-01 19:23:10.000000000 +0200
> +++ gcc/cp/decl.c       2017-08-04 12:44:44.773780568 +0200
> @@ -2456,6 +2456,35 @@ next_arg:;
>                   break;
>                 }
>             }
> +
> +         tree s = lookup_attribute ("omp declare simd",
> +                                    DECL_ATTRIBUTES (newdecl));
> +         if (s)
> +           {
> +             tree b = builtin_decl_explicit (DECL_FUNCTION_CODE (newdecl));
> +             if (b)
> +               {
> +                 tree s2 = lookup_attribute ("omp declare simd",
> +                                             DECL_ATTRIBUTES (b));
> +                 while (s)
> +                   {
> +                     tree s3;
> +                     for (s3 = s2; s3;
> +                          s3 = lookup_attribute ("omp declare simd",
> +                                                 TREE_CHAIN (s3)))
> +                       if (attribute_value_equal (s, s3))
> +                         break;
> +                     if (!s3)
> +                       {
> +                         s3 = copy_node (s);
> +                         TREE_CHAIN (s3) = DECL_ATTRIBUTES (b);
> +                         DECL_ATTRIBUTES (b) = s3;
> +                       }
> +                     s = lookup_attribute ("omp declare simd",
> +                                           TREE_CHAIN (s));
> +                   }
> +               }
> +           }
>         }
>        if (new_defines_function)
>         /* If defining a function declared with other language
> --- gcc/c/c-decl.c.jj   2017-07-31 11:31:15.000000000 +0200
> +++ gcc/c/c-decl.c      2017-08-04 12:39:48.113226134 +0200
> @@ -2566,6 +2566,36 @@ merge_decls (tree newdecl, tree olddecl,
>                         set_builtin_decl_declared_p (fncode, true);
>                       break;
>                     }
> +
> +                 tree s = lookup_attribute ("omp declare simd",
> +                                            DECL_ATTRIBUTES (newdecl));
> +                 if (s)
> +                   {
> +                     tree b
> +                       = builtin_decl_explicit (DECL_FUNCTION_CODE 
> (newdecl));
> +                     if (b)
> +                       {
> +                         tree s2 = lookup_attribute ("omp declare simd",
> +                                                     DECL_ATTRIBUTES (b));
> +                         while (s)
> +                           {
> +                             tree s3;
> +                             for (s3 = s2; s3;
> +                                  s3 = lookup_attribute ("omp declare simd",
> +                                                         TREE_CHAIN (s3)))
> +                               if (attribute_value_equal (s, s3))
> +                                 break;
> +                             if (!s3)
> +                               {
> +                                 tree s3 = copy_node (s);
> +                                 TREE_CHAIN (s3) = DECL_ATTRIBUTES (b);
> +                                 DECL_ATTRIBUTES (b) = s3;
> +                               }
> +                             s = lookup_attribute ("omp declare simd",
> +                                                   TREE_CHAIN (s));
> +                           }
> +                       }
> +                   }
>                 }
>             }
>           else
> 
> and has the advantage that any other uses of __builtin_* would work that way.

True, but it removes the ability to avoid the vectorized variant with
using the __builtin_ variant ;)  I think we never move attributes on
the C library header prototypes to our builtins, do we?

> As for the libstdc++-v3 patch, why is it incomplete?  I've just changed the
> cases where glibc has
> routines with simd attribute (which is only for float/double routines, not for
> long double, and
> only those changed in the patch).

Oh, I was just looking for consistent handling -- where we have using ::X
use ::X instead of a builtin.

Reply via email to