diff options
author | Ilya Leoshkevich <iii@linux.ibm.com> | 2020-09-09 01:23:51 +0200 |
---|---|---|
committer | Ilya Leoshkevich <iii@linux.ibm.com> | 2020-09-15 19:30:37 +0200 |
commit | d1a31689a736cdfb5e7cfa01f1168e338510e63b (patch) | |
tree | 0c90ca9e27c98e4402580771fa12ccb264fb115e | |
parent | d876184c095d6ac41e64eaf4e2c78864d2d935c1 (diff) | |
download | gcc-d1a31689a736cdfb5e7cfa01f1168e338510e63b.zip gcc-d1a31689a736cdfb5e7cfa01f1168e338510e63b.tar.gz gcc-d1a31689a736cdfb5e7cfa01f1168e338510e63b.tar.bz2 |
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 <iii@linux.ibm.com>
* rtlanal.c (set_noop_p): Treat subregs of registers in
different modes conservatively.
-rw-r--r-- | gcc/rtlanal.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 5ae38b7..01130a1 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 |