From 0675001e9827fe45b6d9994452915e8929651ecd Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 15 Dec 2014 08:19:55 +0000 Subject: [PATCH] re PR tree-optimization/64284 (ICE: Segmentation fault) 2014-12-15 Richard Biener 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 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr64284.c | 21 +++++++++++++++++++++ gcc/tree-ssa-threadupdate.c | 9 ++++----- 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr64284.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 431b2a13537..2e0ca74784d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-12-15 Richard Biener + + 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 * ipa.c (process_references): Fix conditoinal on flag_optimize diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1b51abe23d9..2e21868effb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-12-15 Richard Biener + + PR tree-optimization/64284 + * gcc.dg/torture/pr64284.c: New testcase. + 2014-12-14 Jan Hubicka 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 00000000000..425438116eb --- /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 12f83ba64af..c7a476af0cf 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); -- 2.30.2