This patch makes the var-tracking.c handling of autoinc addresses cope with polynomial mode sizes.
2017-10-23 Richard Sandiford <richard.sandif...@linaro.org> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@arm.com> gcc/ * var-tracking.c (adjust_mems): Treat mode sizes as polynomial. Use plus_constant instead of gen_rtx_PLUS. Index: gcc/var-tracking.c =================================================================== --- gcc/var-tracking.c 2017-10-23 17:16:59.708267276 +0100 +++ gcc/var-tracking.c 2017-10-23 17:25:40.610779914 +0100 @@ -1016,6 +1016,7 @@ adjust_mems (rtx loc, const_rtx old_rtx, machine_mode mem_mode_save; bool store_save; scalar_int_mode tem_mode, tem_subreg_mode; + poly_int64 size; switch (GET_CODE (loc)) { case REG: @@ -1060,11 +1061,9 @@ adjust_mems (rtx loc, const_rtx old_rtx, return mem; case PRE_INC: case PRE_DEC: - addr = gen_rtx_PLUS (GET_MODE (loc), XEXP (loc, 0), - gen_int_mode (GET_CODE (loc) == PRE_INC - ? GET_MODE_SIZE (amd->mem_mode) - : -GET_MODE_SIZE (amd->mem_mode), - GET_MODE (loc))); + size = GET_MODE_SIZE (amd->mem_mode); + addr = plus_constant (GET_MODE (loc), XEXP (loc, 0), + GET_CODE (loc) == PRE_INC ? size : -size); /* FALLTHRU */ case POST_INC: case POST_DEC: @@ -1072,12 +1071,10 @@ adjust_mems (rtx loc, const_rtx old_rtx, addr = XEXP (loc, 0); gcc_assert (amd->mem_mode != VOIDmode && amd->mem_mode != BLKmode); addr = simplify_replace_fn_rtx (addr, old_rtx, adjust_mems, data); - tem = gen_rtx_PLUS (GET_MODE (loc), XEXP (loc, 0), - gen_int_mode ((GET_CODE (loc) == PRE_INC - || GET_CODE (loc) == POST_INC) - ? GET_MODE_SIZE (amd->mem_mode) - : -GET_MODE_SIZE (amd->mem_mode), - GET_MODE (loc))); + size = GET_MODE_SIZE (amd->mem_mode); + tem = plus_constant (GET_MODE (loc), XEXP (loc, 0), + (GET_CODE (loc) == PRE_INC + || GET_CODE (loc) == POST_INC) ? size : -size); store_save = amd->store; amd->store = false; tem = simplify_replace_fn_rtx (tem, old_rtx, adjust_mems, data);