diff options
author | Richard Biener <rguenther@suse.de> | 2024-07-23 10:29:58 +0200 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2024-07-28 19:05:47 +0200 |
commit | b448b3b695f5d3c86a6bee3ce8522f261869dbb0 (patch) | |
tree | 61db83d7e6fd83924a5dffd63351aa28e3c5ac55 | |
parent | 81073bc4fddfd31a8823d8ededeb47e32b6401dc (diff) | |
download | gcc-b448b3b695f5d3c86a6bee3ce8522f261869dbb0.zip gcc-b448b3b695f5d3c86a6bee3ce8522f261869dbb0.tar.gz gcc-b448b3b695f5d3c86a6bee3ce8522f261869dbb0.tar.bz2 |
tree-optimization/116002 - PTA solving slow with degenerate graph
When the constraint graph consists of N nodes with only complex
constraints and no copy edges we have to be lucky to arrive at
a constraint solving order that requires the optimal number of
iterations. What happens in the testcase is that we bottle-neck
on computing the visitation order but propagate changes only
very slowly. Luckily the testcase complex constraints are
all copy-with-offset and those do provide a way to order
visitation. The following adds this which reduces the iteration
count to one.
PR tree-optimization/116002
* tree-ssa-structalias.cc (topo_visit): Also consider
SCALAR = SCALAR complex constraints as edges.
-rw-r--r-- | gcc/tree-ssa-structalias.cc | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/tree-ssa-structalias.cc b/gcc/tree-ssa-structalias.cc index 330e64e..65f9132 100644 --- a/gcc/tree-ssa-structalias.cc +++ b/gcc/tree-ssa-structalias.cc @@ -1908,6 +1908,18 @@ topo_visit (constraint_graph_t graph, vec<unsigned> &topo_order, topo_visit (graph, topo_order, visited, k); } + /* Also consider copy with offset complex constraints as implicit edges. */ + for (auto c : graph->complex[n]) + { + /* Constraints are ordered so that SCALAR = SCALAR appear first. */ + if (c->lhs.type != SCALAR || c->rhs.type != SCALAR) + break; + gcc_checking_assert (c->rhs.var == n); + unsigned k = find (c->lhs.var); + if (!bitmap_bit_p (visited, k)) + topo_visit (graph, topo_order, visited, k); + } + topo_order.quick_push (n); } |