On Mon, 9 Dec 2024, Tamar Christina wrote:
> > >> So I think we can simply set const_n_elts to CONSTRUCTOR_NELTS
> > >> for vector_typed_elts_p?
> > >>
> > >
>
> Done,
>
> gcc/ChangeLog:
>
> PR target/96342
> * expr.cc (store_constructor): add support for variable-length
> vectors.
>
> Co-authored-by: Tamar Christina <[email protected]>
>
> Bootstrapped Regtested on aarch64-none-linux-gnu,
> arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
> -m32, -m64 and no issues.
>
> Ok for master?
OK unless Richard S. has any comments.
Thanks,
Richard.
> Thanks,
> Tamar
>
> -- inline copy of patch --
>
> diff --git a/gcc/expr.cc b/gcc/expr.cc
> index
> 4c6039c6608c0d9db3d1796eeab2129cb844433f..babf00f34dcf1ac81a9d2d9947350fb1c0455811
> 100644
> --- a/gcc/expr.cc
> +++ b/gcc/expr.cc
> @@ -7965,12 +7965,9 @@ store_constructor (tree exp, rtx target, int cleared,
> poly_int64 size,
>
> n_elts = TYPE_VECTOR_SUBPARTS (type);
> if (REG_P (target)
> - && VECTOR_MODE_P (mode)
> - && n_elts.is_constant (&const_n_elts))
> + && VECTOR_MODE_P (mode))
> {
> - machine_mode emode = eltmode;
> - bool vector_typed_elts_p = false;
> -
> + const_n_elts = 0;
> if (CONSTRUCTOR_NELTS (exp)
> && (TREE_CODE (TREE_TYPE (CONSTRUCTOR_ELT (exp, 0)->value))
> == VECTOR_TYPE))
> @@ -7979,23 +7976,26 @@ store_constructor (tree exp, rtx target, int cleared,
> poly_int64 size,
> gcc_assert (known_eq (CONSTRUCTOR_NELTS (exp)
> * TYPE_VECTOR_SUBPARTS (etype),
> n_elts));
> - emode = TYPE_MODE (etype);
> - vector_typed_elts_p = true;
> +
> + icode = convert_optab_handler (vec_init_optab, mode,
> + TYPE_MODE (etype));
> + const_n_elts = CONSTRUCTOR_NELTS (exp);
> + vec_vec_init_p = icode != CODE_FOR_nothing;
> }
> - icode = convert_optab_handler (vec_init_optab, mode, emode);
> - if (icode != CODE_FOR_nothing)
> + else if (exact_div (n_elts, GET_MODE_NUNITS (eltmode))
> + .is_constant (&const_n_elts))
> {
> - unsigned int n = const_n_elts;
> -
> - if (vector_typed_elts_p)
> - {
> - n = CONSTRUCTOR_NELTS (exp);
> - vec_vec_init_p = true;
> - }
> - vector = rtvec_alloc (n);
> - for (unsigned int k = 0; k < n; k++)
> - RTVEC_ELT (vector, k) = CONST0_RTX (emode);
> + /* For a non-const type vector, we check it is made up of
> + similarly non-const type vectors. */
> + icode = convert_optab_handler (vec_init_optab, mode, eltmode);
> }
> +
> + if (const_n_elts && icode != CODE_FOR_nothing)
> + {
> + vector = rtvec_alloc (const_n_elts);
> + for (unsigned int k = 0; k < const_n_elts; k++)
> + RTVEC_ELT (vector, k) = CONST0_RTX (eltmode);
> + }
> }
>
> /* Compute the size of the elements in the CTOR. It differs
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)