diff options
author | Richard Biener <rguenther@suse.de> | 2019-07-30 12:13:01 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-07-30 12:13:01 +0000 |
commit | 029ca38849484689c7cea5757f6eb646404264ec (patch) | |
tree | 3c7bc0b1c1505b914d58c1536b246f7b13179c1d /gcc/tree-ssa-structalias.c | |
parent | 1da8ab97a129ded60471ffcc2595ddce67336cd8 (diff) | |
download | gcc-029ca38849484689c7cea5757f6eb646404264ec.zip gcc-029ca38849484689c7cea5757f6eb646404264ec.tar.gz gcc-029ca38849484689c7cea5757f6eb646404264ec.tar.bz2 |
re PR tree-optimization/91257 (Compile-time and memory-hog hog)
2019-07-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/91257
* bitmap.h (bitmap_ior_into_and_free): Declare.
* bitmap.c (bitmap_list_unlink_element): Add defaulted param
whether to add the unliked element to the freelist.
(bitmap_list_insert_element_after): Add defaulted param for
an already allocated element.
(bitmap_ior_into_and_free): New function.
* tree-ssa-structalias.c (condense_visit): Reduce the
ponts-to and edge bitmaps of the SCC members in a
logarithmic fashion rather than all to one.
From-SVN: r273907
Diffstat (limited to 'gcc/tree-ssa-structalias.c')
-rw-r--r-- | gcc/tree-ssa-structalias.c | 87 |
1 files changed, 62 insertions, 25 deletions
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index f8962d6..974b639 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -2071,36 +2071,73 @@ condense_visit (constraint_graph_t graph, class scc_info *si, unsigned int n) /* See if any components have been identified. */ if (si->dfs[n] == my_dfs) { - while (si->scc_stack.length () != 0 - && si->dfs[si->scc_stack.last ()] >= my_dfs) + if (si->scc_stack.length () != 0 + && si->dfs[si->scc_stack.last ()] >= my_dfs) { - unsigned int w = si->scc_stack.pop (); - si->node_mapping[w] = n; - - if (!bitmap_bit_p (graph->direct_nodes, w)) - bitmap_clear_bit (graph->direct_nodes, n); - - /* Unify our nodes. */ - if (graph->preds[w]) - { - if (!graph->preds[n]) - graph->preds[n] = BITMAP_ALLOC (&predbitmap_obstack); - bitmap_ior_into (graph->preds[n], graph->preds[w]); - } - if (graph->implicit_preds[w]) + /* Find the first node of the SCC and do non-bitmap work. */ + bool direct_p = true; + unsigned first = si->scc_stack.length (); + do { - if (!graph->implicit_preds[n]) - graph->implicit_preds[n] = BITMAP_ALLOC (&predbitmap_obstack); - bitmap_ior_into (graph->implicit_preds[n], - graph->implicit_preds[w]); + --first; + unsigned int w = si->scc_stack[first]; + si->node_mapping[w] = n; + if (!bitmap_bit_p (graph->direct_nodes, w)) + direct_p = false; } - if (graph->points_to[w]) + while (first > 0 + && si->dfs[si->scc_stack[first - 1]] >= my_dfs); + if (!direct_p) + bitmap_clear_bit (graph->direct_nodes, n); + + /* Want to reduce to node n, push that first. */ + si->scc_stack.reserve (1); + si->scc_stack.quick_push (si->scc_stack[first]); + si->scc_stack[first] = n; + + unsigned scc_size = si->scc_stack.length () - first; + unsigned split = scc_size / 2; + unsigned carry = scc_size - split * 2; + while (split > 0) { - if (!graph->points_to[n]) - graph->points_to[n] = BITMAP_ALLOC (&predbitmap_obstack); - bitmap_ior_into (graph->points_to[n], - graph->points_to[w]); + for (unsigned i = 0; i < split; ++i) + { + unsigned a = si->scc_stack[first + i]; + unsigned b = si->scc_stack[first + split + carry + i]; + + /* Unify our nodes. */ + if (graph->preds[b]) + { + if (!graph->preds[a]) + std::swap (graph->preds[a], graph->preds[b]); + else + bitmap_ior_into_and_free (graph->preds[a], + &graph->preds[b]); + } + if (graph->implicit_preds[b]) + { + if (!graph->implicit_preds[a]) + std::swap (graph->implicit_preds[a], + graph->implicit_preds[b]); + else + bitmap_ior_into_and_free (graph->implicit_preds[a], + &graph->implicit_preds[b]); + } + if (graph->points_to[b]) + { + if (!graph->points_to[a]) + std::swap (graph->points_to[a], graph->points_to[b]); + else + bitmap_ior_into_and_free (graph->points_to[a], + &graph->points_to[b]); + } + } + unsigned remain = split + carry; + split = remain / 2; + carry = remain - split * 2; } + /* Actually pop the SCC. */ + si->scc_stack.truncate (first); } bitmap_set_bit (si->deleted, n); } |