aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-if-conv.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-03-25 08:08:04 +0100
committerJakub Jelinek <jakub@redhat.com>2020-03-25 08:08:04 +0100
commitc2133167ad58d15c2c2df0cb4fa3a3757603144e (patch)
treeaa5f492272cdd6ab6f77666daf6686b7973ebf58 /gcc/tree-if-conv.c
parentadaf4b6c66e789d927684003b9ee05ed04c105ea (diff)
if-conv: Delete dead stmts backwards in ifcvt_local_dce [PR94283]
> > 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 <rguenther@suse.de> Jakub Jelinek <jakub@redhat.com> 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 <rguenther@suse.de>
Diffstat (limited to 'gcc/tree-if-conv.c')
-rw-r--r--gcc/tree-if-conv.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index dd11d805c77..fc894eb94da 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;
}
}