On Tue, 5 Nov 2024, Victor Do Nascimento wrote: > This patch adds stmt_vec_info to TARGET_SIMD_CLONE_USABLE to make sure the > target can reject a simd_clone based on the vector mode it is using. > This is needed because for VLS SVE vectorization the vectorizer accepts > Advanced SIMD simd clones when vectorizing using SVE types because the > simdlens > might match. This will cause type errors later on. > > Other targets do not currently need to use this argument. > > gcc/ChangeLog: > > * target.def (TARGET_SIMD_CLONE_USABLE): Add argument. > * tree-vect-stmts.cc (vectorizable_simd_clone_call): Pass stmt_info to > call TARGET_SIMD_CLONE_USABLE.
Pass vector mode ... here and in the cover letter. Note tm.texi as regenerated. Otherwise this is OK now. Richard. > * config/aarch64/aarch64.cc (aarch64_simd_clone_usable): Add argument > and use it to reject the use of SVE simd clones with Advanced SIMD > modes. > * config/gcn/gcn.cc (gcn_simd_clone_usable): Add unused argument. > * config/i386/i386.cc (ix86_simd_clone_usable): Likewise. > --- > gcc/config/aarch64/aarch64.cc | 4 ++-- > gcc/config/gcn/gcn.cc | 3 ++- > gcc/config/i386/i386.cc | 3 ++- > gcc/doc/tm.texi | 8 ++++---- > gcc/target.def | 8 ++++---- > gcc/tree-vect-stmts.cc | 9 ++++++++- > 6 files changed, 22 insertions(+), 13 deletions(-) > > diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc > index a6cc00e74ab..1e51d0e3604 100644 > --- a/gcc/config/aarch64/aarch64.cc > +++ b/gcc/config/aarch64/aarch64.cc > @@ -29189,12 +29189,12 @@ aarch64_simd_clone_adjust (struct cgraph_node *node) > /* Implement TARGET_SIMD_CLONE_USABLE. */ > > static int > -aarch64_simd_clone_usable (struct cgraph_node *node) > +aarch64_simd_clone_usable (struct cgraph_node *node, machine_mode > vector_mode) > { > switch (node->simdclone->vecsize_mangle) > { > case 'n': > - if (!TARGET_SIMD) > + if (!TARGET_SIMD || aarch64_sve_mode_p (vector_mode)) > return -1; > return 0; > default: > diff --git a/gcc/config/gcn/gcn.cc b/gcc/config/gcn/gcn.cc > index d078392eeaf..04cbc770509 100644 > --- a/gcc/config/gcn/gcn.cc > +++ b/gcc/config/gcn/gcn.cc > @@ -5653,7 +5653,8 @@ gcn_simd_clone_adjust (struct cgraph_node *ARG_UNUSED > (node)) > /* Implement TARGET_SIMD_CLONE_USABLE. */ > > static int > -gcn_simd_clone_usable (struct cgraph_node *ARG_UNUSED (node)) > +gcn_simd_clone_usable (struct cgraph_node *ARG_UNUSED (node), > + machine_mode ARG_UNUSED (vector_mode)) > { > /* We don't need to do anything here because > gcn_simd_clone_compute_vecsize_and_simdlen currently only returns one > diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc > index 473e4cbf10e..eef12f8c9f0 100644 > --- a/gcc/config/i386/i386.cc > +++ b/gcc/config/i386/i386.cc > @@ -25555,7 +25555,8 @@ ix86_simd_clone_compute_vecsize_and_simdlen (struct > cgraph_node *node, > slightly less desirable, etc.). */ > > static int > -ix86_simd_clone_usable (struct cgraph_node *node) > +ix86_simd_clone_usable (struct cgraph_node *node, > + machine_mode) > { > switch (node->simdclone->vecsize_mangle) > { > diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi > index 4deb3d2c283..e3a85882b83 100644 > --- a/gcc/doc/tm.texi > +++ b/gcc/doc/tm.texi > @@ -6523,11 +6523,11 @@ This hook should add implicit > @code{attribute(target("..."))} attribute > to SIMD clone @var{node} if needed. > @end deftypefn > > -@deftypefn {Target Hook} int TARGET_SIMD_CLONE_USABLE (struct cgraph_node > *@var{}) > +@deftypefn {Target Hook} int TARGET_SIMD_CLONE_USABLE (struct cgraph_node > *@var{}, @var{machine_mode}) > This hook should return -1 if SIMD clone @var{node} shouldn't be used > -in vectorized loops in current function, or non-negative number if it is > -usable. In that case, the smaller the number is, the more desirable it is > -to use it. > +in vectorized loops in current function with @var{vector_mode}, or > +non-negative number if it is usable. In that case, the smaller the number > +is, the more desirable it is to use it. > @end deftypefn > > @deftypefn {Target Hook} int TARGET_SIMT_VF (void) > diff --git a/gcc/target.def b/gcc/target.def > index 523ae7ec9aa..ad8a713c14a 100644 > --- a/gcc/target.def > +++ b/gcc/target.def > @@ -1645,10 +1645,10 @@ void, (struct cgraph_node *), NULL) > DEFHOOK > (usable, > "This hook should return -1 if SIMD clone @var{node} shouldn't be used\n\ > -in vectorized loops in current function, or non-negative number if it is\n\ > -usable. In that case, the smaller the number is, the more desirable it is\n\ > -to use it.", > -int, (struct cgraph_node *), NULL) > +in vectorized loops in current function with @var{vector_mode}, or\n\ > +non-negative number if it is usable. In that case, the smaller the number\n\ > +is, the more desirable it is to use it.", > +int, (struct cgraph_node *, machine_mode), NULL) > > HOOK_VECTOR_END (simd_clone) > > diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc > index 4a824d16955..2d0da6f0a0e 100644 > --- a/gcc/tree-vect-stmts.cc > +++ b/gcc/tree-vect-stmts.cc > @@ -4155,7 +4155,14 @@ vectorizable_simd_clone_call (vec_info *vinfo, > stmt_vec_info stmt_info, > this_badness += floor_log2 (num_calls) * 4096; > if (n->simdclone->inbranch) > this_badness += 8192; > - int target_badness = targetm.simd_clone.usable (n); > + > + /* If STMT_VINFO_VECTYPE has not been set yet pass the general vector > + mode, which for targets that use it will determine what ISA we can > + vectorize this code with. */ > + machine_mode vector_mode = vinfo->vector_mode; > + if (vectype) > + vector_mode = TYPE_MODE (vectype); > + int target_badness = targetm.simd_clone.usable (n, vector_mode); > if (target_badness < 0) > continue; > this_badness += target_badness * 512; > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)