Index: gcc/tree-ssa-loop-ivopts.c =================================================================== --- gcc/tree-ssa-loop-ivopts.c (revision 166032) +++ gcc/tree-ssa-loop-ivopts.c (working copy) @@ -4027,6 +4027,8 @@ get_computation_cost_at (struct ivopts_d STRIP_NOPS (cbase); ctype = TREE_TYPE (cbase); + stmt_is_after_inc = stmt_after_increment (data->current_loop, cand, at); + /* use = ubase + ratio * (var - cbase). If either cbase is a constant or ratio == 1, it is better to handle this like @@ -4045,8 +4047,24 @@ get_computation_cost_at (struct ivopts_d } else if (ratio == 1) { + tree real_cbase = cbase; + + /* Check to see if any adjustment is needed. */ + if (cstepi == 0 && stmt_is_after_inc) + { + aff_tree real_cbase_aff; + aff_tree cstep_aff; + + tree_to_aff_combination (cbase, TREE_TYPE (real_cbase), + &real_cbase_aff); + tree_to_aff_combination (cstep, TREE_TYPE (cstep), &cstep_aff); + + aff_combination_add (&real_cbase_aff, &cstep_aff); + real_cbase = aff_combination_to_tree (&real_cbase_aff); + } + cost = difference_cost (data, - ubase, cbase, + ubase, real_cbase, &symbol_present, &var_present, &offset, depends_on); cost.cost /= avg_loop_niter (data->current_loop); @@ -4088,7 +4106,6 @@ get_computation_cost_at (struct ivopts_d /* If we are after the increment, the value of the candidate is higher by one iteration. */ - stmt_is_after_inc = stmt_after_increment (data->current_loop, cand, at); if (stmt_is_after_inc) offset -= ratio * cstepi;