Sent a new version for this in
https://gcc.gnu.org/pipermail/gcc-patches/2024-October/665794.html.

Thanks,
Konstantinos.

On Fri, Aug 30, 2024 at 4:32 PM Richard Sandiford
<richard.sandif...@arm.com> wrote:
>
> Manolis Tsamis <manolis.tsa...@vrull.eu> writes:
> >> > I could have some help with that, because after the new changes a
> >> > subreg related ICE also happens within store_bit_field when a DI ->
> >> > V4SI case is hit. Afaik store_bit_field should just return NULL if it
> >> > can't handle something so I don't really know how to address this ICE
> >> > in the new version.
> >>
> >> I don't think store_bit_field is expected to fail.  But yeah, if you have
> >> a testcase, I can take a look.
> >>
> >
> > Yes, that was my initial reaction too. I don't yet have a reduced
> > testcase, this now only happens with SPEC2017 gcc_r when compiled with
> > `-g -O3 -march=armv8.2-a -flto=32 -favoid-store-forwarding` (doesn't
> > reproduce without flto). I have also attached the work-in-progress
> > patch that implements your changes up to that point and which can be
> > used to reproduce this, at least till we have a smaller testcase.
> >
> > The case that leads to that ICE is this:
> >
> > Store forwarding detected:
> > From: (insn 1700 1714 1701 132 (set (mem/j/c:SI (plus:DI (reg/f:DI 64 sfp)
> >                 (const_int -160 [0xffffffffffffff60])) [0 +0 S4 A128])
> >         (reg:SI 617)) "real.c":158:9 69 {*movsi_aarch64}
> >      (expr_list:REG_DEAD (reg:SI 617)
> >         (nil)))
> > From: (insn 1695 1698 1715 132 (set (mem/c:TI (plus:DI (reg/f:DI 64 sfp)
> >                 (const_int -160 [0xffffffffffffff60])) [0 MEM  [(void
> > *)&r]+0 S16 A128])
> >         (const_int 0 [0])) "real.c":157:3 75 {*movti_aarch64}
> >      (nil))
> > To: (insn 1709 1703 1696 132 (set (reg:V4SI 622 [ r ])
> >         (mem/c:V4SI (plus:DI (reg/f:DI 64 sfp)
> >                 (const_int -160 [0xffffffffffffff60])) [51 r+0 S16
> > A128])) "builtins.c":9619:13 1270 {*aarch64_simd_movv4si}
> >      (nil))
> >
> > Which is somewhat suspicious; we'll have to first make sure it's not a
> > avoid-store-forwarding bug.
>
> Does 1695 come before 1700?  If so, it looks like it should be valid.
>
> > In any case the ICE is
> >
> > builtins.c:6684:1: internal compiler error: in simplify_subreg, at
> > simplify-rtx.cc:7680
> >  6684 | }
> >       | ^
> > 0xc41ecb simplify_context::simplify_subreg(machine_mode, rtx_def*,
> > machine_mode, poly_int<2u, unsigned long>)
> >         /home/mtsamis/src/gcc/gcc4/gcc/simplify-rtx.cc:7680
> > 0xc42d0f simplify_context::simplify_gen_subreg(machine_mode, rtx_def*,
> > machine_mode, poly_int<2u, unsigned long>)
> >         /home/mtsamis/src/gcc/gcc4/gcc/simplify-rtx.cc:8007
> > 0x8afb4b simplify_gen_subreg(machine_mode, rtx_def*, machine_mode,
> > poly_int<2u, unsigned long>)
> >         /home/mtsamis/src/gcc/gcc4/gcc/rtl.h:3562
> > 0x8afb4b force_subreg(machine_mode, rtx_def*, machine_mode,
> > poly_int<2u, unsigned long>)
> >         /home/mtsamis/src/gcc/gcc4/gcc/explow.cc:755
> > 0x8b9ef3 store_bit_field_1
> >         /home/mtsamis/src/gcc/gcc4/gcc/expmed.cc:810
> > 0x8ba327 store_bit_field(rtx_def*, poly_int<2u, unsigned long>,
> > poly_int<2u, unsigned long>, poly_int<2u, unsigned long>, poly_int<2u,
> > unsigned long>, machine_mode, rtx_def*, bool, bool)
> >         /home/mtsamis/src/gcc/gcc4/gcc/expmed.cc:1214
> > 0xc53c7f generate_bit_insert_sequence
> >         /home/mtsamis/src/gcc/gcc4/gcc/avoid-store-forwarding.cc:122
> > 0xc53c7f process_store_forwarding
> >         /home/mtsamis/src/gcc/gcc4/gcc/avoid-store-forwarding.cc:231
> > 0xc53c7f avoid_store_forwarding
> >         /home/mtsamis/src/gcc/gcc4/gcc/avoid-store-forwarding.cc:504
> > 0xc546eb execute
> >         /home/mtsamis/src/gcc/gcc4/gcc/avoid-store-forwarding.cc:571
>
> OK, thanks, I'll have a go at reproducing, but it sounds like it might
> be tricky. :)
>
> >> > So, although I don't like it and it complicates things, I had to add
> >> > recog_memoized pretty much everywhere and also make sure to only emit
> >> > if all of these are successful...
> >>
> >> Do you have testcases?  emit_move_insn's job is to make the move
> >> legitimate, so it seems like the checks might be papering over an issue
> >> elsewhere.
> >>
> > I had a quick look and couldn't find an existing testcase. I'll have
> > to recheck more thoroughly in order to create a testcase (if possible
> > at all).
> > I remember that in one case the rtx provided was zero_extend and there
> > was no instruction for that so recog would fail.
>
> Ah, ok.  That might have been the bug then.  emit_move_insn should only
> be used for moving one object to another, where an "object" can be a
> constant, memory or register (including subregs of registers).
> The advantage of using it is that it works out how to make the move
> valid, given target limitations.
>
> If the instruction can be more general than that then we should just use
> gen_rtx_SET, and recog the result.
>
> Thanks,
> Richard

Reply via email to