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
>

Reply via email to