Re: [PATCH] avoid-store-forwarding: Reject BLKmode memory operands [PR126686]
Andrea Pinski <[email protected]>
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <CALvbMcCOe898_fg6i3xcvnieH5PabpORFf+ynw6MO0oA40OwCQ@mail.gmail.com> |
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" } */ > + > +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 >