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.
Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu. Also tested by comparing the testsuite assembly output on at least one target per CPU directory. OK to install? Richard 2017-09-18 Richard Sandiford <richard.sandif...@linaro.org> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@arm.com> gcc/ * combine.c (can_change_dest_mode): Reject changes in REGMODE_NATURAL_SIZE. Index: gcc/combine.c =================================================================== --- gcc/combine.c 2017-09-18 12:31:05.459555526 +0100 +++ gcc/combine.c 2017-09-18 12:31:05.604645232 +0100 @@ -2451,6 +2451,12 @@ can_change_dest_mode (rtx x, int added_s 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. */