re PR tree-optimization/68892 (Excessive dead loads produced by BB vectorization)
2015-12-16 Richard Biener <rguenther@suse.de> PR tree-optimization/68892 * tree-vect-slp.c (vect_analyze_slp_cost_1): Properly compute cost for permuted loads. * gcc.dg/vect/bb-slp-pr68892.c: New testcase. From-SVN: r231674
This commit is contained in:
parent
8ec0963c81
commit
8155f4d8cf
4 changed files with 48 additions and 27 deletions
|
@ -1,3 +1,9 @@
|
|||
2015-12-16 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/68892
|
||||
* tree-vect-slp.c (vect_analyze_slp_cost_1): Properly compute
|
||||
cost for permuted loads.
|
||||
|
||||
2015-12-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/65980
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2015-12-16 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/68892
|
||||
* gcc.dg/vect/bb-slp-pr68892.c: New testcase.
|
||||
|
||||
2015-12-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/65980
|
||||
|
|
16
gcc/testsuite/gcc.dg/vect/bb-slp-pr68892.c
Normal file
16
gcc/testsuite/gcc.dg/vect/bb-slp-pr68892.c
Normal file
|
@ -0,0 +1,16 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-additional-options "-fvect-cost-model=dynamic" } */
|
||||
|
||||
double a[128][128];
|
||||
double b[128];
|
||||
|
||||
void foo(void)
|
||||
{
|
||||
b[0] = a[0][0];
|
||||
b[1] = a[1][0];
|
||||
b[2] = a[2][0];
|
||||
b[3] = a[3][0];
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump "not profitable" "slp2" } } */
|
||||
/* { dg-final { scan-tree-dump-times "Basic block will be vectorized" 0 "slp2" } } */
|
|
@ -1402,10 +1402,9 @@ vect_analyze_slp_cost_1 (slp_instance instance, slp_tree node,
|
|||
{
|
||||
unsigned i, j;
|
||||
slp_tree child;
|
||||
gimple *stmt, *s;
|
||||
gimple *stmt;
|
||||
stmt_vec_info stmt_info;
|
||||
tree lhs;
|
||||
unsigned group_size = SLP_INSTANCE_GROUP_SIZE (instance);
|
||||
|
||||
/* Recurse down the SLP tree. */
|
||||
FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child)
|
||||
|
@ -1424,44 +1423,39 @@ vect_analyze_slp_cost_1 (slp_instance instance, slp_tree node,
|
|||
node, prologue_cost_vec, body_cost_vec);
|
||||
else
|
||||
{
|
||||
int i;
|
||||
gcc_checking_assert (DR_IS_READ (STMT_VINFO_DATA_REF (stmt_info)));
|
||||
/* If the load is permuted then the alignment is determined by
|
||||
the first group element not by the first scalar stmt DR. */
|
||||
if (SLP_TREE_LOAD_PERMUTATION (node).exists ())
|
||||
{
|
||||
/* If the load is permuted then the alignment is determined by
|
||||
the first group element not by the first scalar stmt DR. */
|
||||
stmt = GROUP_FIRST_ELEMENT (stmt_info);
|
||||
stmt_info = vinfo_for_stmt (stmt);
|
||||
/* Record the cost for the permutation. */
|
||||
record_stmt_cost (body_cost_vec, ncopies_for_cost, vec_perm,
|
||||
stmt_info, 0, vect_body);
|
||||
/* And adjust the number of loads performed. */
|
||||
unsigned nunits
|
||||
= TYPE_VECTOR_SUBPARTS (STMT_VINFO_VECTYPE (stmt_info));
|
||||
ncopies_for_cost
|
||||
= (GROUP_SIZE (stmt_info) - GROUP_GAP (stmt_info)
|
||||
+ nunits - 1) / nunits;
|
||||
ncopies_for_cost *= SLP_INSTANCE_UNROLLING_FACTOR (instance);
|
||||
}
|
||||
/* Record the cost for the vector loads. */
|
||||
vect_model_load_cost (stmt_info, ncopies_for_cost, false,
|
||||
node, prologue_cost_vec, body_cost_vec);
|
||||
/* If the load is permuted record the cost for the permutation.
|
||||
??? Loads from multiple chains are let through here only
|
||||
for a single special case involving complex numbers where
|
||||
in the end no permutation is necessary. */
|
||||
FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, s)
|
||||
if ((STMT_VINFO_GROUP_FIRST_ELEMENT (vinfo_for_stmt (s))
|
||||
== STMT_VINFO_GROUP_FIRST_ELEMENT (stmt_info))
|
||||
&& vect_get_place_in_interleaving_chain
|
||||
(s, STMT_VINFO_GROUP_FIRST_ELEMENT (stmt_info)) != i)
|
||||
{
|
||||
record_stmt_cost (body_cost_vec, group_size, vec_perm,
|
||||
stmt_info, 0, vect_body);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
||||
record_stmt_cost (body_cost_vec, ncopies_for_cost, vector_stmt,
|
||||
stmt_info, 0, vect_body);
|
||||
if (SLP_TREE_TWO_OPERATORS (node))
|
||||
{
|
||||
record_stmt_cost (body_cost_vec, ncopies_for_cost, vector_stmt,
|
||||
stmt_info, 0, vect_body);
|
||||
if (SLP_TREE_TWO_OPERATORS (node))
|
||||
{
|
||||
record_stmt_cost (body_cost_vec, ncopies_for_cost, vector_stmt,
|
||||
stmt_info, 0, vect_body);
|
||||
record_stmt_cost (body_cost_vec, ncopies_for_cost, vec_perm,
|
||||
stmt_info, 0, vect_body);
|
||||
}
|
||||
record_stmt_cost (body_cost_vec, ncopies_for_cost, vec_perm,
|
||||
stmt_info, 0, vect_body);
|
||||
}
|
||||
|
||||
/* Push SLP node def-type to stmts. */
|
||||
|
|
Loading…
Add table
Reference in a new issue