Ilya Leoshkevich <i...@linux.ibm.com> writes: > Bootstrapped and regtested on x86_64-redhat-linux. Ok for master? > > > > The following s390 rtx is errneously considered a no-op: > > (set (subreg:DF (reg:TF %f0) 8) (subreg:DF (reg:V1TF %f0) 8)) > > Here, SET_DEST is a second register in a floating-point register pair, > and SET_SRC is the second half of a vector register, so they refer to > different bits. > > Fix by treating subregs of registers in different modes conservatively. > > gcc/ChangeLog: > > 2020-09-11 Ilya Leoshkevich <i...@linux.ibm.com> > > * rtlanal.c (set_noop_p): Treat subregs of registers in > different modes conservatively. > --- > gcc/rtlanal.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c > index 5ae38b7966d..ed3360562d5 100644 > --- a/gcc/rtlanal.c > +++ b/gcc/rtlanal.c > @@ -1619,6 +1619,10 @@ set_noop_p (const_rtx set) > return 0; > src = SUBREG_REG (src); > dst = SUBREG_REG (dst); > + if (GET_MODE (src) != GET_MODE (dst)) > + /* It is hard to tell whether subregs refers to the same bits, so act > + * conservatively and return 0. */
Sorry for the nit, but GCC style is not to have leading “*”s on second and subsequent lines, so just; /* It is hard to tell whether subregs refers to the same bits, so act conservatively and return 0. */ OK with that change, thanks. Richard > + return 0; > } > > /* It is a NOOP if destination overlaps with selected src vector