]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2013-03-20 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 20 Mar 2013 09:03:06 +0000 (09:03 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 20 Mar 2013 09:03:06 +0000 (09:03 +0000)
* cfgloop.c (verify_loop_structure): Streamline and avoid
ICEing on corrupt loop tree.
* graph.c (draw_cfg_nodes_for_loop): Avoid ICEing on corrupt
loop tree.

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

gcc/ChangeLog
gcc/cfgloop.c
gcc/graph.c

index 303e4ad7ef4856a88c993fb4b1791c14ebe894b7..62eff1d9f079ae369d4eb4d6a8de29e5e32969b6 100644 (file)
@@ -1,3 +1,10 @@
+2013-03-20  Richard Biener  <rguenther@suse.de>
+
+       * cfgloop.c (verify_loop_structure): Streamline and avoid
+       ICEing on corrupt loop tree.
+       * graph.c (draw_cfg_nodes_for_loop): Avoid ICEing on corrupt
+       loop tree.
+
 2013-03-20  Richard Biener  <rguenther@suse.de>
 
        * tree-vect-loop-manip.c (slpeel_can_duplicate_loop_p): Do not
index 751da5a2c177bb31051b4b83fd21774f0e31fd65..54ce2a24c2165e99134dc00d1890e34ee3822941 100644 (file)
@@ -1319,7 +1319,7 @@ verify_loop_structure (void)
 {
   unsigned *sizes, i, j;
   sbitmap irreds;
-  basic_block bb;
+  basic_block bb, *bbs;
   struct loop *loop;
   int err = 0;
   edge e;
@@ -1335,43 +1335,51 @@ verify_loop_structure (void)
   else
     verify_dominators (CDI_DOMINATORS);
 
-  /* Check sizes.  */
-  sizes = XCNEWVEC (unsigned, num);
-  sizes[0] = 2;
-
-  FOR_EACH_BB (bb)
-    for (loop = bb->loop_father; loop; loop = loop_outer (loop))
-      sizes[loop->num]++;
-
-  FOR_EACH_LOOP (li, loop, LI_INCLUDE_ROOT)
-    {
-      i = loop->num;
-
-      if (loop->num_nodes != sizes[i])
-       {
-         error ("size of loop %d should be %d, not %d",
-                  i, sizes[i], loop->num_nodes);
-         err = 1;
-       }
-    }
-
   /* Check the headers.  */
   FOR_EACH_BB (bb)
-    if (bb_loop_header_p (bb)
-       && bb->loop_father->header != bb)
+    if (bb_loop_header_p (bb))
       {
-       error ("loop with header %d not in loop tree", bb->index);
+       if (bb->loop_father->header == NULL)
+         {
+           error ("loop with header %d marked for removal", bb->index);
+           err = 1;
+         }
+       else if (bb->loop_father->header != bb)
+         {
+           error ("loop with header %d not in loop tree", bb->index);
+           err = 1;
+         }
+      }
+    else if (bb->loop_father->header == bb)
+      {
+       error ("non-loop with header %d not marked for removal", bb->index);
        err = 1;
       }
 
-  /* Check get_loop_body.  */
+  /* Check the recorded loop father and sizes of loops.  */
   visited = sbitmap_alloc (last_basic_block);
   bitmap_clear (visited);
+  bbs = XNEWVEC (basic_block, n_basic_blocks);
   FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
     {
-      basic_block *bbs = get_loop_body (loop);
+      unsigned n;
 
-      for (j = 0; j < loop->num_nodes; j++)
+      if (loop->header == NULL)
+       {
+         error ("removed loop %d in loop tree", loop->num);
+         err = 1;
+         continue;
+       }
+
+      n = get_loop_body_with_size (loop, bbs, n_basic_blocks);
+      if (loop->num_nodes != n)
+       {
+         error ("size of loop %d should be %d, not %d",
+                loop->num, n, loop->num_nodes);
+         err = 1;
+       }
+
+      for (j = 0; j < n; j++)
        {
          bb = bbs[j];
 
@@ -1394,16 +1402,16 @@ verify_loop_structure (void)
              err = 1;
            }
        }
-
-      free (bbs);
     }
+  free (bbs);
   sbitmap_free (visited);
 
   /* Check headers and latches.  */
   FOR_EACH_LOOP (li, loop, 0)
     {
       i = loop->num;
-
+      if (loop->header == NULL)
+       continue;
       if (!bb_loop_header_p (loop->header))
        {
          error ("loop %d%'s header is not a loop header", i);
@@ -1561,6 +1569,7 @@ verify_loop_structure (void)
     {
       unsigned n_exits = 0, eloops;
 
+      sizes = XCNEWVEC (unsigned, num);
       memset (sizes, 0, sizeof (unsigned) * num);
       FOR_EACH_BB (bb)
        {
@@ -1624,11 +1633,12 @@ verify_loop_structure (void)
              err = 1;
            }
        }
+
+      free (sizes);
     }
 
   gcc_assert (!err);
 
-  free (sizes);
   if (!dom_available)
     free_dominance_info (CDI_DOMINATORS);
 }
index 51837308bb42fd0e62afe34f71b78bfc09b89ec5..1ecfdf0b76126606b769c9a3b8835346b5a4b55b 100644 (file)
@@ -213,7 +213,8 @@ draw_cfg_nodes_for_loop (pretty_printer *pp, int funcdef_no,
   unsigned int i;
   const char *fillcolors[3] = { "grey88", "grey77", "grey66" };
 
-  if (loop->latch != EXIT_BLOCK_PTR)
+  if (loop->header != NULL
+      && loop->latch != EXIT_BLOCK_PTR)
     pp_printf (pp,
               "\tsubgraph cluster_%d_%d {\n"
               "\tstyle=\"filled\";\n"
@@ -229,6 +230,9 @@ draw_cfg_nodes_for_loop (pretty_printer *pp, int funcdef_no,
   for (struct loop *inner = loop->inner; inner; inner = inner->next)
     draw_cfg_nodes_for_loop (pp, funcdef_no, inner);
 
+  if (loop->header == NULL)
+    return;
+
   if (loop->latch == EXIT_BLOCK_PTR)
     body = get_loop_body (loop);
   else