On Tue, Apr 8, 2025 at 2:25 PM Robin Dapp <rdapp....@gmail.com> wrote: > > Hi, > > in categorize_ctor_elements_1 we do > VECTOR_CST_NELTS (value).to_constant () > but VALUE's type can be a VLA vector (since r15-5780-g17b520a10cdaab). > > This patch uses constant_lower_bound instead. > > Bootstrapped and regtested on x86, aarch64, and power 10. > Regtested on rv64gcv_zvl512b.
OK. Richard. > Regards > Robin > > PR middle-end/116595 > > gcc/ChangeLog: > > * expr.cc (categorize_ctor_elements_1): Use > constant_lower_bound. > > gcc/testsuite/ChangeLog: > > * g++.target/riscv/rvv/autovec/pr116595.C: New test. > --- > gcc/expr.cc | 6 +++--- > gcc/testsuite/g++.target/riscv/rvv/autovec/pr116595.C | 10 ++++++++++ > 2 files changed, 13 insertions(+), 3 deletions(-) > create mode 100644 gcc/testsuite/g++.target/riscv/rvv/autovec/pr116595.C > > diff --git a/gcc/expr.cc b/gcc/expr.cc > index 2147eedad7b..3815c565e2d 100644 > --- a/gcc/expr.cc > +++ b/gcc/expr.cc > @@ -7193,9 +7193,9 @@ categorize_ctor_elements_1 (const_tree ctor, > HOST_WIDE_INT *p_nz_elts, > > case VECTOR_CST: > { > - /* We can only construct constant-length vectors using > - CONSTRUCTOR. */ > - unsigned int nunits = VECTOR_CST_NELTS (value).to_constant (); > + unsigned int nunits > + = constant_lower_bound > + (TYPE_VECTOR_SUBPARTS (TREE_TYPE (value))); > for (unsigned int i = 0; i < nunits; ++i) > { > tree v = VECTOR_CST_ELT (value, i); > diff --git a/gcc/testsuite/g++.target/riscv/rvv/autovec/pr116595.C > b/gcc/testsuite/g++.target/riscv/rvv/autovec/pr116595.C > new file mode 100644 > index 00000000000..6d509d2cf74 > --- /dev/null > +++ b/gcc/testsuite/g++.target/riscv/rvv/autovec/pr116595.C > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-options "-march=rv64gcv" } */ > + > +#include <riscv_vector.h> > + > +void > +vsseg (float *a, vfloat32mf2_t b, vfloat32mf2_t c, unsigned long vl) > +{ > + vfloat32mf2x2_t foo = vfloat32mf2x2_t (); > +} > -- > 2.49.0 >