On Wed, Jul 23, 2025 at 1:37 AM Richard Biener
<richard.guent...@gmail.com> wrote:
>
> On Wed, Jul 23, 2025 at 10:05 AM Richard Sandiford
> <richard.sandif...@arm.com> wrote:
> >
> > Andrew Pinski <pins...@gmail.com> writes:
> > > On Wed, Jul 23, 2025 at 12:03 AM Richard Biener
> > > <richard.guent...@gmail.com> wrote:
> > >>
> > >> 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?
> > >
> > > I tried to describe why changing initializer_constant_valid_p won't
> > > work in the commit message:
> > >> > 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).
> > >
> > > Maybe I was not clear enough or there was not enough information there on 
> > > it.
> >
> > I suppose VLA muddies the waters a bit.  The comment above
> > initializer_constant_valid_p says:
> >
> > /* Return nonzero if VALUE is a valid constant-valued expression
> >    for use in initializing a static variable; one that can be an
> >    element of a "constant" initializer.  [...] */
> >
> > A VLA constant isn't a valid static initialiser in the sense of being
> > something that can be forced in its entirety to static memory.
> > But we do allow VLA constants to be initialised at the C/C++ (and gimple)
> > level to something in which only the minimum length gets nonzero values.
> > E.g.:
> >
> >   svint32_t x = { 1, 2, 3, 4 };
> >
> > is ok but:
> >
> >   svint32_t x = { 1, 2, 3, 4, 5 };
> >
> > isn't.  Thus we can force the leading minimum length to static memory
> > and zero-initialise the rest.
>
> That would also apply to the switch-conversion case and the patch
> is then too restrictive.
>
> > So I suppose the question is whether it's up to callers to check for
> > VLA types if they don't support partial initialisation, whether there
> > should be a new parameter to say what the caller is actually testing,
> > or something else.
>
> The predicate basically tests that output_constant can later handle
> the initializer.  If that function handles the special cases above
> then we can let those through.
>
> > FWIW, I think:
> >
> >     else if (TREE_SIZE (TREE_TYPE (val)) != INTEGER_CST)
> >
> > would be a more direct way of testing for the condition.
>
> Agreed, but as said I expected the existing initializer_constant_valid_p
> to reject VLA sizes.

I am going to take another stab at changing
initializer_constant_valid_p . If I cannot get it to work in a week, I
submit the TREE_SIZE() != INTEGER_CST patch.

Thanks,
Andrew

>
> Richard.
>
> >
> > Thanks,
> > Richard

Reply via email to