aboutsummaryrefslogtreecommitdiff
path: root/gcc/rtlanal.c
diff options
context:
space:
mode:
authorIlya Leoshkevich <iii@linux.ibm.com>2020-09-09 01:23:51 +0200
committerIlya Leoshkevich <iii@linux.ibm.com>2020-09-15 19:30:37 +0200
commitd1a31689a736cdfb5e7cfa01f1168e338510e63b (patch)
tree0c90ca9e27c98e4402580771fa12ccb264fb115e /gcc/rtlanal.c
parentd876184c095d6ac41e64eaf4e2c78864d2d935c1 (diff)
downloadgcc-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.
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r--gcc/rtlanal.c4
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