From: Ilya Leoshkevich Date: Tue, 8 Sep 2020 23:23:51 +0000 (+0200) Subject: rtlanal: fix subreg handling in set_noop_p () X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d1a31689a736cdfb5e7cfa01f1168e338510e63b;p=gcc.git rtlanal: fix subreg handling in set_noop_p () 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 * rtlanal.c (set_noop_p): Treat subregs of registers in different modes conservatively. --- diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 5ae38b7966d..01130a10783 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 refer to the same bits, so act + conservatively and return 0. */ + return 0; } /* It is a NOOP if destination overlaps with selected src vector