mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 01:50:34 +08:00
Prevent invalid register mode changes in combine
This patch stops combine from changing the mode of an existing register in-place if doing so would change the size of the underlying register allocation size, as given by REGMODE_NATURAL_SIZE. Without this, many tests fail in adjust_reg_mode after SVE is added. One example is gcc.c-torture/compile/20090401-1.c. 2017-10-13 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * combine.c (can_change_dest_mode): Reject changes in REGMODE_NATURAL_SIZE. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r253717
This commit is contained in:
parent
250a60f387
commit
8649149a3c
@ -1,3 +1,10 @@
|
||||
2017-10-13 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
Alan Hayward <alan.hayward@arm.com>
|
||||
David Sherwood <david.sherwood@arm.com>
|
||||
|
||||
* combine.c (can_change_dest_mode): Reject changes in
|
||||
REGMODE_NATURAL_SIZE.
|
||||
|
||||
2017-10-13 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
Alan Hayward <alan.hayward@arm.com>
|
||||
David Sherwood <david.sherwood@arm.com>
|
||||
|
@ -2475,6 +2475,12 @@ can_change_dest_mode (rtx x, int added_sets, machine_mode mode)
|
||||
if (!REG_P (x))
|
||||
return false;
|
||||
|
||||
/* Don't change between modes with different underlying register sizes,
|
||||
since this could lead to invalid subregs. */
|
||||
if (REGMODE_NATURAL_SIZE (mode)
|
||||
!= REGMODE_NATURAL_SIZE (GET_MODE (x)))
|
||||
return false;
|
||||
|
||||
regno = REGNO (x);
|
||||
/* Allow hard registers if the new mode is legal, and occupies no more
|
||||
registers than the old mode. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user