summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2013-03-20 09:03:06 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2013-03-20 09:03:06 +0000
commitcd9916a9b3bdc2408364926c41fe333b1a51e8a3 (patch)
tree94bdf259b8ca49c1e5c3f91c1eaf773c30e89dcd
parent3767bd95180b604104c0e7942950db2c6dc73059 (diff)
downloadgcc-cd9916a9b3bdc2408364926c41fe333b1a51e8a3.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@196811 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cfgloop.c72
-rw-r--r--gcc/graph.c6
3 files changed, 53 insertions, 32 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 303e4ad7ef4..62eff1d9f07 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
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
check whether an SSA update is needed.
diff --git a/gcc/cfgloop.c b/gcc/cfgloop.c
index 751da5a2c17..54ce2a24c21 100644
--- a/gcc/cfgloop.c
+++ b/gcc/cfgloop.c
@@ -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);
}
diff --git a/gcc/graph.c b/gcc/graph.c
index 51837308bb4..1ecfdf0b761 100644
--- a/gcc/graph.c
+++ b/gcc/graph.c
@@ -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