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 <tamar.christ...@arm.com> > > 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 <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)