Commit 895548a5 by Kyrylo Tkachov

[cfgloop] PR middle-end/68375: Restructure get_loop_body_in_bfs_order to handle…

[cfgloop] PR middle-end/68375: Restructure get_loop_body_in_bfs_order to handle loops with only a header

	PR middle-end/68375
	* cfgloop.c (get_loop_body_in_bfs_order): Restructure loop to avoid
	bogus assertion.

	* gcc.dg/pr68375.c: New test.

From-SVN: r230798
parent 3788cfb5
2015-11-24 Richard Biener <rguenther@suse.de>
Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR middle-end/68375
* cfgloop.c (get_loop_body_in_bfs_order): Restructure loop to avoid
bogus assertion.
2015-11-24 Jakub Jelinek <jakub@redhat.com> 2015-11-24 Jakub Jelinek <jakub@redhat.com>
PR target/68483 PR target/68483
...@@ -913,37 +913,32 @@ get_loop_body_in_bfs_order (const struct loop *loop) ...@@ -913,37 +913,32 @@ get_loop_body_in_bfs_order (const struct loop *loop)
basic_block *blocks; basic_block *blocks;
basic_block bb; basic_block bb;
bitmap visited; bitmap visited;
unsigned int i = 0; unsigned int i = 1;
unsigned int vc = 1; unsigned int vc = 0;
gcc_assert (loop->num_nodes); gcc_assert (loop->num_nodes);
gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun)); gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun));
blocks = XNEWVEC (basic_block, loop->num_nodes); blocks = XNEWVEC (basic_block, loop->num_nodes);
visited = BITMAP_ALLOC (NULL); visited = BITMAP_ALLOC (NULL);
blocks[0] = loop->header;
bb = loop->header; bitmap_set_bit (visited, loop->header->index);
while (i < loop->num_nodes) while (i < loop->num_nodes)
{ {
edge e; edge e;
edge_iterator ei; edge_iterator ei;
gcc_assert (i > vc);
if (bitmap_set_bit (visited, bb->index)) bb = blocks[vc++];
/* This basic block is now visited */
blocks[i++] = bb;
FOR_EACH_EDGE (e, ei, bb->succs) FOR_EACH_EDGE (e, ei, bb->succs)
{ {
if (flow_bb_inside_loop_p (loop, e->dest)) if (flow_bb_inside_loop_p (loop, e->dest))
{ {
/* This bb is now visited. */
if (bitmap_set_bit (visited, e->dest->index)) if (bitmap_set_bit (visited, e->dest->index))
blocks[i++] = e->dest; blocks[i++] = e->dest;
} }
} }
gcc_assert (i > vc);
bb = blocks[vc++];
} }
BITMAP_FREE (visited); BITMAP_FREE (visited);
......
2015-11-24 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR middle-end/68375
* gcc.dg/pr68375.c: New test.
2015-11-24 Jakub Jelinek <jakub@redhat.com> 2015-11-24 Jakub Jelinek <jakub@redhat.com>
PR target/68483 PR target/68483
......
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized-graph" } */
int a, c, d, e, g, h;
short f;
int
foo ()
{
}
short
fn1 (void)
{
int j[2];
for (; e; e++)
if (j[0])
for (;;)
;
if (!g)
return f;
}
int
main (void)
{
for (; a < 1; a++)
{
for (c = 0; c < 2; c++)
{
d && (f = 0);
h = fn1 ();
}
__builtin_printf ("%d\n", (char) f);
}
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment