Alexandre Oliva <ol...@adacore.com> writes: > On May 5, 2022, Segher Boessenkool <seg...@kernel.crashing.org> wrote: > >> On Thu, May 05, 2022 at 08:59:21AM +0100, Richard Sandiford wrote: >>> Alexandre Oliva via Gcc-patches <gcc-patches@gcc.gnu.org> writes: >>> I know this is the best being the enemy of the good, but given >>> that we're at the start of stage 1, would it be feasible to try >>> to get rid of (subreg (mem)) altogether for GCC 13? > >> Yes please! > > I'm not sure this is what you two had in mind, but the news I have is > not great. With this patch, x86_64 has some regressions in vector > testcases (*), and ppc64le doesn't bootstrap (tsan_interface_atomic.o > ends up with a nil SET_DEST in split all insns). aarch64 is still > building stage2. > > I'm not sure this is enough. IIRC register allocation modifies in place > pseudos that can't be assigned to hard registers, turning them into > MEMs. If that's so, SUBREGs of such pseudos will silently become > SUBREGs of MEMs, and I don't know that they are validated again and, if > so, what happens to those that fail validation.
Yeah, the changes would be a bit more invasive than this. They would touch more than just emit-rtl.cc. > I kind of feel that this is more than I can tackle ATM, so I'd > appreciate if someone else would take this up and drive this transition. OK, I'll have a go if there's time. Thanks, Richard > Disallow SUBREG of MEM > > Introduce TARGET_ALLOW_SUBREG_OF_MEM, defaulting to 0. > > Reject SUBREG of MEM regardless of alignment, unless the macro is > defined to nonzero. > > > for gcc/ChangeLog > > PR target/100106 > * emit-rtl.cc (validate_subreg) [!TARGET_ALLOW_SUBREG_OF_MEM]: > Reject SUBREG of MEM. > --- > gcc/emit-rtl.cc | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/gcc/emit-rtl.cc b/gcc/emit-rtl.cc > index 9c03e27894fff..f055179b3b8a6 100644 > --- a/gcc/emit-rtl.cc > +++ b/gcc/emit-rtl.cc > @@ -983,8 +983,12 @@ validate_subreg (machine_mode omode, machine_mode imode, > return subreg_offset_representable_p (regno, imode, offset, omode); > } > /* Do not allow SUBREG with stricter alignment than the inner MEM. */ > - else if (reg && MEM_P (reg) && STRICT_ALIGNMENT > - && MEM_ALIGN (reg) < GET_MODE_ALIGNMENT (omode)) > + else if (reg && MEM_P (reg) > +#if TARGET_ALLOW_SUBREG_OF_MEM /* ??? Reject them all eventually. */ > + && STRICT_ALIGNMENT > + && MEM_ALIGN (reg) < GET_MODE_ALIGNMENT (omode) > +#endif > + ) > return false; > > /* The outer size must be ordered wrt the register size, otherwise > > > > (*) here are the x86_64 regressions introduced by the patch: > > + FAIL: gcc.target/i386/avx-2.c (internal compiler error: in gen_rtx_SUBREG, > at emit-rtl.cc:1030) > + FAIL: gcc.target/i386/avx-2.c (test for excess errors) > + FAIL: gcc.target/i386/sse-14.c (internal compiler error: in gen_rtx_SUBREG, > at emit-rtl.cc:1030) > + FAIL: gcc.target/i386/sse-14.c (test for excess errors) > + FAIL: gcc.target/i386/sse-22.c (internal compiler error: in gen_rtx_SUBREG, > at emit-rtl.cc:1030) > + FAIL: gcc.target/i386/sse-22.c (test for excess errors) > + FAIL: gcc.target/i386/sse-22a.c (internal compiler error: in > gen_rtx_SUBREG, at emit-rtl.cc:1030) > + FAIL: gcc.target/i386/sse-22a.c (test for excess errors)