On Mon, 10 Feb 2025, Richard Biener wrote: > On Mon, 10 Feb 2025, Richard Biener wrote: > > > The following addresses the fact that we keep an excessive amount of > > redundant DEBUG BEGIN_STMTs - in the testcase it sums up to 99.999% > > of all stmts, sucking up compile-time in IL walks. The patch amends > > the GIMPLE DCE code that elides redundant DEBUG BIND stmts, also > > pruning uninterrupted sequences of DEBUG BEGIN_STMTs, keeping only > > the last one. > > > > Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. > > > > For the testcase this brings down compile-time to 150% of -g0 levels > > (and only 215 out of originally 1981380 DEBUG BEGIN_STMTs kept). > > > > OK for trunk and possibly backports? > > It regresses a few guality checks (and progresses one), I've looked > only into one, g++.dg/guality/pr67192.C, where we now see > FAIL: g++.dg/guality/pr67192.C -O[123sg] line 54 cnt == 15 > because the breakpoint happens in the wrong place. But this shows > it "works" only by accident. The testcase is > > __attribute__((noinline, noclone)) static void > f4 (void) > { > while (1) /* { dg-final { gdb-test 54 "cnt" "15" } } */ > if (last ()) > break; > else > do_it (); > do_it (); /* { dg-final { gdb-test 59 "cnt" "20" } } */ > } > > and we have two BEGIN_STMTs for line 54(!) originally: > > [/space/rguenther/src/gcc/gcc/testsuite/g++.dg/guality/pr67192.C:54:3] # > DEBUG BEGIN_STMT > <D.2884>: > [/space/rguenther/src/gcc/gcc/testsuite/g++.dg/guality/pr67192.C:55:5] # > DEBUG BEGIN_STMT > ... > [/space/rguenther/src/gcc/gcc/testsuite/g++.dg/guality/pr67192.C:54:3] # > DEBUG BEGIN_STMT > [/space/rguenther/src/gcc/gcc/testsuite/g++.dg/guality/pr67192.C:55:5] > goto <D.2884>; > > and special code in make_blocks() moves the first BEGIN_STMT after > the label, altering when we reach a breakpoint on the line. > > You can see that with the first BEGIN_STMT moved the patch will elide it, > and gdb will find the second location. > > With removing only repeating BEGIN_STMT with exactly > the same location (unfortunately with uint64_t a bitmap no longer > works), we're "only" down to 996 BEGIN_STMTs for the testcase. > > So I'm retesting the following.
Bootstrapped and tested on x86_64-unknown-linux-gnu without regressions this time. Alex, is this OK for trunk? Thanks, Richard. > Richard. > > From 38d49d3e2c0bf98e9e2a46e251ae0454b084cc8d Mon Sep 17 00:00:00 2001 > From: Richard Biener <rguent...@suse.de> > Date: Mon, 10 Feb 2025 10:23:45 +0100 > Subject: [PATCH] middle-end/118801 - excessive redundant DEBUG BEGIN_STMT > To: gcc-patches@gcc.gnu.org > > The following addresses the fact that we keep an excessive amount of > redundant DEBUG BEGIN_STMTs - in the testcase it sums up to 99.999% > of all stmts, sucking up compile-time in IL walks. The patch amends > the GIMPLE DCE code that elides redundant DEBUG BIND stmts, also > pruning uninterrupted sequences of DEBUG BEGIN_STMTs, keeping only > the last of each set of DEBUG BEGIN_STMT with unique location. > > PR middle-end/118801 > * tree-ssa-dce.cc (eliminate_unnecessary_stmts): Prune > sequences of uninterrupted DEBUG BEGIN_STMTs, keeping only > the last of a set with unique location. > --- > gcc/tree-ssa-dce.cc | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/gcc/tree-ssa-dce.cc b/gcc/tree-ssa-dce.cc > index be21a2d0b50..461283ba858 100644 > --- a/gcc/tree-ssa-dce.cc > +++ b/gcc/tree-ssa-dce.cc > @@ -1508,6 +1508,7 @@ eliminate_unnecessary_stmts (bool aggressive) > > /* Remove dead statements. */ > auto_bitmap debug_seen; > + hash_set<int_hash <location_t, 0>> locs_seen; > for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi = psi) > { > stmt = gsi_stmt (gsi); > @@ -1670,6 +1671,15 @@ eliminate_unnecessary_stmts (bool aggressive) > remove_dead_stmt (&gsi, bb, to_remove_edges); > continue; > } > + else if (gimple_debug_begin_stmt_p (stmt)) > + { > + /* We are only keeping the last debug-begin in a series of > + debug-begin stmts. */ > + if (locs_seen.add (gimple_location (stmt))) > + remove_dead_stmt (&gsi, bb, to_remove_edges); > + continue; > + } > + locs_seen.empty (); > bitmap_clear (debug_seen); > } > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)