OSDN Git Service

Definition of these two macros are corrected by adding matchine right paren.
[pf3gnuchains/gcc-fork.git] / gcc / cfghooks.c
index 37c1c60..001dfe2 100644 (file)
@@ -1,5 +1,5 @@
 /* Hooks for cfg representation specific functions.
-   Copyright (C) 2003 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
    Contributed by Sebastian Pop <s.pop@laposte.net>
 
 This file is part of GCC.
@@ -206,8 +206,8 @@ dump_bb (basic_block bb, FILE *outf, int indent)
   edge e;
   char *s_indent;
  
-  s_indent = (char *) alloca ((size_t) indent + 1);
-  memset ((void *) s_indent, ' ', (size_t) indent);
+  s_indent = alloca ((size_t) indent + 1);
+  memset (s_indent, ' ', (size_t) indent);
   s_indent[indent] = '\0';
 
   fprintf (outf, ";;%s basic block %d, loop depth %d, count ",
@@ -320,7 +320,7 @@ split_block_after_labels (basic_block bb)
   return split_block (bb, NULL);
 }
 
-/* Moves block BB immediatelly after block AFTER.  Returns false if the
+/* Moves block BB immediately after block AFTER.  Returns false if the
    movement was impossible.  */
 
 bool
@@ -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;
 }
@@ -575,7 +600,8 @@ tidy_fallthru_edges (void)
       if ((s = b->succ) != NULL
          && ! (s->flags & EDGE_COMPLEX)
          && s->succ_next == NULL
-         && s->dest == c)
+         && s->dest == c
+         && !find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX))
        tidy_fallthru_edge (s);
     }
 }