Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard.
2016-01-15 Richard Biener <rguent...@suse.de> PR tree-optimization/68961 * tree-vect-slp.c (vect_analyze_slp_cost_1): Consider cost of invariants in stores again. * gcc.dg/vect/costmodel/x86_64/costmodel-pr68961.c: New testcase. Index: gcc/tree-vect-slp.c =================================================================== --- gcc/tree-vect-slp.c (revision 232401) +++ gcc/tree-vect-slp.c (working copy) @@ -1453,18 +1453,20 @@ vect_analyze_slp_cost_1 (slp_instance in /* Record the cost for the vector loads. */ vect_model_load_cost (stmt_info, ncopies_for_cost, false, node, prologue_cost_vec, body_cost_vec); + return; } - return; } - - record_stmt_cost (body_cost_vec, ncopies_for_cost, vector_stmt, - stmt_info, 0, vect_body); - if (SLP_TREE_TWO_OPERATORS (node)) + else { 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); + 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); + } } /* Push SLP node def-type to stmts. */ Index: gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr68961.c =================================================================== --- gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr68961.c (revision 0) +++ gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr68961.c (working copy) @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-fdump-tree-slp-details" } */ + +struct x { double d[2]; }; + +struct x +pack (double a, double aa) +{ + struct x u; + u.d[0] = a; + u.d[1] = aa; + return u; +} + +/* { dg-final { scan-tree-dump-times "vectorization is not profitable" 1 "slp2" } } */