This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Restore bootstrap (PR53197)
- From: Michael Matz <matz at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 3 May 2012 04:34:58 +0200 (CEST)
- Subject: Restore bootstrap (PR53197)
Hi,
my gimple_seq reshuffling broke boostrap on some machines. In particular
on those for which contrib/compare-debug works, meaning that
bootstrap-debug is selected as default BUILD_CONFIG (none of my machines
pass the respective configure.ac test, and hence I wasn't seeing the
problem anywhere). Thanks for Jonathan for access to a breaking machine
that set me on the right track.
The things is, that my patch causes different code to be emitted depending
on -g or not -g (or -gtoggle for stage2, which is what the bootstrap-debug
config is doing), when DSE wants to remove some stores. It walks the
sequence incorrectly, potentially with a stale iterator. This was
harmless before, but isn't anymore for backward walks due to the cyclic
structure of the prev links. The effect is that once the last statement
is removed and gsi_prev is called on the original (now stale) iterator
then gsi_end_p will be true, even if there are statement before the just
removed one.
Hence with -g (where the last stmt is a DEBUG one, which isn't removed)
all dead stores were removed in a certain block, whereas with -g0 (where
the store was the last stmt) only that last stmt was removed.
So, do the same as most other backward walkers that potentially remove
last statements (e.g. tree-cfg.c) do and update the iterator instead of a
copy, as well as reset to the end of sequence in case we removed the last
one.
I checked that this patch restores bootstrap when configured with
--with-build-config=bootstrap-debug, but only for the C language. The
miscomparing files in the bug report are all in libbackend.a, so there
shouldn't be more coming with more languages.
In order not to leave the tree broken for much longer I've committed the
below patch as r187074. A full regstrap is running, but I won't see the
results until in a few hours.
Ciao,
Michael.
------------------------
PR bootstrap/53197
* tree-ssa-dse.c (dse_optimize_stmt): Take pointer to
iterator.
(dse_enter_block): Properly iterate the whole sequence even
if the last statement was removed.
Index: tree-ssa-dse.c
===================================================================
--- tree-ssa-dse.c (revision 187053)
+++ tree-ssa-dse.c (working copy)
@@ -199,9 +199,9 @@ dse_possible_dead_store_p (gimple stmt,
post dominates the first store, then the first store is dead. */
static void
-dse_optimize_stmt (gimple_stmt_iterator gsi)
+dse_optimize_stmt (gimple_stmt_iterator *gsi)
{
- gimple stmt = gsi_stmt (gsi);
+ gimple stmt = gsi_stmt (*gsi);
/* If this statement has no virtual defs, then there is nothing
to do. */
@@ -252,7 +252,7 @@ dse_optimize_stmt (gimple_stmt_iterator
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, " Deleted dead store '");
- print_gimple_stmt (dump_file, gsi_stmt (gsi), dump_flags, 0);
+ print_gimple_stmt (dump_file, gsi_stmt (*gsi), dump_flags, 0);
fprintf (dump_file, "'\n");
}
@@ -261,7 +261,7 @@ dse_optimize_stmt (gimple_stmt_iterator
/* Remove the dead store. */
bb = gimple_bb (stmt);
- if (gsi_remove (&gsi, true))
+ if (gsi_remove (gsi, true))
bitmap_set_bit (need_eh_cleanup, bb->index);
/* And release any SSA_NAMEs set in this statement back to the
@@ -277,8 +277,14 @@ dse_enter_block (struct dom_walk_data *w
{
gimple_stmt_iterator gsi;
- for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi_prev (&gsi))
- dse_optimize_stmt (gsi);
+ for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi);)
+ {
+ dse_optimize_stmt (&gsi);
+ if (gsi_end_p (gsi))
+ gsi = gsi_last_bb (bb);
+ else
+ gsi_prev (&gsi);
+ }
}
/* Main entry point. */