On Mon, 18 Nov 2024, Victor Do Nascimento wrote:

> On 11/5/24 07:39, Richard Biener wrote:
> > On Tue, 5 Nov 2024, Victor Do Nascimento wrote:
> > 
> >> The current codegen code to support VF's that are multiples of a simdclone
> >> simdlen rely on BIT_FIELD_REF to create multiple input vectors.  This does
> >> not
> >> work for non-constant simdclones, so we should disable using such clones
> >> when
> >> the VF is a multiple of the non-constant simdlen until we change the
> >> codegen to
> >> support those.
> > 
> > ISTR BIT_FIELD_REF now uses poly-int offset and size so what breaks
> > here?  I don't see any other way that such BIT_FIELD_REFs to represent
> > hi/lo part accesses?
> > 
> > Richard.
> 
> Upon further investigation, while you are right that BIT_FIELD_REF does
> use poly-int types for both offsets and sizes, much of the expand code
> does not know how to deal with variable-len vectors.
> 
> One such example of this is in `store_constructor_field' where, after
> having called our simdclone fn twice passing it the high and low parts
> of an SVE vec as an argument, we try to concatenate the returned
> subvectors back together.
> 
> In `store_constructor', for example, many updates from integer operators
> to their poly_int64 counterparts are needed (though this is trivial) and
> in other parts new logic is needed altogether.
> 
> One example of this can be seen in `store_bit_field_1', where you see
> the following statments:
> 
>   unsigned HOST_WIDE_INT ibitsize = bitsize.to_constant ();
>   unsigned HOST_WIDE_INT ibitnum = bitnum.to_constant ();
> 
> which will ICE for variable-length bitsizes and bitnums and which guard
> the subsequent section of code from trying to handle non-const lens.

But since BIT_FIELD_REFs with poly-int offset/size are now a thing
we have to fix all those places.  Or revert back to not allowing
them.

We at least need to guard the problematic code appropriately.

> Therefore, while I believe that the full support for poly-int
> BIT_FIELD_REFs is appropriate and something that ought to be done, the
> 
>   if (!n->simdclone->simdlen.is_constant () && num_calls != 1)
> 
> guard in this patch is, at least for now, strictly necessary and can be
> readily removed once work on BIT_FIELD_REF is completed.

GCCs history tells us this will never happen ;)  Given this is for
a new feature I insist you try a bit harder and fixup the places that
ICE (if only by guarding them with .is_constant ()).  Those parts will
be helpful even if in the end you don't succeed with bug-squashing.

Richard.

> Regards,
> Victor
> 
> >> gcc/ChangeLog:
> >>
> >>  * tree-vect-stmts.cc (vectorizable_simd_clone_call): Reject simdclones
> >>  with non-constant simdlen when VF is not exactly the same.
> >> ---
> >>   gcc/tree-vect-stmts.cc | 5 ++++-
> >>   1 file changed, 4 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> >> index 2d0da6f0a0e..961421fee25 100644
> >> --- a/gcc/tree-vect-stmts.cc
> >> +++ b/gcc/tree-vect-stmts.cc
> >> @@ -4149,7 +4149,10 @@ vectorizable_simd_clone_call (vec_info *vinfo,
> >> stmt_vec_info stmt_info,
> >>    if (!constant_multiple_p (vf * group_size, n->simdclone->simdlen,
> >>         &num_calls)
> >>        || (!n->simdclone->inbranch && (masked_call_offset > 0))
> >> -      || (nargs != simd_nargs))
> >> +      || (nargs != simd_nargs)
> >> +      /* Currently we do not support multiple calls of non-constant
> >> +         simdlen as poly vectors can not be accessed by BIT_FIELD_REF.
> >> */
> >> +      || (!n->simdclone->simdlen.is_constant () && num_calls != 1))
> >>      continue;
> >>    if (num_calls != 1)
> >>      this_badness += floor_log2 (num_calls) * 4096;
> >>
> > 
> 
> 

-- 
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)

Reply via email to