]> git.ipfire.org Git - people/ms/gcc.git/commitdiff
middle-end/108500 - replace recursive domtree DFS traversal
authorRichard Biener <rguenther@suse.de>
Tue, 31 Jan 2023 14:45:43 +0000 (15:45 +0100)
committerRichard Biener <rguenther@suse.de>
Wed, 15 Mar 2023 09:06:51 +0000 (10:06 +0100)
The following replaces the recursive DFS traversal of the dominator
tree in assign_dfs_numbers with a tree traversal using the fact
that we have recorded parents.

Bootstrapped and tested on x86_64-unknown-linux-gnu.

This makes r13-5325 somewhat obsolete, though not computing the
DFS numbers at all is beneficial in the cases where we perform
immediate CFG manipulations.

OK for trunk and later branch(es)?

Thanks,
Richard.

PR middle-end/108500
* dominance.cc (assign_dfs_numbers): Replace recursive DFS
with tree traversal algorithm.

(cherry picked from commit 97258480438db77e52f4b3947fa2c075b09d3fe1)

gcc/dominance.cc

index 09d12d0f6188d0586b7f9bf57aae64b2d9a4174f..60b196379356a560326e90c6135c1ba43b2d3323 100644 (file)
@@ -639,18 +639,25 @@ dom_info::calc_idoms ()
 static void
 assign_dfs_numbers (struct et_node *node, int *num)
 {
-  struct et_node *son;
-
-  node->dfs_num_in = (*num)++;
-
-  if (node->son)
+  et_node *n = node;
+  while (1)
     {
-      assign_dfs_numbers (node->son, num);
-      for (son = node->son->right; son != node->son; son = son->right)
-       assign_dfs_numbers (son, num);
+      n->dfs_num_in = (*num)++;
+      if (n->son)
+       n = n->son;
+      else
+       {
+         while (!n->right || n->right == n->father->son)
+           {
+             n->dfs_num_out = (*num)++;
+             if (n == node)
+               return;
+             n = n->father;
+           }
+         n->dfs_num_out = (*num)++;
+         n = n->right;
+       }
     }
-
-  node->dfs_num_out = (*num)++;
 }
 
 /* Compute the data necessary for fast resolving of dominator queries in a