diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cff9dd8aa85..a8d12c41191 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-11-03 Xinliang David Li + + PR target/46200 + * tree-ssa-loop-ivopts.c (get_computation_cost_at): + Adjust cbase if the use stmt is after iv update. + 2010-11-03 Kaz Kojima * config.gcc (sh64*) : Add newlib-stdint.h for diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a602ecf6339..fb9eb65b846 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-03 Xinliang David Li + + PR target/46200 + * g++.dg/tree-ssa/ivopts-2.C: New test. + 2010-11-03 H.J. Lu PR target/46295 diff --git a/gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C b/gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C new file mode 100644 index 00000000000..908299d98e8 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C @@ -0,0 +1,11 @@ +/* { dg-do compile { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-options "-O2 -fdump-tree-ivopts-details" } */ + +void test (int *b, int *e, int stride) + { + for (int *p = b; p != e; p += stride) + *p = 1; + } + +/* { dg-final { scan-tree-dump-times "PHI 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_data *data, } 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_data *data, /* 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;