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.
This commit is contained in:
Ilya Leoshkevich 2020-09-09 01:23:51 +02:00
parent d876184c09
commit d1a31689a7

View file

@ -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