local_cprop_find_used_regs punted on all multiword registers, with the comment:
/* Setting a subreg of a register larger than word_mode leaves the non-written words unchanged. */ But this only applies if the outer mode is smaller than the inner mode. If they're the same size then writes to the subreg are a normal full update. This patch uses df_read_modify_subreg_p instead. A later patch adds more uses of the same routine, but this part had a (positive) effect on code generation for the testsuite whereas the others seemed to be simple clean-ups. Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install? Thanks, Richard [ This patch is part of the SVE series posted here: https://gcc.gnu.org/ml/gcc/2016-11/msg00030.html ] gcc/ 2016-11-15 Richard Sandiford <richard.sandif...@arm.com> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@arm.com> * cprop.c (local_cprop_find_used_regs): Use df_read_modify_subreg_p. diff --git a/gcc/cprop.c b/gcc/cprop.c index 6b4c0b8..31868a5 100644 --- a/gcc/cprop.c +++ b/gcc/cprop.c @@ -1161,9 +1161,7 @@ local_cprop_find_used_regs (rtx *xptr, void *data) return; case SUBREG: - /* Setting a subreg of a register larger than word_mode leaves - the non-written words unchanged. */ - if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) > BITS_PER_WORD) + if (df_read_modify_subreg_p (x)) return; break;