aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2012-01-05 20:25:14 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2012-01-05 19:25:14 +0000
commit56494762bed42418501591de5c4d6e959feff017 (patch)
treec37a75fb7f091174552a67e58c1b9f3c0fff0deb /gcc
parent10d12a3eebd9ea1022ed56131ed80ab7b67aaa88 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cfgloopmanip.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr49710.c35
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 ();
+}