On Wed, Nov 11, 2026 at 7:11 PM Christopher Bazley <[email protected]> wrote:
>
> When parsing a _Literal expression, c_parser_gimple_postfix_expression
> previously called TYPE_VECTOR_SUBPARTS (type).to_constant () to
> determine the number of elements for which to allocate space in a
> vector. That did not work for vectors of vector-length agnostic
> type, such as the svuint8_t type defined by <arm_sve.h>.
>
> gcc/c/ChangeLog:
>
> PR c/128606
> * gimple-parser.cc (c_parser_gimple_postfix_expression):
> Substitute a call to constant_lower_bound () in place of
> to_constant ().
>
> gcc/testsuite/ChangeLog:
>
> PR c/128606
> * gcc.target/aarch64/sve/pr128606_1.c,
> gcc.target/aarch64/sve/pr128606_10.c,
> gcc.target/aarch64/sve/pr128606_11.c,
> gcc.target/aarch64/sve/pr128606_2.c,
> gcc.target/aarch64/sve/pr128606_3.c,
> gcc.target/aarch64/sve/pr128606_4.c,
> gcc.target/aarch64/sve/pr128606_5.c,
> gcc.target/aarch64/sve/pr128606_6.c,
> gcc.target/aarch64/sve/pr128606_7.c,
> gcc.target/aarch64/sve/pr128606_8.c,
> gcc.target/aarch64/sve/pr128606_9.c: New tests.
> * gcc.target/aarch64/sve/pr128606_primes.h: Shared test code.
> ---
> gcc/c/gimple-parser.cc | 3 +-
> .../gcc.target/aarch64/sve/pr128606_1.c | 6 ++
> .../gcc.target/aarch64/sve/pr128606_10.c | 6 ++
> .../gcc.target/aarch64/sve/pr128606_11.c | 6 ++
> .../gcc.target/aarch64/sve/pr128606_2.c | 6 ++
> .../gcc.target/aarch64/sve/pr128606_3.c | 6 ++
> .../gcc.target/aarch64/sve/pr128606_4.c | 6 ++
> .../gcc.target/aarch64/sve/pr128606_5.c | 6 ++
> .../gcc.target/aarch64/sve/pr128606_6.c | 6 ++
> .../gcc.target/aarch64/sve/pr128606_7.c | 6 ++
> .../gcc.target/aarch64/sve/pr128606_8.c | 6 ++
> .../gcc.target/aarch64/sve/pr128606_9.c | 6 ++
> .../gcc.target/aarch64/sve/pr128606_primes.h | 64 +++++++++++++++++++
> 13 files changed, 132 insertions(+), 1 deletion(-)
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr128606_1.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr128606_10.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr128606_11.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr128606_2.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr128606_3.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr128606_4.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr128606_5.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr128606_6.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr128606_7.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr128606_8.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr128606_9.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr128606_primes.h
>
> OK for trunk?
OK.
Richard.
> diff --git a/gcc/c/gimple-parser.cc b/gcc/c/gimple-parser.cc
> index 0e0c8ba673b..874f9d7a3b2 100644
> --- a/gcc/c/gimple-parser.cc
> +++ b/gcc/c/gimple-parser.cc
> @@ -1837,7 +1837,8 @@ c_parser_gimple_postfix_expression (gimple_parser
> &parser, tree ret_type)
> if (VECTOR_TYPE_P (type)
> && !c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
> {
> - vec_alloc (v, TYPE_VECTOR_SUBPARTS (type).to_constant
> ());
> + vec_alloc (v, constant_lower_bound (
> + TYPE_VECTOR_SUBPARTS (type)));
> do
> {
> tree val
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr128606_1.c
> b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_1.c
> new file mode 100644
> index 00000000000..a7b529216e3
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_1.c
> @@ -0,0 +1,6 @@
> +/* { dg-options "-fgimple -fdump-tree-gimple -msve-vector-bits=128" } */
> +/* { dg-final { scan-tree-dump {v = \{ 2, 3, 5, 7, 11, 13, 17, 19, (0, ){7}0
> \};} "gimple" } } */
> +
> +#define ELEM_TYPE uint8_t
> +#define NUM_PRIMES 8
> +#include "pr128606_primes.h"
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr128606_10.c
> b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_10.c
> new file mode 100644
> index 00000000000..61ca235015a
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_10.c
> @@ -0,0 +1,6 @@
> +/* { dg-options "-fgimple -fdump-tree-gimple -msve-vector-bits=512" } */
> +/* { dg-final { scan-tree-dump {v = \{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
> 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107,
> 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191,
> 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 241, 239, 233, 229,
> 227, 223, 211, 199, 197, 193 \};} "gimple" } } */
> +
> +#define ELEM_TYPE uint8_t
> +#define NUM_PRIMES 64
> +#include "pr128606_primes.h"
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr128606_11.c
> b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_11.c
> new file mode 100644
> index 00000000000..f336815f131
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_11.c
> @@ -0,0 +1,6 @@
> +/* { dg-options "-fgimple -fdump-tree-gimple -msve-vector-bits=scalable" } */
> +/* { dg-final { scan-tree-dump {v = \{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
> 31, 37, 41, 43, 47, 53, (0, ){16}\.\.\. \};} "gimple" } } */
> +
> +#define ELEM_TYPE uint8_t
> +#define NUM_PRIMES 16
> +#include "pr128606_primes.h"
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr128606_2.c
> b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_2.c
> new file mode 100644
> index 00000000000..0863e1660bb
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_2.c
> @@ -0,0 +1,6 @@
> +/* { dg-options "-fgimple -fdump-tree-gimple -msve-vector-bits=256" } */
> +/* { dg-final { scan-tree-dump {v = \{ 2, 3, 5, 7, 11, 13, 17, 19, (0,
> ){23}0 \};} "gimple" } } */
> +
> +#define ELEM_TYPE uint8_t
> +#define NUM_PRIMES 8
> +#include "pr128606_primes.h"
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr128606_3.c
> b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_3.c
> new file mode 100644
> index 00000000000..ce1a8ccc9d7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_3.c
> @@ -0,0 +1,6 @@
> +/* { dg-options "-fgimple -fdump-tree-gimple -msve-vector-bits=512" } */
> +/* { dg-final { scan-tree-dump {v = \{ 2, 3, 5, 7, 11, 13, 17, 19, (0,
> ){55}0 \};} "gimple" } } */
> +
> +#define ELEM_TYPE uint8_t
> +#define NUM_PRIMES 8
> +#include "pr128606_primes.h"
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr128606_4.c
> b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_4.c
> new file mode 100644
> index 00000000000..f2992dc821e
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_4.c
> @@ -0,0 +1,6 @@
> +/* { dg-options "-fgimple -fdump-tree-gimple -msve-vector-bits=scalable" } */
> +/* { dg-final { scan-tree-dump {v = \{ 2, 3, 5, 7, 11, 13, 17, 19, (0,
> ){8}\.\.\. \};} "gimple" } } */
> +
> +#define ELEM_TYPE uint8_t
> +#define NUM_PRIMES 8
> +#include "pr128606_primes.h"
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr128606_5.c
> b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_5.c
> new file mode 100644
> index 00000000000..f247eb18d1a
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_5.c
> @@ -0,0 +1,6 @@
> +/* { dg-options "-fgimple -fdump-tree-gimple -msve-vector-bits=128" } */
> +/* { dg-final { scan-tree-dump {v = \{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
> 31, 37, 41, 43, 47, 53 \};} "gimple" } } */
> +
> +#define ELEM_TYPE uint8_t
> +#define NUM_PRIMES 16
> +#include "pr128606_primes.h"
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr128606_6.c
> b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_6.c
> new file mode 100644
> index 00000000000..7282437db13
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_6.c
> @@ -0,0 +1,6 @@
> +/* { dg-options "-fgimple -fdump-tree-gimple -msve-vector-bits=256" } */
> +/* { dg-final { scan-tree-dump {v = \{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
> 31, 37, 41, 43, 47, 53 \};} "gimple" } } */
> +
> +#define ELEM_TYPE uint16_t
> +#define NUM_PRIMES 16
> +#include "pr128606_primes.h"
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr128606_7.c
> b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_7.c
> new file mode 100644
> index 00000000000..159ea89c583
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_7.c
> @@ -0,0 +1,6 @@
> +/* { dg-options "-fgimple -fdump-tree-gimple -msve-vector-bits=512" } */
> +/* { dg-final { scan-tree-dump {v = \{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
> 31, 37, 41, 43, 47, 53 \};} "gimple" } } */
> +
> +#define ELEM_TYPE uint32_t
> +#define NUM_PRIMES 16
> +#include "pr128606_primes.h"
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr128606_8.c
> b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_8.c
> new file mode 100644
> index 00000000000..5eb81baaf06
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_8.c
> @@ -0,0 +1,6 @@
> +/* { dg-options "-fgimple -fdump-tree-gimple -msve-vector-bits=scalable" } */
> +/* { dg-final { scan-tree-dump {v = \{ 2, 3, 5, 7, 11, 13, 17, 19, (0,
> ){8}\.\.\. \};} "gimple" } } */
> +
> +#define ELEM_TYPE uint16_t
> +#define NUM_PRIMES 8
> +#include "pr128606_primes.h"
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr128606_9.c
> b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_9.c
> new file mode 100644
> index 00000000000..4a64b097ca0
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_9.c
> @@ -0,0 +1,6 @@
> +/* { dg-options "-fgimple -fdump-tree-gimple -msve-vector-bits=256" } */
> +/* { dg-final { scan-tree-dump {v = \{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
> 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107,
> 109, 113, 127, 131 \};} "gimple" } } */
> +
> +#define ELEM_TYPE uint8_t
> +#define NUM_PRIMES 32
> +#include "pr128606_primes.h"
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr128606_primes.h
> b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_primes.h
> new file mode 100644
> index 00000000000..5f11d05cdb0
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr128606_primes.h
> @@ -0,0 +1,64 @@
> +
> +#ifndef ELEM_TYPE
> +#error "No element type defined"
> +#endif
> +
> +#include <arm_sve.h>
> +
> +#define JOIN2(A, B) A##B
> +#define JOIN(A, B) JOIN2 (A, B)
> +#define VEC_TYPE JOIN (sv, ELEM_TYPE)
> +#define LIT _Literal (typeof ((ELEM_TYPE) __COUNTER__))
> +
> +#if (NUM_PRIMES < 1) || (NUM_PRIMES > 64) || (NUM_PRIMES != (NUM_PRIMES &
> ~(NUM_PRIMES - 1)))
> +#error "Unsupported value of NUM_PRIMES"
> +#endif
> +
> +enum
> +{
> + start = __COUNTER__
> +};
> +
> +VEC_TYPE
> +__GIMPLE (startwith ("expand")) foo (void)
> +{
> + VEC_TYPE v;
> +
> + v = _Literal (VEC_TYPE){LIT 2
> +#if NUM_PRIMES > 1
> + , LIT 3
> +#endif
> +#if NUM_PRIMES > 2
> +
> + , LIT 5, LIT 7
> +#endif
> +#if NUM_PRIMES > 4
> +
> + , LIT 11, LIT 13, LIT 17, LIT 19
> +#endif
> +#if NUM_PRIMES > 8
> + , LIT 23, LIT 29, LIT 31, LIT 37, LIT 41, LIT 43,
> LIT 47, LIT 53
> +#endif
> +#if NUM_PRIMES > 16
> + , LIT 59, LIT 61, LIT 67, LIT 71, LIT 73, LIT 79,
> LIT 83, LIT 89,
> + LIT 97, LIT 101, LIT 103, LIT 107, LIT 109, LIT
> 113, LIT 127, LIT 131
> +#endif
> +#if NUM_PRIMES > 32
> + , LIT 137, LIT 139, LIT 149, LIT 151, LIT 157, LIT
> 163, LIT 167, LIT 173,
> + LIT 179, LIT 181, LIT 191, LIT 193, LIT 197, LIT
> 199, LIT 211, LIT 223,
> + LIT 227, LIT 229, LIT 233, LIT 239, LIT 241, LIT
> 251, LIT 241, LIT 239,
> + LIT 233, LIT 229, LIT 227, LIT 223, LIT 211, LIT
> 199, LIT 197, LIT 193
> +#endif
> + };
> +
> + return v;
> +}
> +
> +_Static_assert (__COUNTER__ - 1 - start == NUM_PRIMES,
> + "Incorrect number of initialisers");
> +
> +#undef JOIN
> +#undef JOIN2
> +#undef LIT
> +#undef ELEM_TYPE
> +#undef VEC_TYPE
> --
> 2.43.0
>