On Fri, 19 Apr 2024, Jakub Jelinek wrote: > Hi! > > On the following testcase, combine propagates the mem/v load into mem store > with the same address and then removes it, because noop_move_p says it is a > no-op move. If it was the other way around, i.e. mem/v store and mem load, > or both would be mem/v, it would be kept. > The problem is that rtx_equal_p never checks any kind of flags on the rtxes > (and I think it would be quite dangerous to change it at this point), and > set_noop_p checks side_effects_p on just one of the operands, not both. > In the MEM <- MEM set, it only checks it on the destination, in > store to ZERO_EXTRACT only checks it on the source. > > The following patch adds the missing side_effects_p checks. > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Thanks, Richard. > 2024-04-19 Jakub Jelinek <ja...@redhat.com> > > PR rtl-optimization/114768 > * rtlanal.cc (set_noop_p): Don't return true for MEM <- MEM > sets if src has side-effects or for stores into ZERO_EXTRACT > if ZERO_EXTRACT operand has side-effects. > > * gcc.dg/pr114768.c: New test. > > --- gcc/rtlanal.cc.jj 2024-02-24 12:45:28.674249100 +0100 > +++ gcc/rtlanal.cc 2024-04-18 15:09:55.199499083 +0200 > @@ -1637,12 +1637,15 @@ set_noop_p (const_rtx set) > return true; > > if (MEM_P (dst) && MEM_P (src)) > - return rtx_equal_p (dst, src) && !side_effects_p (dst); > + return (rtx_equal_p (dst, src) > + && !side_effects_p (dst) > + && !side_effects_p (src)); > > if (GET_CODE (dst) == ZERO_EXTRACT) > - return rtx_equal_p (XEXP (dst, 0), src) > - && !BITS_BIG_ENDIAN && XEXP (dst, 2) == const0_rtx > - && !side_effects_p (src); > + return (rtx_equal_p (XEXP (dst, 0), src) > + && !BITS_BIG_ENDIAN && XEXP (dst, 2) == const0_rtx > + && !side_effects_p (src) > + && !side_effects_p (XEXP (dst, 0))); > > if (GET_CODE (dst) == STRICT_LOW_PART) > dst = XEXP (dst, 0); > --- gcc/testsuite/gcc.dg/pr114768.c.jj 2024-04-18 15:37:49.139433678 > +0200 > +++ gcc/testsuite/gcc.dg/pr114768.c 2024-04-18 15:43:30.389730365 +0200 > @@ -0,0 +1,10 @@ > +/* PR rtl-optimization/114768 */ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-rtl-final" } */ > +/* { dg-final { scan-rtl-dump "\\\(mem/v:" "final" { target { ! { nvptx*-*-* > } } } } } */ > + > +void > +foo (int *p) > +{ > + *p = *(volatile int *) p; > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)