aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2025-01-10 12:30:29 +0100
committerRichard Biener <rguenth@gcc.gnu.org>2025-01-10 15:41:53 +0100
commit03faac507913803de76eab04fd74e754c70aa8c4 (patch)
treea56663ced3d3814088109dc2af867c2b2d85b5ba
parentd64447946b0c8964dfd9731c3792af0fe4158cda (diff)
downloadgcc-03faac507913803de76eab04fd74e754c70aa8c4.zip
gcc-03faac507913803de76eab04fd74e754c70aa8c4.tar.gz
gcc-03faac507913803de76eab04fd74e754c70aa8c4.tar.bz2
rtl-optimization/117467 - limit ext-dce memory use
The following puts in a hard limit on ext-dce because it might end up requiring memory on the order of the number of basic blocks times the number of pseudo registers. The limiting follows what GCSE based passes do and thus I re-use --param max-gcse-memory here. This doesn't in any way address the implementation issues of the pass, but it reduces the memory-use when compiling the module_first_rk_step_part1.F90 TU from 521.wrf_r from 25GB to 1GB. PR rtl-optimization/117467 PR rtl-optimization/117934 * ext-dce.cc (ext_dce_execute): Do nothing if a memory allocation estimate exceeds what is allowed by --param max-gcse-memory.
-rw-r--r--gcc/ext-dce.cc16
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/ext-dce.cc b/gcc/ext-dce.cc
index 6cf6418..e257e3b 100644
--- a/gcc/ext-dce.cc
+++ b/gcc/ext-dce.cc
@@ -34,6 +34,7 @@ along with GCC; see the file COPYING3. If not see
#include "df.h"
#include "print-rtl.h"
#include "dbgcnt.h"
+#include "diagnostic-core.h"
/* These should probably move into a C++ class. */
static vec<bitmap_head> livein;
@@ -1110,6 +1111,21 @@ static bool ext_dce_rd_confluence_n (edge) { return true; }
void
ext_dce_execute (void)
{
+ /* Limit the amount of memory we use for livein, with 4 bits per
+ reg per basic-block including overhead that maps to one byte
+ per reg per basic-block. */
+ uint64_t memory_request
+ = (uint64_t)n_basic_blocks_for_fn (cfun) * max_reg_num ();
+ if (memory_request / 1024 > (uint64_t)param_max_gcse_memory)
+ {
+ warning (OPT_Wdisabled_optimization,
+ "ext-dce disabled: %d basic blocks and %d registers; "
+ "increase %<--param max-gcse-memory%> above %wu",
+ n_basic_blocks_for_fn (cfun), max_reg_num (),
+ memory_request / 1024);
+ return;
+ }
+
/* Some settings of SUBREG_PROMOTED_VAR_P are actively harmful
to this pass. Clear it for those cases. */
maybe_clear_subreg_promoted_p ();