On Wed, 2025-05-28 at 18:17 +0100, Richard Sandiford wrote:
> Sorry for the slow reply, had a few days off.
> 
> Xi Ruoyao <xry...@xry111.site> writes:
> > If we see a promoted subreg and TRULY_NOOP_TRUNCATION says the
> > truncation is not a noop, then all bits of the inner reg are live.  We
> > cannot reduce the live mask to that of the mode of the subreg.
> > 
> > gcc/ChangeLog:
> > 
> >     PR rtl-optimization/120050
> >     * ext-dce.cc (ext_dce_process_uses): Break early if a SUBREG in
> >     rhs is promoted and the truncation from the inner mode to the
> >     outer mode is not a noop when handling SETs.
> > ---
> > 
> > Bootstrapped on mips64el-linux-gnuabi64.  Ok for trunk?
> > 
> >  gcc/ext-dce.cc | 12 ++++++++++--
> >  1 file changed, 10 insertions(+), 2 deletions(-)
> > 
> > diff --git a/gcc/ext-dce.cc b/gcc/ext-dce.cc
> > index a0343950141..3b21e68b90c 100644
> > --- a/gcc/ext-dce.cc
> > +++ b/gcc/ext-dce.cc
> > @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3.  If not see
> >  #include "print-rtl.h"
> >  #include "dbgcnt.h"
> >  #include "diagnostic-core.h"
> > +#include "target.h"
> >  
> >  /* These should probably move into a C++ class.  */
> >  static vec<bitmap_head> livein;
> > @@ -764,13 +765,20 @@ ext_dce_process_uses (rtx_insn *insn, rtx obj,
> >                      We don't want to mark those bits live unnecessarily
> >                      as that inhibits extension elimination in important
> >                      cases such as those in Coremark.  So we need that
> > -                    outer code.  */
> > +                    outer code.
> > +
> > +                    But if !TRULY_NOOP_TRUNCATION_MODES_P, those bits
> > +                    may be actually alive with any promoted subreg
> > +                    regardless of the outer code.  See PR 120050.  */
> 
> How about expanding on this a bit:
> 
>                          If !TRULY_NOOP_TRUNCATION_MODES_P holds true for
>                          the subreg, then the mode change performed by Y
>                          would normally need to be a TRUNCATE rather than
>                          a SUBREG.  It is probably the guarantee provided
>                          by SUBREG_PROMOTED_VAR_P that allows the SUBREG
>                          in Y as an exception.  We must therefore preserve
>                          that guarantee and treat the upper bits of the
>                          inner register as live regardless of the outer code.
>                          See PR 120050.  */
> 
> OK with that change, thanks.

Pushed r16-1110 with the comment updated.

Will wait for a few days before backporting to 15.

-- 
Xi Ruoyao <xry...@xry111.site>
School of Aerospace Science and Technology, Xidian University

Reply via email to