re PR tree-optimization/84512 (Missed optimization: should be precalculated in compile-time)

2018-02-27  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/84512
	* tree-vect-loop.c (vect_compute_single_scalar_iteration_cost):
	Do not use the estimate returned from record_stmt_cost for
	the scalar iteration cost but sum properly using add_stmt_cost.

	* gcc.dg/tree-ssa/pr84512.c: New testcase.

From-SVN: r258036
This commit is contained in:
Richard Biener 2018-02-27 15:25:33 +00:00 committed by Richard Biener
parent c16d3e3c87
commit b1ddb654ab
4 changed files with 49 additions and 13 deletions

View File

@ -1,3 +1,10 @@
2018-02-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/84512
* tree-vect-loop.c (vect_compute_single_scalar_iteration_cost):
Do not use the estimate returned from record_stmt_cost for
the scalar iteration cost but sum properly using add_stmt_cost.
2018-02-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/84466

View File

@ -1,3 +1,8 @@
2018-02-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/84512
* gcc.dg/tree-ssa/pr84512.c: New testcase.
2018-02-27 Martin Liska <mliska@suse.cz>
PR gcov-profile/84548

View File

@ -0,0 +1,15 @@
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int foo()
{
int a[10];
for(int i = 0; i < 10; ++i)
a[i] = i*i;
int res = 0;
for(int i = 0; i < 10; ++i)
res += a[i];
return res;
}
/* { dg-final { scan-tree-dump "return 285;" "optimized" } } */

View File

@ -1384,16 +1384,10 @@ vect_compute_single_scalar_iteration_cost (loop_vec_info loop_vinfo)
{
struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo);
int nbbs = loop->num_nodes, factor, scalar_single_iter_cost = 0;
int nbbs = loop->num_nodes, factor;
int innerloop_iters, i;
/* Count statements in scalar loop. Using this as scalar cost for a single
iteration for now.
TODO: Add outer loop support.
TODO: Consider assigning different costs to different scalar
statements. */
/* Gather costs for statements in the scalar loop. */
/* FORNOW. */
innerloop_iters = 1;
@ -1437,13 +1431,28 @@ vect_compute_single_scalar_iteration_cost (loop_vec_info loop_vinfo)
else
kind = scalar_stmt;
scalar_single_iter_cost
+= record_stmt_cost (&LOOP_VINFO_SCALAR_ITERATION_COST (loop_vinfo),
factor, kind, stmt_info, 0, vect_prologue);
record_stmt_cost (&LOOP_VINFO_SCALAR_ITERATION_COST (loop_vinfo),
factor, kind, stmt_info, 0, vect_prologue);
}
}
LOOP_VINFO_SINGLE_SCALAR_ITERATION_COST (loop_vinfo)
= scalar_single_iter_cost;
/* Now accumulate cost. */
void *target_cost_data = init_cost (loop);
stmt_info_for_cost *si;
int j;
FOR_EACH_VEC_ELT (LOOP_VINFO_SCALAR_ITERATION_COST (loop_vinfo),
j, si)
{
struct _stmt_vec_info *stmt_info
= si->stmt ? vinfo_for_stmt (si->stmt) : NULL;
(void) add_stmt_cost (target_cost_data, si->count,
si->kind, stmt_info, si->misalign,
vect_body);
}
unsigned dummy, body_cost = 0;
finish_cost (target_cost_data, &dummy, &body_cost, &dummy);
destroy_cost_data (target_cost_data);
LOOP_VINFO_SINGLE_SCALAR_ITERATION_COST (loop_vinfo) = body_cost;
}