From 8155f4d8cfd834e7cf1151a41fe0773477504f48 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 16 Dec 2015 09:21:04 +0000 Subject: re PR tree-optimization/68892 (Excessive dead loads produced by BB vectorization) 2015-12-16 Richard Biener 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 --- gcc/tree-vect-slp.c | 48 +++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) (limited to 'gcc/tree-vect-slp.c') diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 3fdc988..f57c859 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -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. */ -- cgit v1.1