On Mon, Feb 26, 2024 at 4:26 AM <pan2...@intel.com> wrote: > > From: Pan Li <pan2...@intel.com> > > We allowed vector type for get_stored_val when read is less than or > equal to store in previous. Unfortunately, we missed to adjust the > validate_subreg part accordingly. For vector type, we don't need to > restrict the mode size is greater than the vector register size. > > Thus, for example when gen_lowpart from E_V2SFmode to E_V4QImode, it > will have NULL_RTX(of course ICE after that) because of the mode size > is less than vector register size. That also explain that gen_lowpart > from E_V8SFmode to E_V16QImode is valid here. > > This patch would like to remove the the restriction for vector mode, to > rid of the ICE when gen_lowpart because of validate_subreg fails.
validate_subreg is a can of worms, can you try to fix the issue in DSE by avoiding to form the subreg in the first place? > The below test are passed for this patch: > > * The X86 bootstrap test. > * The fully riscv regression tests. > > gcc/ChangeLog: > > * emit-rtl.cc (validate_subreg): Bypass register size check > if the mode is vector. > > gcc/testsuite/ChangeLog: > > * gcc.dg/tree-ssa/ssa-fre-44.c: Add ftree-vectorize to trigger > the ICE. > * gcc.target/riscv/rvv/base/bug-6.c: New test. > > Signed-off-by: Pan Li <pan2...@intel.com> > --- > gcc/emit-rtl.cc | 3 ++- > gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-44.c | 2 +- > .../gcc.target/riscv/rvv/base/bug-6.c | 22 +++++++++++++++++++ > 3 files changed, 25 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/bug-6.c > > diff --git a/gcc/emit-rtl.cc b/gcc/emit-rtl.cc > index 1856fa4884f..45c6301b487 100644 > --- a/gcc/emit-rtl.cc > +++ b/gcc/emit-rtl.cc > @@ -934,7 +934,8 @@ validate_subreg (machine_mode omode, machine_mode imode, > ; > /* ??? Similarly, e.g. with (subreg:DF (reg:TI)). Though store_bit_field > is the culprit here, and not the backends. */ > - else if (known_ge (osize, regsize) && known_ge (isize, osize)) > + else if (known_ge (isize, osize) && (known_ge (osize, regsize) > + || (VECTOR_MODE_P (imode) || VECTOR_MODE_P (omode)))) > ; > /* Allow component subregs of complex and vector. Though given the below > extraction rules, it's not always clear what that means. */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-44.c > b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-44.c > index f79b4c142ae..624a00a4f32 100644 > --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-44.c > +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-44.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-O -fdump-tree-fre1" } */ > +/* { dg-options "-O -fdump-tree-fre1 -O3 -ftree-vectorize" } */ > > struct A { float x, y; }; > struct B { struct A u; }; > diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/bug-6.c > b/gcc/testsuite/gcc.target/riscv/rvv/base/bug-6.c > new file mode 100644 > index 00000000000..5bb00b8f587 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/riscv/rvv/base/bug-6.c > @@ -0,0 +1,22 @@ > +/* Test that we do not have ice when compile */ > +/* { dg-do compile } */ > +/* { dg-options "-march=rv64gcv -mabi=lp64d -O3 -ftree-vectorize" } */ > + > +struct A { float x, y; }; > +struct B { struct A u; }; > + > +extern void bar (struct A *); > + > +float > +f3 (struct B *x, int y) > +{ > + struct A p = {1.0f, 2.0f}; > + struct A *q = &x[y].u; > + > + __builtin_memcpy (&q->x, &p.x, sizeof (float)); > + __builtin_memcpy (&q->y, &p.y, sizeof (float)); > + > + bar (&p); > + > + return x[y].u.x + x[y].u.y; > +} > -- > 2.34.1 >