]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* dominance.c (recount_dominator): Handle postdominators.
authorZdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
Tue, 2 Mar 2004 00:28:07 +0000 (01:28 +0100)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Tue, 2 Mar 2004 00:28:07 +0000 (00:28 +0000)
From-SVN: r78734

gcc/ChangeLog
gcc/dominance.c

index f439fa08990c479a6ad39a277319a4b85ac21d15..3661aa88ce7f75ff939aee258bb04e3341f28f9b 100644 (file)
@@ -1,3 +1,7 @@
+2004-03-02  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
+
+       * dominance.c (recount_dominator): Handle postdominators.
+
 2004-03-01  Richard Sandiford  <rsandifo@redhat.com>
 
        * config/mips/mips-protos.h (enum mips_symbol_type): Move from mips.h.
index d608391839dfd9d9c62f7fc2a5c0e2de365d045c..2b6e806a77760da1ff24f1e4728806e9bbd712bd 100644 (file)
@@ -769,23 +769,38 @@ verify_dominators (enum cdi_direction dir)
     abort ();
 }
 
-/* Recount dominator of BB.  */
+/* Determine immediate dominator (or postdominator, according to DIR) of BB,
+   assuming that dominators of other blocks are correct.  We also use it to
+   recompute the dominators in a restricted area, by iterating it until it
+   reaches a fixpoint.  */
+
 basic_block
 recount_dominator (enum cdi_direction dir, basic_block bb)
 {
-   basic_block dom_bb = NULL;
-   edge e;
+  basic_block dom_bb = NULL;
+  edge e;
 
   if (!dom_computed[dir])
     abort ();
 
-   for (e = bb->pred; e; e = e->pred_next)
-     {
-       if (!dominated_by_p (dir, e->src, bb))
-         dom_bb = nearest_common_dominator (dir, dom_bb, e->src);
-     }
+  if (dir == CDI_DOMINATORS)
+    {
+      for (e = bb->pred; e; e = e->pred_next)
+       {
+         if (!dominated_by_p (dir, e->src, bb))
+           dom_bb = nearest_common_dominator (dir, dom_bb, e->src);
+       }
+    }
+  else
+    {
+      for (e = bb->succ; e; e = e->succ_next)
+       {
+         if (!dominated_by_p (dir, e->dest, bb))
+           dom_bb = nearest_common_dominator (dir, dom_bb, e->dest);
+       }
+    }
 
-   return dom_bb;
+  return dom_bb;
 }
 
 /* Iteratively recount dominators of BBS. The change is supposed to be local