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.
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.
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;