diff options
author | Richard Biener <rguenther@suse.de> | 2014-12-15 08:19:55 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-12-15 08:19:55 +0000 |
commit | 0675001e9827fe45b6d9994452915e8929651ecd (patch) | |
tree | 53e1e3c4dd8e23039265c95b7a6992126ecdb915 | |
parent | 451f11993580c3fb0b80da62885a00f8ee265304 (diff) | |
download | gcc-0675001e9827fe45b6d9994452915e8929651ecd.zip gcc-0675001e9827fe45b6d9994452915e8929651ecd.tar.gz gcc-0675001e9827fe45b6d9994452915e8929651ecd.tar.bz2 |
re PR tree-optimization/64284 (ICE: Segmentation fault)
2014-12-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/64284
* tree-ssa-threadupdate.c (duplicate_seme_region): Mark
the loop for removal if we copied the loop header.
* gcc.dg/torture/pr64284.c: New testcase.
From-SVN: r218733
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr64284.c | 21 | ||||
-rw-r--r-- | gcc/tree-ssa-threadupdate.c | 9 |
4 files changed, 36 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 431b2a1..2e0ca74 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-12-15 Richard Biener <rguenther@suse.de> + + PR tree-optimization/64284 + * tree-ssa-threadupdate.c (duplicate_seme_region): Mark + the loop for removal if we copied the loop header. + 2014-12-14 Jan Hubicka <hubicka@ucw.cz> * ipa.c (process_references): Fix conditoinal on flag_optimize diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1b51abe..2e21868 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-12-15 Richard Biener <rguenther@suse.de> + + PR tree-optimization/64284 + * gcc.dg/torture/pr64284.c: New testcase. + 2014-12-14 Jan Hubicka <hubicka@ucw.cz> PR ipa/61602 diff --git a/gcc/testsuite/gcc.dg/torture/pr64284.c b/gcc/testsuite/gcc.dg/torture/pr64284.c new file mode 100644 index 0000000..4254381 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr64284.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ + +int *a; +int b; +int +fn1() { + enum { QSTRING } c = 0; + while (1) { + switch (*a) { + case '\'': + c = 0; + default: + switch (c) + case 0: + if (b) + return 0; + c = 1; + } + a++; + } +} diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c index 12f83ba..c7a476a 100644 --- a/gcc/tree-ssa-threadupdate.c +++ b/gcc/tree-ssa-threadupdate.c @@ -2364,7 +2364,7 @@ duplicate_seme_region (edge entry, edge exit, basic_block *region_copy) { unsigned i; - bool free_region_copy = false, copying_header = false; + bool free_region_copy = false; struct loop *loop = entry->dest->loop_father; edge exit_copy; edge redirected; @@ -2388,10 +2388,7 @@ duplicate_seme_region (edge entry, edge exit, initialize_original_copy_tables (); - if (copying_header) - set_loop_copy (loop, loop_outer (loop)); - else - set_loop_copy (loop, loop); + set_loop_copy (loop, loop); if (!region_copy) { @@ -2453,6 +2450,8 @@ duplicate_seme_region (edge entry, edge exit, } /* Redirect the entry and add the phi node arguments. */ + if (entry->dest == loop->header) + mark_loop_for_removal (loop); redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest)); gcc_assert (redirected != NULL); flush_pending_stmts (entry); |