diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2017-10-13 09:58:23 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2017-10-13 09:58:23 +0000 |
commit | 8649149a3cdf939cf5d74da35eae6eb4802f9cd8 (patch) | |
tree | 00cfb30f3cf9eb032dc83d729b0f9afda961e1c7 /gcc | |
parent | 250a60f3879d2d508d0d08e9da1dfa1648e1a369 (diff) | |
download | gcc-8649149a3cdf939cf5d74da35eae6eb4802f9cd8.zip gcc-8649149a3cdf939cf5d74da35eae6eb4802f9cd8.tar.gz gcc-8649149a3cdf939cf5d74da35eae6eb4802f9cd8.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/combine.c | 6 |
2 files changed, 13 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0e29ae8..3b897e2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -2,6 +2,13 @@ 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> + * cfgexpand.c (expand_debug_expr): Use GET_MODE_UNIT_BITSIZE. (expand_debug_source_expr): Likewise. * combine.c (combine_simplify_rtx): Likewise. diff --git a/gcc/combine.c b/gcc/combine.c index aa246e6..3b96d86 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -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. */ |