summaryrefslogtreecommitdiff
path: root/gcc/tree-vect-slp.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-11-25 11:38:37 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-11-25 11:38:37 +0000
commitc6aef8d8009e324c971b892e8fa3c163bfdf6ba1 (patch)
tree5f3d6d1470165dfc27ce4e6138b4afbe58cd3bc3 /gcc/tree-vect-slp.c
parent6349e4f04ca6ccb060fdfc496bf8cf6366a5a5d1 (diff)
tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Add assertion.
2019-11-25 Richard Biener <rguenther@suse.de> * 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
Diffstat (limited to 'gcc/tree-vect-slp.c')
-rw-r--r--gcc/tree-vect-slp.c21
1 files changed, 15 insertions, 6 deletions
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<slp_tree, unsigned> 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<slp_tree, unsigned> 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;
}
}