Steve Ellcey <sell...@marvell.com> writes:
> On Fri, 2019-07-19 at 19:24 +0100, Richard Sandiford wrote:
>> 
>> You can probably also remove:
>> 
>>       tree new_type = build_distinct_type_copy (TREE_TYPE (node->decl));
>>       ...
>>       TREE_TYPE (node->decl) = new_type;
>> 
>> in simd_clone_adjust_argument_types.
>> 
>> I'm happy doing it this way or doing the copy in the AArch64 hook.
>> It's really Jakub's call.
>
> You are right, that is no longer needed with the current patch.  I
> removed it and retested with no regressions.  Jakub, do you have
> any preference?  I have attached a new version of the patch to this
> email.
>
>> I don't think the tests need:
>> 
>> /* { dg-require-effective-target aarch64_variant_pcs } */
>> 
>> since they're only dg-do compile.  Leaving the line out would get more
>> coverage for people using older binutils.
>> 
>> The tests are OK with that change, thanks.
>
> OK, I made that change to the tests.
>
>
> Latest version of the patch:
>
> 2019-07-22  Steve Ellcey  <sell...@marvell.com>
>
>       * omp-simd-clone.c (simd_clone_adjust_return_type): Remove call to
>       build_distinct_type_copy.
>       (simd_clone_adjust_argument_types): Ditto.
>       (simd_clone_adjust): Call build_distinct_type_copy here.
>       (expand_simd_clones): Ditto.
>
>
> 2019-07-22  Steve Ellcey  <sell...@marvell.com>
>
>       * gcc.target/aarch64/simd_pcs_attribute.c: New test.
>       * gcc.target/aarch64/simd_pcs_attribute-2.c: Ditto.
>       * gcc.target/aarch64/simd_pcs_attribute-3.c: Ditto.
>
>
> diff --git a/gcc/omp-simd-clone.c b/gcc/omp-simd-clone.c
> index caa8da3cba5..da01d9b8e6c 100644
> --- a/gcc/omp-simd-clone.c
> +++ b/gcc/omp-simd-clone.c
> @@ -498,7 +498,6 @@ simd_clone_adjust_return_type (struct cgraph_node *node)
>    /* Adjust the function return type.  */
>    if (orig_rettype == void_type_node)
>      return NULL_TREE;
> -  TREE_TYPE (fndecl) = build_distinct_type_copy (TREE_TYPE (fndecl));
>    t = TREE_TYPE (TREE_TYPE (fndecl));
>    if (INTEGRAL_TYPE_P (t) || POINTER_TYPE_P (t))
>      veclen = node->simdclone->vecsize_int;
> @@ -724,11 +723,6 @@ simd_clone_adjust_argument_types (struct cgraph_node 
> *node)
>         else
>           new_reversed = void_list_node;
>       }
> -
> -      tree new_type = build_distinct_type_copy (TREE_TYPE (node->decl));
> -      TYPE_ARG_TYPES (new_type) = new_reversed;

I think you still need this line, just applied to the existing type
rather than a new one.

> -      TREE_TYPE (node->decl) = new_type;
> -
>        adjustments.release ();
>      }
>    args.release ();
> @@ -1164,6 +1158,7 @@ simd_clone_adjust (struct cgraph_node *node)
>  {
>    push_cfun (DECL_STRUCT_FUNCTION (node->decl));
>  
> +  TREE_TYPE (node->decl) = build_distinct_type_copy (TREE_TYPE (node->decl));
>    targetm.simd_clone.adjust (node);
>  
>    tree retval = simd_clone_adjust_return_type (node);
> @@ -1737,6 +1732,8 @@ expand_simd_clones (struct cgraph_node *node)
>           simd_clone_adjust (n);
>         else
>           {
> +           TREE_TYPE (n->decl)
> +             = build_distinct_type_copy (TREE_TYPE (n->decl));
>             targetm.simd_clone.adjust (n);
>             simd_clone_adjust_return_type (n);
>             simd_clone_adjust_argument_types (n);
>
> diff --git a/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute-2.c 
> b/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute-2.c
> index e69de29bb2d..8eec6824f37 100644
> --- a/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute-2.c
> +++ b/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute-2.c
> @@ -0,0 +1,16 @@
> +/* { dg-do compile } */
> +/* { dg-options "-Ofast" } */
> +
> +__attribute__ ((__simd__ ("notinbranch")))
> +__attribute__ ((__nothrow__ , __leaf__ , __const__))
> +extern double foo (double x);
> +
> +void bar(double * f, int n)
> +{
> +     int i;
> +     for (i = 0; i < n; i++)
> +             f[i] = foo(f[i]);
> +}
> +
> +/* { dg-final { scan-assembler-not {\.variant_pcs\tfoo} } } */
> +/* { dg-final { scan-assembler-times {\.variant_pcs\t_ZGVnN2v_foo} 1 } } */
> diff --git a/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute-3.c 
> b/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute-3.c
> index e69de29bb2d..95f6a6803e8 100644
> --- a/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute-3.c
> +++ b/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute-3.c
> @@ -0,0 +1,24 @@
> +/* { dg-do compile } */
> +/* { dg-options "-Ofast" } */
> +
> +__attribute__ ((__simd__))
> +__attribute__ ((__nothrow__ , __leaf__ , __const__))
> +double foo (double x);
> +
> +void bar(double *f, int n)
> +{
> +     int i;
> +     for (i = 0; i < n; i++)
> +             f[i] = foo(f[i]);
> +}
> +
> +double foo(double x)
> +{
> +     return x * x / 3.0;
> +}
> +
> +/* { dg-final { scan-assembler-not {\.variant_pcs\tfoo} } } */
> +/* { dg-final { scan-assembler-times {\.variant_pcs\t_ZGVnM1v_foo} 1 } } */
> +/* { dg-final { scan-assembler-times {\.variant_pcs\t_ZGVnM2v_foo} 1 } } */
> +/* { dg-final { scan-assembler-times {\.variant_pcs\t_ZGVnN1v_foo} 1 } } */
> +/* { dg-final { scan-assembler-times {\.variant_pcs\t_ZGVnN2v_foo} 1 } } */
> diff --git a/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute.c 
> b/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute.c
> index e69de29bb2d..eddcef3597c 100644
> --- a/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute.c
> +++ b/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute.c
> @@ -0,0 +1,16 @@
> +/* { dg-do compile } */
> +/* { dg-options "-Ofast" } */
> +
> +__attribute__ ((__simd__ ("notinbranch")))
> +__attribute__ ((__nothrow__ , __leaf__ , __const__))
> +extern double log (double __x);
> +
> +void foo(double *f, int n)
> +{
> +     int i;
> +     for (i = 0; i < n; i++)
> +             f[i] = log(f[i]);
> +}
> +
> +/* { dg-final { scan-assembler-not {\.variant_pcs\tlog} } } */
> +/* { dg-final { scan-assembler-times {\.variant_pcs\t_ZGVnN2v_log} 1 } } */

Reply via email to