On Thu, Aug 20, 2026 at 11:25 AM Andrea Pinski
<[email protected]> wrote:
>
> On Thu, Aug 20, 2026 at 7:07 AM Konstantinos Eleftheriou
> <[email protected]> wrote:
> >
> > Memory operands were only rejected when their size is unknown or
> > non-constant, so a BLKmode store with a known size could become a
> > forwarding candidate. Building the bit insert sequence for it asserts
> > in store_bit_field, as BLKmode has no corresponding integer mode.
> > Reject such memory when collecting candidates.
> >
> > PR rtl-optimization/126686
> >
> > gcc/ChangeLog:
> >
> > * avoid-store-forwarding.cc
> > (store_forwarding_analyzer::avoid_store_forwarding): Reject
> > BLKmode stores and loads as forwarding candidates.
> >
> > gcc/testsuite/ChangeLog:
> >
> > * gcc.target/s390/pr126686.c: New test.
> > ---
> > gcc/avoid-store-forwarding.cc | 10 +++++++---
> > gcc/testsuite/gcc.target/s390/pr126686.c | 16 ++++++++++++++++
> > 2 files changed, 23 insertions(+), 3 deletions(-)
> > create mode 100644 gcc/testsuite/gcc.target/s390/pr126686.c
> >
> > diff --git a/gcc/avoid-store-forwarding.cc b/gcc/avoid-store-forwarding.cc
> > index 141f96c3d848..99feebafe126 100644
> > --- a/gcc/avoid-store-forwarding.cc
> > +++ b/gcc/avoid-store-forwarding.cc
> > @@ -565,11 +565,15 @@ store_forwarding_analyzer::avoid_store_forwarding
> > (basic_block bb)
> > /* The mem RTX if INSN is a store, NULL_RTX otherwise. */
> > rtx store_mem = MEM_P (SET_DEST (set)) ? SET_DEST (set) : NULL_RTX;
> >
> > - /* We cannot analyze memory RTXs that have unknown size. */
> > + /* We cannot analyze memory RTXs that have unknown size. BLKmode
> > + memory is rejected as well, as there is no mode for the forwarded
> > + value, even when its size is known. */
> > if ((store_mem && (!MEM_SIZE_KNOWN_P (store_mem)
> > - || !MEM_SIZE (store_mem).is_constant ()))
> > + || !MEM_SIZE (store_mem).is_constant ()
> > + || GET_MODE (store_mem) == BLKmode))
> > || (load_mem && (!MEM_SIZE_KNOWN_P (load_mem)
> > - || !MEM_SIZE (load_mem).is_constant ())))
> > + || !MEM_SIZE (load_mem).is_constant ()
> > + || GET_MODE (load_mem) == BLKmode)))
>
> Can you place the GET_MODE check first in the list since it should be
> the cheapest test?
> Otherwise ok.
>
>
> > {
> > store_exprs.truncate (0);
> > continue;
> > diff --git a/gcc/testsuite/gcc.target/s390/pr126686.c
> > b/gcc/testsuite/gcc.target/s390/pr126686.c
> > new file mode 100644
> > index 000000000000..ab25d109ec35
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/s390/pr126686.c
> > @@ -0,0 +1,16 @@
> > +/* PR rtl-optimization/126686 */
> > +/* { dg-do compile } */
> > +/* { dg-options "-O3 -favoid-store-forwarding" } */
Actually since the teststcase has no s390 specific thing in it should
just be added to gcc.dg instead.
Even gcc.dg/torture using `{ dg-additional-options
"-favoid-store-forwarding" }`.
> > +
> > +int tmp;
> > +short d_e;
> > +
> > +int
> > +foo ()
> > +{
> > + long f = 0;
> > + __builtin_memset ((char *) &f + sizeof f - 2, d_e, 2);
> > + tmp = f;
> > +
> > + return f;
> > +}
> > --
> > 2.55.0
> >