aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-12-15 08:19:55 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-12-15 08:19:55 +0000
commit0675001e9827fe45b6d9994452915e8929651ecd (patch)
tree53e1e3c4dd8e23039265c95b7a6992126ecdb915
parent451f11993580c3fb0b80da62885a00f8ee265304 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr64284.c21
-rw-r--r--gcc/tree-ssa-threadupdate.c9
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);