diff options
author | Jan Hubicka <jh@suse.cz> | 2012-01-05 20:25:14 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2012-01-05 19:25:14 +0000 |
commit | 56494762bed42418501591de5c4d6e959feff017 (patch) | |
tree | c37a75fb7f091174552a67e58c1b9f3c0fff0deb /gcc | |
parent | 10d12a3eebd9ea1022ed56131ed80ab7b67aaa88 (diff) | |
download | gcc-56494762bed42418501591de5c4d6e959feff017.zip gcc-56494762bed42418501591de5c4d6e959feff017.tar.gz gcc-56494762bed42418501591de5c4d6e959feff017.tar.bz2 |
re PR rtl-optimization/49710 (segfault)
PR middle-end/49710
* cfgloopmanip.c (remove_path): Walk loop hiearchy upwards when
unlooping loops.
From-SVN: r182919
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cfgloopmanip.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr49710.c | 35 |
4 files changed, 53 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4e5c771..1e61242 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index 9675417..33bcf4b 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c4af2c8..d324db6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr49710.c b/gcc/testsuite/gcc.c-torture/compile/pr49710.c new file mode 100644 index 0000000..2a6e331 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr49710.c @@ -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 (); +} |