From c2133167ad58d15c2c2df0cb4fa3a3757603144e Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 25 Mar 2020 08:08:04 +0100 Subject: [PATCH] if-conv: Delete dead stmts backwards in ifcvt_local_dce [PR94283] MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit > > This patch caused: > > > > gcc /home/marxin/Programming/gcc/gcc/testsuite/gcc.c-torture/compile/990625-2.c -O3 -g -fno-tree-dce -c > > during GIMPLE pass: ifcvt > > /home/marxin/Programming/gcc/gcc/testsuite/gcc.c-torture/compile/990625-2.c: In function ‘broken030599’: > > /home/marxin/Programming/gcc/gcc/testsuite/gcc.c-torture/compile/990625-2.c:2:1: internal compiler error: Segmentation fault > > Likely > > /* Delete dead statements. */ > gsi = gsi_start_bb (bb); > while (!gsi_end_p (gsi)) > { > > needs to instead work back-to-front for debug stmt adjustment to work Indeed, that seems to work. 2020-03-25 Richard Biener Jakub Jelinek PR debug/94283 * tree-if-conv.c (ifcvt_local_dce): Delete dead statements backwards. * gcc.dg/pr94283.c: New test. Co-authored-by: Richard Biener --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr94283.c | 16 ++++++++++++++++ gcc/tree-if-conv.c | 10 ++++++---- 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr94283.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4edf212..485fc09 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2020-03-25 Richard Biener + Jakub Jelinek + + PR debug/94283 + * tree-if-conv.c (ifcvt_local_dce): Delete dead statements backwards. + 2020-03-24 Christophe Lyon * doc/sourcebuild.texi (ARM-specific attributes): Add diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 56a6304..5a42808 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-03-25 Jakub Jelinek + + PR debug/94283 + * gcc.dg/pr94283.c: New test. + 2020-03-24 Sandra Loosemore * gcc.dg/analyzer/sigsetjmp-5.c: Require sigsetjmp support. diff --git a/gcc/testsuite/gcc.dg/pr94283.c b/gcc/testsuite/gcc.dg/pr94283.c new file mode 100644 index 0000000..ac162d6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr94283.c @@ -0,0 +1,16 @@ +/* PR debug/94283 */ +/* { dg-do compile } */ +/* { dg-options "-O3 -fno-tree-dce -fcompare-debug" } */ + +void +foo (int *n) +{ + for (int i = 0; i < 32; i++) + { + int x = 0; + x++; + if (i & 4) + x++; + x++; + } +} diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index dd11d80..fc894eb 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -2973,9 +2973,11 @@ ifcvt_local_dce (class loop *loop) } } /* Delete dead statements. */ - gsi = gsi_start_bb (bb); + gsi = gsi_last_bb (bb); while (!gsi_end_p (gsi)) { + gimple_stmt_iterator gsiprev = gsi; + gsi_prev (&gsiprev); stmt = gsi_stmt (gsi); if (gimple_store_p (stmt)) { @@ -2986,14 +2988,13 @@ ifcvt_local_dce (class loop *loop) if (dse_classify_store (&write, stmt, false, NULL, NULL, latch_vdef) == DSE_STORE_DEAD) delete_dead_or_redundant_assignment (&gsi, "dead"); - else - gsi_next (&gsi); + gsi = gsiprev; continue; } if (gimple_plf (stmt, GF_PLF_2)) { - gsi_next (&gsi); + gsi = gsiprev; continue; } if (dump_file && (dump_flags & TDF_DETAILS)) @@ -3003,6 +3004,7 @@ ifcvt_local_dce (class loop *loop) } gsi_remove (&gsi, true); release_defs (stmt); + gsi = gsiprev; } } -- 2.7.4