re PR tree-optimization/64909 (Missed vectorization with bdver1)

2015-02-10  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/64909
	* tree-vect-loop.c (vect_estimate_min_profitable_iters): Properly
	pass a scalar-stmt count estimate to the cost model.
	* tree-vect-data-refs.c (vect_peeling_hash_get_lowest_cost): Likewise.

	* gcc.dg/vect/costmodel/x86_64/costmodel-pr64909.c: New testcase.

From-SVN: r220580
This commit is contained in:
Richard Biener 2015-02-10 11:48:47 +00:00 committed by Richard Biener
parent 644a47612e
commit 696814edb8
5 changed files with 42 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2015-02-10 Richard Biener <rguenther@suse.de>
PR tree-optimization/64909
* tree-vect-loop.c (vect_estimate_min_profitable_iters): Properly
pass a scalar-stmt count estimate to the cost model.
* tree-vect-data-refs.c (vect_peeling_hash_get_lowest_cost): Likewise.
2015-02-10 Alexander Monakov <amonakov@ispras.ru> 2015-02-10 Alexander Monakov <amonakov@ispras.ru>
* doc/invoke.texi (-fvar-tracking-assignments): Clarify that VTA is * doc/invoke.texi (-fvar-tracking-assignments): Clarify that VTA is

View File

@ -1,3 +1,8 @@
2015-02-10 Richard Biener <rguenther@suse.de>
PR tree-optimization/64909
* gcc.dg/vect/costmodel/x86_64/costmodel-pr64909.c: New testcase.
2015-02-10 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2015-02-10 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* gcc.dg/signbit-sa.c: New test. * gcc.dg/signbit-sa.c: New test.

View File

@ -0,0 +1,15 @@
/* { dg-do compile } */
/* { dg-require-effective-target vect_int } */
/* { dg-additional-options "-mtune=bdver1" } */
unsigned short a[32];
unsigned int b[32];
void t()
{
int i;
for (i=0;i<12;i++)
b[i]=a[i];
}
/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View File

@ -1184,10 +1184,13 @@ vect_peeling_hash_get_lowest_cost (_vect_peel_info **slot,
} }
single_iter_cost = vect_get_single_scalar_iteration_cost (loop_vinfo); single_iter_cost = vect_get_single_scalar_iteration_cost (loop_vinfo);
outside_cost += vect_get_known_peeling_cost (loop_vinfo, elem->npeel, outside_cost += vect_get_known_peeling_cost
&dummy, single_iter_cost, (loop_vinfo, elem->npeel, &dummy,
&prologue_cost_vec, /* ??? We use this cost as number of stmts with scalar_stmt cost,
&epilogue_cost_vec); thus divide by that. This introduces rounding errors, thus better
introduce a new cost kind (raw_cost? scalar_iter_cost?). */
single_iter_cost / vect_get_stmt_cost (scalar_stmt),
&prologue_cost_vec, &epilogue_cost_vec);
/* Prologue and epilogue costs are added to the target model later. /* Prologue and epilogue costs are added to the target model later.
These costs depend only on the scalar iteration cost, the These costs depend only on the scalar iteration cost, the

View File

@ -2834,6 +2834,11 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo,
statements. */ statements. */
scalar_single_iter_cost = vect_get_single_scalar_iteration_cost (loop_vinfo); scalar_single_iter_cost = vect_get_single_scalar_iteration_cost (loop_vinfo);
/* ??? Below we use this cost as number of stmts with scalar_stmt cost,
thus divide by that. This introduces rounding errors, thus better
introduce a new cost kind (raw_cost? scalar_iter_cost?). */
int scalar_single_iter_stmts
= scalar_single_iter_cost / vect_get_stmt_cost (scalar_stmt);
/* Add additional cost for the peeled instructions in prologue and epilogue /* Add additional cost for the peeled instructions in prologue and epilogue
loop. loop.
@ -2868,10 +2873,10 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo,
/* FORNOW: Don't attempt to pass individual scalar instructions to /* FORNOW: Don't attempt to pass individual scalar instructions to
the model; just assume linear cost for scalar iterations. */ the model; just assume linear cost for scalar iterations. */
(void) add_stmt_cost (target_cost_data, (void) add_stmt_cost (target_cost_data,
peel_iters_prologue * scalar_single_iter_cost, peel_iters_prologue * scalar_single_iter_stmts,
scalar_stmt, NULL, 0, vect_prologue); scalar_stmt, NULL, 0, vect_prologue);
(void) add_stmt_cost (target_cost_data, (void) add_stmt_cost (target_cost_data,
peel_iters_epilogue * scalar_single_iter_cost, peel_iters_epilogue * scalar_single_iter_stmts,
scalar_stmt, NULL, 0, vect_epilogue); scalar_stmt, NULL, 0, vect_epilogue);
} }
else else
@ -2887,7 +2892,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo,
(void) vect_get_known_peeling_cost (loop_vinfo, peel_iters_prologue, (void) vect_get_known_peeling_cost (loop_vinfo, peel_iters_prologue,
&peel_iters_epilogue, &peel_iters_epilogue,
scalar_single_iter_cost, scalar_single_iter_stmts,
&prologue_cost_vec, &prologue_cost_vec,
&epilogue_cost_vec); &epilogue_cost_vec);