On Thu, Aug 7, 2025 at 2:14 PM Richard Sandiford <richard.sandif...@arm.com> wrote: > > simplify_gen_subreg rejected subregs of literal constants if > MODE_COMPOSITE_P. This was added by the fix for PR96648 in > g:c0f772894b6b3cd8ed5c5dd09d0c7917f51cf70f. Jakub said: > > As for the simplify_gen_subreg change, I think it would be desirable > to just avoid creating SUBREGs of constants on all targets and for all > constants, if simplify_immed_subreg simplified, fine, otherwise punt, > but as we are late in GCC11 development, the patch instead guards this > behavior on MODE_COMPOSITE_P (outermode) - i.e. only conversions to > powerpc{,64,64le} double double long double - and only for the cases where > simplify_immed_subreg was called. > > I'm not sure about relaxing the codes further, since subregs might > be wanted for CONST, SYMBOL_REF and LABEL_REF. But removing the > MODE_COMPOSITE_P is needed to fix PR120718, where we get an ICE > from generating a subreg of a V2SI const_vector. > > Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install?
OK. Richard. > Richard > > > gcc/ > PR rtl-optimization/120718 > * simplify-rtx.cc (simplify_context::simplify_gen_subreg): > Remove MODE_COMPOSITE_P condition. > > gcc/testsuite/ > PR rtl-optimization/120718 > * gcc.target/aarch64/sve/acle/general/pr120718.c: New test. > --- > gcc/simplify-rtx.cc | 12 ++++-------- > .../gcc.target/aarch64/sve/acle/general/pr120718.c | 12 ++++++++++++ > 2 files changed, 16 insertions(+), 8 deletions(-) > create mode 100644 > gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr120718.c > > diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc > index 8ef96b4c1c8..35070c09aa0 100644 > --- a/gcc/simplify-rtx.cc > +++ b/gcc/simplify-rtx.cc > @@ -8502,14 +8502,10 @@ simplify_context::simplify_gen_subreg (machine_mode > outermode, rtx op, > > if (GET_CODE (op) == SUBREG > || GET_CODE (op) == CONCAT > - || GET_MODE (op) == VOIDmode) > - return NULL_RTX; > - > - if (MODE_COMPOSITE_P (outermode) > - && (CONST_SCALAR_INT_P (op) > - || CONST_DOUBLE_AS_FLOAT_P (op) > - || CONST_FIXED_P (op) > - || GET_CODE (op) == CONST_VECTOR)) > + || CONST_SCALAR_INT_P (op) > + || CONST_DOUBLE_AS_FLOAT_P (op) > + || CONST_FIXED_P (op) > + || GET_CODE (op) == CONST_VECTOR) > return NULL_RTX; > > if (validate_subreg (outermode, innermode, op, byte)) > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr120718.c > b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr120718.c > new file mode 100644 > index 00000000000..9ca0938e36b > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr120718.c > @@ -0,0 +1,12 @@ > +/* { dg-options "-O2" } */ > + > +#include <arm_sve.h> > +typedef int __attribute__((vector_size(8))) v2si; > +typedef struct { int x; int y; } A; > +void bar(A a); > +void foo() > +{ > + A a; > + *(v2si *)&a = (v2si){0, (int)svcntd_pat(SV_ALL)}; > + bar(a); > +} > -- > 2.43.0 >