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 } } */