diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-03-25 08:08:04 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-03-25 08:08:04 +0100 |
commit | c2133167ad58d15c2c2df0cb4fa3a3757603144e (patch) | |
tree | aa5f492272cdd6ab6f77666daf6686b7973ebf58 /gcc/tree-if-conv.c | |
parent | adaf4b6c66e789d927684003b9ee05ed04c105ea (diff) | |
download | gcc-c2133167ad58d15c2c2df0cb4fa3a3757603144e.zip gcc-c2133167ad58d15c2c2df0cb4fa3a3757603144e.tar.gz gcc-c2133167ad58d15c2c2df0cb4fa3a3757603144e.tar.bz2 |
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.c | 10 |
1 files changed, 6 insertions, 4 deletions
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; } } |