aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-03-25 12:54:56 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-03-25 12:54:56 +0000
commit051b94466891c0eedaf808be384fa8696a680380 (patch)
treefa0165b9a6a62351e59b8ce797a10ff937f85616
parent374001cbeedd6e59a21bad4b62e40c5657e79645 (diff)
downloadgcc-051b94466891c0eedaf808be384fa8696a680380.zip
gcc-051b94466891c0eedaf808be384fa8696a680380.tar.gz
gcc-051b94466891c0eedaf808be384fa8696a680380.tar.bz2
re PR bootstrap/56689 (internal compiler error: in get_loop_body, at cfgloop.c:841)
2013-03-25 Richard Biener <rguenther@suse.de> PR tree-optimization/56689 * tree-vrp.c (execute_vrp): Mark loops for fixup if we removed any edge. * gcc.dg/torture/pr56689.c: New testcase. From-SVN: r197039
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr56689.c46
-rw-r--r--gcc/tree-vrp.c6
4 files changed, 62 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3abf878..3db3f1d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2013-03-25 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/56689
+ * tree-vrp.c (execute_vrp): Mark loops for fixup if we removed
+ any edge.
+
+2013-03-25 Richard Biener <rguenther@suse.de>
+
* tree-ssa-loop-im.c (struct mem_ref): Use bitmap_head instead
of bitmap.
(memory_references): Likewise.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0a389fc..2aad75a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-03-25 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/56689
+ * gcc.dg/torture/pr56689.c: New testcase.
+
2013-03-25 Kai Tietz <ktietz@redhat.com>
* g++.dg/torture/20121105-1.C: Adjust for LLP64 targets.
diff --git a/gcc/testsuite/gcc.dg/torture/pr56689.c b/gcc/testsuite/gcc.dg/torture/pr56689.c
new file mode 100644
index 0000000..719f528
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr56689.c
@@ -0,0 +1,46 @@
+/* { dg-do compile } */
+
+extern int baz ();
+extern void bar (void);
+extern void noret (void) __attribute__ ((__noreturn__));
+
+void
+fix_register (const char *name, int fixed, int call_used, int nregs)
+{
+ int i;
+ int reg;
+
+ if ((reg = baz ()) >= 0)
+ {
+ for (i = reg; i < nregs; i++)
+ {
+ if ((i == 15 || i == 11) && (fixed == 0 || call_used == 0))
+ {
+ switch (fixed)
+ {
+ case 0:
+ switch (call_used)
+ {
+ case 1:
+ bar ();
+ break;
+ default:
+ (noret ());
+ }
+ case 1:
+ switch (call_used)
+ {
+ case 1:
+ break;
+ case 0:
+ default:
+ (noret ());
+ }
+ break;
+ default:
+ (noret ());
+ }
+ }
+ }
+ }
+}
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index a38b14d..250a506 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -9329,7 +9329,11 @@ execute_vrp (void)
}
if (to_remove_edges.length () > 0)
- free_dominance_info (CDI_DOMINATORS);
+ {
+ free_dominance_info (CDI_DOMINATORS);
+ if (current_loops)
+ loops_state_set (LOOPS_NEED_FIXUP);
+ }
to_remove_edges.release ();
to_update_switch_stmts.release ();