On Mon, 29 Apr 2019, Richard Biener wrote: > > The following fixes PR90273 where the testcase exhibits an excessive > number of debug stmts after the recent fixes to CFG cleanup to not > throw away debug stmts it cannot move but instead move and reset them. > This excessiveness causes compile-time and memory-usage to go through the > roof. > > The fix is to deploy a simple debug-stmt DCE eliminating all but the > last debug-bind (of non-DEBUG_EXPR_DECL vars) in a series of > debug-bind-only stmts. This simple DCE is hooked into the DCE > pass and implemented BB-local. > > Bootstrapped / tested a slightly older version, re-bootstrap/regtest > in progress on x86_64-unknown-linux-gnu.
Testing went OK. > OK for trunk and branch? > > Thanks, > Richard. > > 2019-04-29 Richard Biener <rguent...@suse.de> > > PR tree-optimization/90273 > * tree-ssa-dce.c (eliminate_unnecessary_stmts): Eliminate > useless debug stmts. > > Index: gcc/tree-ssa-dce.c > =================================================================== > --- gcc/tree-ssa-dce.c (revision 270640) > +++ gcc/tree-ssa-dce.c (working copy) > @@ -1237,6 +1237,7 @@ eliminate_unnecessary_stmts (void) > bb = h.pop (); > > /* Remove dead statements. */ > + auto_bitmap debug_seen; > for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi = psi) > { > stmt = gsi_stmt (gsi); > @@ -1282,11 +1283,15 @@ eliminate_unnecessary_stmts (void) > } > } > if (!dead) > - continue; > + { > + bitmap_clear (debug_seen); > + continue; > + } > } > if (!is_gimple_debug (stmt)) > something_changed = true; > remove_dead_stmt (&gsi, bb, to_remove_edges); > + continue; > } > else if (is_gimple_call (stmt)) > { > @@ -1352,6 +1357,18 @@ eliminate_unnecessary_stmts (void) > break; > } > } > + else if (gimple_debug_bind_p (stmt)) > + { > + /* We are only keeping the last debug-bind of a > + non-DEBUG_EXPR_DECL variable in a series of > + debug-bind stmts. */ > + tree var = gimple_debug_bind_get_var (stmt); > + if (TREE_CODE (var) != DEBUG_EXPR_DECL > + && !bitmap_set_bit (debug_seen, DECL_UID (var))) > + remove_dead_stmt (&gsi, bb, to_remove_edges); > + continue; > + } > + bitmap_clear (debug_seen); > } > > /* Remove dead PHI nodes. */ > -- Richard Biener <rguent...@suse.de> SUSE Linux GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer, Mary Higgins, Sri Rasiah; HRB 21284 (AG Nürnberg)