https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77937 reports an ICE in SLSR where a POINTER_PLUS_EXPR occurs with a candidate increment of -1. This is supposed to be prevented by code in analyze_increments, since replacement of such a candidate is not guaranteed to be profitable. The test for this was inadequate. This patch replaces it with the correct check, determining whether the type of the candidate is a pointer type.
Bootstrapped and tested on powerpc64le-unknown-linux-gnu, committed. Thanks, Bill 2016-10-12 Bill Schmidt <wschm...@linux.vnet.ibm.com> PR tree-optimization/77937 * gimple-ssa-strength-reduction.c (analyze_increments): Use POINTER_TYPE_P on the candidate type to determine whether candidates in this chain require pointer arithmetic. Index: gcc/gimple-ssa-strength-reduction.c =================================================================== --- gcc/gimple-ssa-strength-reduction.c (revision 240946) +++ gcc/gimple-ssa-strength-reduction.c (working copy) @@ -2816,8 +2816,7 @@ analyze_increments (slsr_cand_t first_dep, machine else if (incr == 0 || incr == 1 || (incr == -1 - && (gimple_assign_rhs_code (first_dep->cand_stmt) - != POINTER_PLUS_EXPR))) + && !POINTER_TYPE_P (first_dep->cand_type))) incr_vec[i].cost = COST_NEUTRAL; /* FORNOW: If we need to add an initializer, give up if a cast from