Hi, While looking at PR83253, I noticed that the cost model for MULT_EXPR replacement can be improved. Right now we use mult_by_coeff_cost to determine the value of the possible replacement, but we use mul_cost to determine the savings from removing the original expression. This overcounts the savings when the expression being replaced is a multiply by a constant. In such cases we can again use mult_by_coeff_cost to determine the savings. This will reduce the chance of making an unprofitable replacement.
Bootstrapped and tested on powerpc64le-unknown-linux-gnu with no regressions. Is this okay for trunk? Thanks, Bill 2017-12-14 Bill Schmidt <wschm...@linux.vnet.ibm.com> * gimple-ssa-strength-reduction.c (analyze_increments): Distinguish replacement costs for constant strides from those for unknown strides. Index: gcc/gimple-ssa-strength-reduction.c =================================================================== --- gcc/gimple-ssa-strength-reduction.c (revision 255588) +++ gcc/gimple-ssa-strength-reduction.c (working copy) @@ -3083,7 +3083,17 @@ analyze_increments (slsr_cand_t first_dep, machine else if (first_dep->kind == CAND_MULT) { int cost = mult_by_coeff_cost (incr, mode, speed); - int repl_savings = mul_cost (speed, mode) - add_cost (speed, mode); + int repl_savings; + + if (tree_fits_shwi_p (first_dep->stride)) + { + HOST_WIDE_INT hwi_stride = tree_to_shwi (first_dep->stride); + repl_savings = mult_by_coeff_cost (hwi_stride, mode, speed); + } + else + repl_savings = mul_cost (speed, mode); + repl_savings -= add_cost (speed, mode); + if (speed) cost = lowest_cost_path (cost, repl_savings, first_dep, incr_vec[i].incr, COUNT_PHIS);