From e311c2d89a3bb45fe65e384126699dbaa2f57fdf Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 27 Nov 2014 09:57:13 +0000 Subject: [PATCH] re PR middle-end/64083 (ICE: in fix_loop_structure, at loop-init.c:252 compiling Linux Kernel) 2014-11-27 Richard Biener PR tree-optimization/64083 * tree-ssa-threadupdate.c (thread_through_all_blocks): Do not forcibly mark loop for removal the wrong way. * gcc.dg/torture/pr64083.c: New testcase. From-SVN: r218115 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr64083.c | 17 +++++++++++++++++ gcc/tree-ssa-threadupdate.c | 10 +--------- 4 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr64083.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 999686f6ee1..71828c2299d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-11-27 Richard Biener + + PR tree-optimization/64083 + * tree-ssa-threadupdate.c (thread_through_all_blocks): Do not + forcibly mark loop for removal the wrong way. + 2014-11-27 Richard Biener PR middle-end/63704 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5e671fa92fe..5fc10c2b794 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-11-27 Richard Biener + + PR tree-optimization/64083 + * gcc.dg/torture/pr64083.c: New testcase. + 2014-11-27 Richard Biener PR tree-optimization/61634 diff --git a/gcc/testsuite/gcc.dg/torture/pr64083.c b/gcc/testsuite/gcc.dg/torture/pr64083.c new file mode 100644 index 00000000000..3c3e5a6087a --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr64083.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ + +int a, b; +void +fn1 () +{ + int c = 0; + while (b) + { + switch (c) + case 1: + fn1 (); + if (a) + c = 1; + b = 0; + } +} diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c index ca0b8bfdd4b..a8243aea68a 100644 --- a/gcc/tree-ssa-threadupdate.c +++ b/gcc/tree-ssa-threadupdate.c @@ -2428,16 +2428,8 @@ thread_through_all_blocks (bool may_peel_loop_headers) /* Our path is still valid, thread it. */ if (e->aux) { - struct loop *loop = (*path)[0]->e->dest->loop_father; - if (thread_block ((*path)[0]->e->dest, false)) - { - /* This jump thread likely totally scrambled this loop. - So arrange for it to be fixed up. */ - loop->header = NULL; - loop->latch = NULL; - e->aux = NULL; - } + e->aux = NULL; else { delete_jump_thread_path (path); -- 2.30.2