Variable-length Vector initializer constructors currently only work in
non-debug mode. It ICEs when compiled with -g. This patch fixes it to handle
variable-length vector intialization by limiting the constructor elements to
the lower bound of the variable length poly which is also the maximum number
of elements allowed in the initializer.
PR middle-end/123392
gcc/
* cfgexpand.cc (expand_debug_expr): Handle variable-length initializer
for CONSTRUCTOR.
gcc/testsuite/
* gcc.target/aarch64/sve/acle/general/pr123392.c: New.
else if (TREE_CODE (TREE_TYPE (exp)) == VECTOR_TYPE)
{
unsigned i;
- unsigned HOST_WIDE_INT nelts;
+ poly_uint64 elts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp));
+ unsigned HOST_WIDE_INT nelts = constant_lower_bound (elts);
tree val;
- if (!TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp)).is_constant (&nelts))
- goto flag_unsupported;
-
op0 = gen_rtx_CONCATN (mode, rtvec_alloc (nelts));
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), i, val)
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3 -g" } */
+
+#include <arm_sve.h>
+
+svint32_t res (int32_t *a)
+{
+ svint32_t s = { a[0], a[1], a[2], a[3] };
+ return s;
+}