aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2025-02-10 10:23:45 +0100
committerRichard Biener <rguenth@gcc.gnu.org>2025-03-07 09:59:18 +0100
commite1c49f413c8c892a61612b3b89de0607ff7ba893 (patch)
tree50bb2b327f48d2ff28420d7e318b78f7a2a6e667 /gcc
parent888e70b322622528dac17f04738ffa232c6fb82d (diff)
downloadgcc-e1c49f413c8c892a61612b3b89de0607ff7ba893.zip
gcc-e1c49f413c8c892a61612b3b89de0607ff7ba893.tar.gz
gcc-e1c49f413c8c892a61612b3b89de0607ff7ba893.tar.bz2
middle-end/118801 - excessive redundant DEBUG BEGIN_STMT
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/tree-ssa-dce.cc10
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/tree-ssa-dce.cc b/gcc/tree-ssa-dce.cc
index 18af818..ba9cd65 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);
}