On Tue, Jul 22, 2025 at 7:57 PM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > The switch conversion code will generate an array with VLA vector constants > in it > in some cases but this does not work as the length of the vector type is not > known > at compile time; only the min size is known. > > I tried to reject this in initializer_constant_valid_p but code from the C++ > front-end > will call initializer_constant_valid_p for `vector_arrayx4()` and then will > cause an ICE > with g++.target/aarch64/sve/pr116595.C (and > g++.target/riscv/rvv/autovec/pr116595.C). > > Built and tested for aarch64-linux-gnu. > > PR tree-optimization/121091 > > gcc/ChangeLog: > > * tree-switch-conversion.cc (switch_conversion::check_final_bb): > 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/tree-switch-conversion.cc | 3 +++ > 2 files changed, 28 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/tree-switch-conversion.cc b/gcc/tree-switch-conversion.cc > index d0882879e61..dc9f67bd272 100644 > --- a/gcc/tree-switch-conversion.cc > +++ b/gcc/tree-switch-conversion.cc > @@ -636,6 +636,9 @@ switch_conversion::check_final_bb () > val = gimple_phi_arg_def (phi, i); > if (!is_gimple_ip_invariant (val)) > reason = "non-invariant value from a case"; > + else if (VECTOR_TYPE_P (TREE_TYPE (val)) > + && !TYPE_VECTOR_SUBPARTS (TREE_TYPE (val)).is_constant > ()) > + reason = "VLA vector type";
OK with me, but then I see ... > else > { > reloc = initializer_constant_valid_p (val, TREE_TYPE (val)); ... this and wonder why initializer_constant_valid_p says a VLA vector constant is valid? Richard. > -- > 2.43.0 >