diff --git a/gcc/testsuite/gcc.dg/vect/vect-live-slp-3.c b/gcc/testsuite/gcc.dg/vect/vect-live-slp-3.c index e37822406751b99b3e5e7b33722dcb1912483345..3caeea71ad7f8858e20a1551b8a0eef573366e96 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-live-slp-3.c +++ b/gcc/testsuite/gcc.dg/vect/vect-live-slp-3.c @@ -73,5 +73,5 @@ main (void) } /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" } } */ -/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 4 "vect" { xfail vect_variable_length } } } */ +/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 4 "vect" } } */ /* { dg-final { scan-tree-dump-times "vec_stmt_relevant_p: stmt live but not relevant" 4 "vect" } } */ diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index f77a223b0c4fc8e576de459c3c1163a31add1cea..2b3dd52a607d6e294418e04b804bd94fff7b848a 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -13594,6 +13594,7 @@ vect_analyze_stmt (vec_info *vinfo, if (!bb_vinfo && STMT_VINFO_TYPE (stmt_info) != reduc_vec_info_type && STMT_VINFO_TYPE (stmt_info) != lc_phi_info_type + && (!node || !node->ldst_lanes || SLP_TREE_CODE (node) == VEC_PERM_EXPR) && !can_vectorize_live_stmts (as_a <loop_vec_info> (vinfo), stmt_info, node, node_instance, false, cost_vec)) @@ -13756,7 +13757,10 @@ vect_transform_stmt (vec_info *vinfo, if (!slp_node && vec_stmt) gcc_assert (STMT_VINFO_VEC_STMTS (stmt_info).exists ()); - if (STMT_VINFO_TYPE (stmt_info) != store_vec_info_type) + if (STMT_VINFO_TYPE (stmt_info) != store_vec_info_type + && (!slp_node + || !slp_node->ldst_lanes + || SLP_TREE_CODE (slp_node) == VEC_PERM_EXPR)) { /* Handle stmts whose DEF is used outside the loop-nest that is being vectorized. */