From: Richard Biener Date: Thu, 17 Aug 2017 12:10:11 +0000 (+0000) Subject: tree-ssa-structalias.c (solve_graph): When propagating to successors update the graph... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d506d6ca5c62f430807ed42c7d57512af002640b;p=gcc.git tree-ssa-structalias.c (solve_graph): When propagating to successors update the graphs succ edges and avoid duplicate... 2017-08-17 Richard Biener * tree-ssa-structalias.c (solve_graph): When propagating to successors update the graphs succ edges and avoid duplicate work. From-SVN: r251146 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 088f312c843..e9ece893919 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-08-17 Richard Biener + + * tree-ssa-structalias.c (solve_graph): When propagating + to successors update the graphs succ edges and avoid duplicate work. + 2017-08-17 Maxim Ostapenko PR target/81861 diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index c95d1e3784b..2cca970f1e5 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -2765,20 +2765,35 @@ solve_graph (constraint_graph_t graph) unsigned eff_escaped_id = find (escaped_id); /* Propagate solution to all successors. */ + unsigned to_remove = ~0U; EXECUTE_IF_IN_NONNULL_BITMAP (graph->succs[i], 0, j, bi) { - bitmap tmp; - bool flag; - + if (to_remove != ~0U) + { + bitmap_clear_bit (graph->succs[i], to_remove); + to_remove = ~0U; + } unsigned int to = find (j); - tmp = get_varinfo (to)->solution; - flag = false; - + if (to != j) + { + /* Update the succ graph, avoiding duplicate + work. */ + to_remove = j; + if (! bitmap_set_bit (graph->succs[i], to)) + continue; + /* We eventually end up processing 'to' twice + as it is undefined whether bitmap iteration + iterates over bits set during iteration. + Play safe instead of doing tricks. */ + } /* Don't try to propagate to ourselves. */ if (to == i) continue; + bitmap tmp = get_varinfo (to)->solution; + bool flag = false; + /* If we propagate from ESCAPED use ESCAPED as placeholder. */ if (i == eff_escaped_id) @@ -2789,6 +2804,8 @@ solve_graph (constraint_graph_t graph) if (flag) bitmap_set_bit (changed, to); } + if (to_remove != ~0U) + bitmap_clear_bit (graph->succs[i], to_remove); } } }