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
>

Reply via email to