re PR rtl-optimization/49710 (segfault)

PR middle-end/49710
	* cfgloopmanip.c (remove_path): Walk loop hiearchy upwards when
	unlooping loops.

From-SVN: r182919
This commit is contained in:
Jan Hubicka 2012-01-05 20:25:14 +01:00 committed by Jan Hubicka
parent 10d12a3eeb
commit 56494762be
4 changed files with 53 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2012-01-05 Jan Hubicka <jh@suse.cz>
PR middle-end/49710
* cfgloopmanip.c (remove_path): Walk loop hiearchy upwards when
unlooping loops.
2012-01-05 Richard Guenther <rguenther@suse.de>
PR lto/50490

View File

@ -291,6 +291,7 @@ remove_path (edge e)
sbitmap seen;
bool irred_invalidated = false;
edge_iterator ei;
struct loop *l, *f;
if (!can_remove_branch_p (e))
return false;
@ -314,10 +315,12 @@ remove_path (edge e)
we belong to. In this case first unloop the loops, then proceed
normally. We may assume that e->dest is not a header of any loop,
as it now has exactly one predecessor. */
while (loop_outer (e->src->loop_father)
&& dominated_by_p (CDI_DOMINATORS,
e->src->loop_father->latch, e->dest))
unloop (e->src->loop_father, &irred_invalidated);
for (l = e->src->loop_father; loop_outer (l); l = f)
{
f = loop_outer (l);
if (dominated_by_p (CDI_DOMINATORS, l->latch, e->dest))
unloop (l, &irred_invalidated);
}
/* Identify the path. */
nrem = find_path (e, &rem_bbs);

View File

@ -1,3 +1,8 @@
2012-01-05 Jan Hubicka <jh@suse.cz>
PR middle-end/49710
* gcc.c-torture/compile/pr49710.c: New file.
2012-01-05 Richard Guenther <rguenther@suse.de>
* g++.dg/torture/pr49309.C: Skip for -flto.

View File

@ -0,0 +1,35 @@
int a, b, c, d;
static void
foo (int *x)
{
c = 0;
while (1)
{
if (*x)
break;
while (b)
for (; c; c = 0);
for (d = 18; d != 18; d++)
if (c)
{
foo (x);
return;
}
}
}
static void
bar ()
{
foo (0);
foo (0);
for (;;)
;
}
baz ()
{
for (; a;)
bar ();
}