* cfghooks.c (split_edge): Speed up updating of dominators.
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 17 Feb 2004 19:51:15 +0000 (19:51 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 17 Feb 2004 19:51:15 +0000 (19:51 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77973 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfghooks.c

index c099df6..33c5733 100644 (file)
@@ -1,3 +1,7 @@
+2004-02-17  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
+
+       * cfghooks.c (split_edge): Speed up updating of dominators.
+
 2004-02-17  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/11326
index ab47181..e256124 100644 (file)
@@ -373,6 +373,7 @@ split_edge (edge e)
   basic_block ret;
   gcov_type count = e->count;
   int freq = EDGE_FREQUENCY (e);
+  edge f;
 
   if (!cfg_hooks->split_edge)
     internal_error ("%s does not support split_edge.", cfg_hooks->name);
@@ -387,9 +388,33 @@ split_edge (edge e)
     set_immediate_dominator (CDI_DOMINATORS, ret, ret->pred->src);
 
   if (dom_computed[CDI_DOMINATORS] >= DOM_NO_FAST_QUERY)
-    set_immediate_dominator (CDI_DOMINATORS, ret->succ->dest,
-                            recount_dominator (CDI_DOMINATORS,
-                                               ret->succ->dest));
+    {
+      /* There are two cases:
+
+        If the immediate dominator of e->dest is not e->src, it
+        remains unchanged.
+
+        If immediate dominator of e->dest is e->src, it may become
+        ret, provided that all other predecessors of e->dest are
+        dominated by e->dest.  */
+
+      if (get_immediate_dominator (CDI_DOMINATORS, ret->succ->dest)
+         == ret->pred->src)
+       {
+         for (f = ret->succ->dest->pred; f; f = f->pred_next)
+           {
+             if (f == ret->succ)
+               continue;
+
+             if (!dominated_by_p (CDI_DOMINATORS, f->src,
+                                  ret->succ->dest))
+               break;
+           }
+
+         if (!f)
+           set_immediate_dominator (CDI_DOMINATORS, ret->succ->dest, ret);
+       }
+    };
 
   return ret;
 }