OSDN Git Service

PR middle-end/32209
authorrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Jun 2007 07:28:50 +0000 (07:28 +0000)
committerrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Jun 2007 07:28:50 +0000 (07:28 +0000)
* dominance.c (debug_dominance_tree, debug_dominance_tree_1): New
functions.
(verify_dominators): Do not change dominance tree.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@125563 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dominance.c

index ccf4318..14ac46a 100644 (file)
@@ -1,3 +1,10 @@
+2007-06-08  Zdenek Dvorak  <dvorakz@suse.cz>
+
+       PR middle-end/32209
+       * dominance.c (debug_dominance_tree, debug_dominance_tree_1): New
+       functions.
+       (verify_dominators): Do not change dominance tree.
+
 2007-06-08  Kaz Kojima  <kkojima@gcc.gnu.org>
 
        * config/sh/constraints.md: New file.
index 57a9df6..3ad0d20 100644 (file)
@@ -124,6 +124,7 @@ static TBB eval (struct dom_info *, TBB);
 static void link_roots (struct dom_info *, TBB, TBB);
 static void calc_idoms (struct dom_info *, bool);
 void debug_dominance_info (enum cdi_direction);
+void debug_dominance_tree (enum cdi_direction, basic_block);
 
 /* Keeps track of the*/
 static unsigned n_bbs_in_dom_tree[2];
@@ -970,37 +971,35 @@ void
 verify_dominators (enum cdi_direction dir)
 {
   int err = 0;
-  basic_block *old_dom = XNEWVEC (basic_block, last_basic_block);
-  basic_block bb, imm_bb;
+  basic_block bb, imm_bb, imm_bb_correct;
+  struct dom_info di;
+  bool reverse = (dir == CDI_POST_DOMINATORS) ? true : false;
 
   gcc_assert (dom_info_available_p (dir));
 
+  init_dom_info (&di, dir);
+  calc_dfs_tree (&di, reverse);
+  calc_idoms (&di, reverse);
+
   FOR_EACH_BB (bb)
     {
-      old_dom[bb->index] = get_immediate_dominator (dir, bb);
-
-      if (!old_dom[bb->index])
+      imm_bb = get_immediate_dominator (dir, bb);
+      if (!imm_bb)
        {
          error ("dominator of %d status unknown", bb->index);
          err = 1;
        }
-    }
-
-  free_dominance_info (dir);
-  calculate_dominance_info (dir);
 
-  FOR_EACH_BB (bb)
-    {
-      imm_bb = get_immediate_dominator (dir, bb);
-      if (old_dom[bb->index] != imm_bb)
+      imm_bb_correct = di.dfs_to_bb[di.dom[di.dfs_order[bb->index]]];
+      if (imm_bb != imm_bb_correct)
        {
          error ("dominator of %d should be %d, not %d",
-                bb->index, imm_bb->index, old_dom[bb->index]->index);
+                bb->index, imm_bb_correct->index, imm_bb->index);
          err = 1;
        }
     }
 
-  free (old_dom);
+  free_dom_info (&di);
   gcc_assert (!err);
 }
 
@@ -1453,3 +1452,41 @@ debug_dominance_info (enum cdi_direction dir)
     if ((bb2 = get_immediate_dominator (dir, bb)))
       fprintf (stderr, "%i %i\n", bb->index, bb2->index);
 }
+
+/* Prints to stderr representation of the dominance tree (for direction DIR)
+   rooted in ROOT, indented by INDENT tabelators.  If INDENT_FIRST is false,
+   the first line of the output is not indented.  */
+
+static void
+debug_dominance_tree_1 (enum cdi_direction dir, basic_block root,
+                       unsigned indent, bool indent_first)
+{
+  basic_block son;
+  unsigned i;
+  bool first = true;
+
+  if (indent_first)
+    for (i = 0; i < indent; i++)
+      fprintf (stderr, "\t");
+  fprintf (stderr, "%d\t", root->index);
+
+  for (son = first_dom_son (dir, root);
+       son;
+       son = next_dom_son (dir, son))
+    {
+      debug_dominance_tree_1 (dir, son, indent + 1, !first);
+      first = false;
+    }
+
+  if (first)
+    fprintf (stderr, "\n");
+}
+
+/* Prints to stderr representation of the dominance tree (for direction DIR)
+   rooted in ROOT.  */
+
+void
+debug_dominance_tree (enum cdi_direction dir, basic_block root)
+{
+  debug_dominance_tree_1 (dir, root, 0, false);
+}