> >> 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?
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
rb19030.patch
Description: rb19030.patch
