The switch conversion code asks initializer_constant_valid_p if the expression is a valid initializer constant and for vector types which have a non-constant elements initializer_constant_valid_p would return it is valid. But it should be rejected as not being valid for an initializer.
Build and tested for aarch64-linux-gnu. PR tree-optimization/121091 gcc/ChangeLog: * varasm.cc (initializer_constant_valid_p_1): Reject vector types which have a non-constant number of elements. gcc/testsuite/ChangeLog: * gcc.target/aarch64/sve/pr121091-1.c: New test. Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> --- .../gcc.target/aarch64/sve/pr121091-1.c | 25 +++++++++++++++++++ gcc/varasm.cc | 5 ++++ 2 files changed, 30 insertions(+) create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr121091-1.c diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr121091-1.c b/gcc/testsuite/gcc.target/aarch64/sve/pr121091-1.c new file mode 100644 index 00000000000..ea2e5ce6b6a --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr121091-1.c @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +/* PR tree-optimization/121091 */ +/* Switch conversion would convert this + into static constant array but since + svbool_t is a VLA type, it can't be + stored in a constant pool. */ + +#include "arm_sve.h" + +svbool_t e(int mode, svbool_t pg) { + switch (mode) { + case 0: + pg = svptrue_pat_b16(SV_VL6); + break; + case 1: + pg = svpfalse_b(); + break; + case 2: + pg = svptrue_pat_b16(SV_VL2); + break; + } + return pg; +} diff --git a/gcc/varasm.cc b/gcc/varasm.cc index 10c1d2e3137..36b7cd8812d 100644 --- a/gcc/varasm.cc +++ b/gcc/varasm.cc @@ -5001,6 +5001,11 @@ initializer_constant_valid_p_1 (tree value, tree endtype, tree *cache) { tree ret; + /* Variable sized vectors are never valid for initializers. */ + if (VECTOR_TYPE_P (endtype) + && !TYPE_VECTOR_SUBPARTS (endtype).is_constant ()) + return NULL_TREE; + switch (TREE_CODE (value)) { case CONSTRUCTOR: -- 2.43.0