Re: [PATCH] avoid-store-forwarding: Reject BLKmode memory operands [PR126686]

Andrea Pinski <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <CALvbMcCW=Q+Qb9QLyUWrn_nP5uP1=N5ht-TAeeSXxn5XF-5OZA@mail.gmail.com>
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
> >
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.