From c6aef8d8009e324c971b892e8fa3c163bfdf6ba1 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 25 Nov 2019 11:38:37 +0000 Subject: [PATCH] tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Add assertion. 2019-11-25 Richard Biener * tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Add assertion. (vect_detect_hybrid_slp): Swap lane and instance iteration, properly re-building the visited hash-map for each lane. From-SVN: r278679 --- gcc/ChangeLog | 6 ++++++ gcc/tree-vect-slp.c | 21 +++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9b0169bb80d..6dee39e6823 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-11-25 Richard Biener + + * tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Add assertion. + (vect_detect_hybrid_slp): Swap lane and instance iteration, + properly re-building the visited hash-map for each lane. + 2019-11-25 Tobias Burnus * config/gcn/gcn.c (gcn_expand_scalar_to_vector_address, diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index a94d2d42491..bedbe9ac978 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -2542,7 +2542,9 @@ vect_detect_hybrid_slp_stmts (slp_tree node, unsigned i, slp_vect_type stype, /* We need to union stype over the incoming graph edges but we still want to limit recursion to stay O(N+E). */ - bool only_edge = (++visited.get_or_insert (node) < node->refcnt); + unsigned visited_cnt = ++visited.get_or_insert (node); + gcc_assert (visited_cnt <= node->refcnt); + bool only_edge = (visited_cnt != node->refcnt); /* Propagate hybrid down the SLP tree. */ if (stype == hybrid) @@ -2680,12 +2682,19 @@ vect_detect_hybrid_slp (loop_vec_info loop_vinfo) /* Then walk the SLP instance trees marking stmts with uses in non-SLP stmts as hybrid, also propagating hybrid down the SLP tree, collecting the above info on-the-fly. */ - hash_map visited; - FOR_EACH_VEC_ELT (slp_instances, i, instance) + for (unsigned j = 0;; ++j) { - for (unsigned i = 0; i < SLP_INSTANCE_GROUP_SIZE (instance); ++i) - vect_detect_hybrid_slp_stmts (SLP_INSTANCE_TREE (instance), - i, pure_slp, visited); + hash_map visited; + bool any = false; + FOR_EACH_VEC_ELT (slp_instances, i, instance) + if (j < SLP_INSTANCE_GROUP_SIZE (instance)) + { + any = true; + vect_detect_hybrid_slp_stmts (SLP_INSTANCE_TREE (instance), + j, pure_slp, visited); + } + if (!any) + break; } } -- 2.30.2