diff options
author | Richard Biener <rguenther@suse.de> | 2013-03-25 12:54:56 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-03-25 12:54:56 +0000 |
commit | 051b94466891c0eedaf808be384fa8696a680380 (patch) | |
tree | fa0165b9a6a62351e59b8ce797a10ff937f85616 | |
parent | 374001cbeedd6e59a21bad4b62e40c5657e79645 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr56689.c | 46 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 6 |
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 (); |