On Thu, 5 Apr 2012, Rainer Orth wrote: > Richard Guenther <richard.guent...@gmail.com> writes: > > > On Thu, Apr 5, 2012 at 1:20 PM, Rainer Orth <r...@cebitec.uni-bielefeld.de> > > wrote: > >> Richard Guenther <rguent...@suse.de> writes: > >> > >>> Several passes needlessly cleanup EH after gsi_remove because they do > >>> not know whether the stmt was removed from EH regions. The following > >>> patch returns this information from gsi_remove and adjusts all users > >>> I could find appropriately. > >> > >> I suspect this patch caused a go1 SEGV compiling the non-PIC > >> libgo/exp/norm.o on i386-pc-solaris2.10: > > > > Ah. Try > > > > Index: gcc/tree-ssa-dse.c > > =================================================================== > > --- gcc/tree-ssa-dse.c (revision 186161) > > +++ gcc/tree-ssa-dse.c (working copy) > > @@ -232,6 +232,8 @@ dse_optimize_stmt (gimple_stmt_iterator > > gimple_get_lhs (use_stmt), 0))) > > || stmt_kills_ref_p (use_stmt, gimple_assign_lhs (stmt))) > > { > > + basic_block bb; > > + > > /* If use_stmt is or might be a nop assignment, e.g. for > > struct { ... } S a, b, *p; ... > > b = a; b = b; > > @@ -258,8 +260,9 @@ dse_optimize_stmt (gimple_stmt_iterator > > unlink_stmt_vdef (stmt); > > > > /* Remove the dead store. */ > > + bb = gimple_bb (stmt); > > if (gsi_remove (&gsi, true)) > > - bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index); > > + bitmap_set_bit (need_eh_cleanup, bb->index); > > > > /* And release any SSA_NAMEs set in this statement back to the > > SSA_NAME manager. */ > > > > Works fine on x86_64-unknown-linux-gnu, where the failure happened as > well.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. 2012-04-05 Richard Guenther <rguent...@suse.de> * tree-ssa-dse.c (dse_optimize_stmt): Remember the stmt basic-block before removing it. Index: gcc/tree-ssa-dse.c =================================================================== --- gcc/tree-ssa-dse.c (revision 186161) +++ gcc/tree-ssa-dse.c (working copy) @@ -232,6 +232,8 @@ dse_optimize_stmt (gimple_stmt_iterator gimple_get_lhs (use_stmt), 0))) || stmt_kills_ref_p (use_stmt, gimple_assign_lhs (stmt))) { + basic_block bb; + /* If use_stmt is or might be a nop assignment, e.g. for struct { ... } S a, b, *p; ... b = a; b = b; @@ -258,8 +260,9 @@ dse_optimize_stmt (gimple_stmt_iterator unlink_stmt_vdef (stmt); /* Remove the dead store. */ + bb = gimple_bb (stmt); if (gsi_remove (&gsi, true)) - bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index); + bitmap_set_bit (need_eh_cleanup, bb->index); /* And release any SSA_NAMEs set in this statement back to the SSA_NAME manager. */