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:
parent
10d12a3eeb
commit
56494762be
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
35
gcc/testsuite/gcc.c-torture/compile/pr49710.c
Normal file
35
gcc/testsuite/gcc.c-torture/compile/pr49710.c
Normal 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 ();
|
||||
}
|
Loading…
Reference in New Issue
Block a user