Fix PR/46200
From-SVN: r166280
This commit is contained in:
parent
9451da7425
commit
2fa692c0df
4 changed files with 41 additions and 2 deletions
|
@ -1,3 +1,9 @@
|
|||
2010-11-03 Xinliang David Li <davidxl@google.com>
|
||||
|
||||
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 <kkojima@gcc.gnu.org>
|
||||
|
||||
* config.gcc (sh64*) <tm_file>: Add newlib-stdint.h for
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-11-03 Xinliang David Li <davidxl@google.com>
|
||||
|
||||
PR target/46200
|
||||
* g++.dg/tree-ssa/ivopts-2.C: New test.
|
||||
|
||||
2010-11-03 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR target/46295
|
||||
|
|
11
gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C
Normal file
11
gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C
Normal file
|
@ -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 <p" 1 "ivopts"} } */
|
||||
/* { dg-final { cleanup-tree-dump "ivopts" } } */
|
|
@ -4027,6 +4027,8 @@ get_computation_cost_at (struct ivopts_data *data,
|
|||
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_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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue