aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2025-02-05 13:17:47 +0100
committerRichard Biener <rguenth@gcc.gnu.org>2025-02-06 09:03:49 +0100
commit677122c9df1b55a791a54426269f7a8ce794f947 (patch)
treeca70c8b8523af3bf2189e4efa65987d6a43e314e /gcc
parent927e10bfce569947354cdd6b35c29b74e25c7816 (diff)
downloadgcc-677122c9df1b55a791a54426269f7a8ce794f947.zip
gcc-677122c9df1b55a791a54426269f7a8ce794f947.tar.gz
gcc-677122c9df1b55a791a54426269f7a8ce794f947.tar.bz2
rtl-optimization/117922 - disable fold-mem-offsets for highly connected CFG
The PR shows fold-mem-offsets taking ages and a lot of memory computing DU/UD chains as that requires the RD problem. The issue is not so much the memory required for the pruned sets but the high CFG connectivity (and that the CFG is cyclic) which makes solving the dataflow problem expensive. The following adds the same limit as the one imposed by GCSE and CPROP. PR rtl-optimization/117922 * fold-mem-offsets.cc (pass_fold_mem_offsets::execute): Do nothing for a highly connected CFG.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fold-mem-offsets.cc18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/fold-mem-offsets.cc b/gcc/fold-mem-offsets.cc
index a816006..c1c9447 100644
--- a/gcc/fold-mem-offsets.cc
+++ b/gcc/fold-mem-offsets.cc
@@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see
#include "df.h"
#include "tree-pass.h"
#include "cfgrtl.h"
+#include "diagnostic-core.h"
/* This pass tries to optimize memory offset calculations by moving constants
from add instructions to the memory instructions (loads / stores).
@@ -841,6 +842,23 @@ do_commit_insn (rtx_insn *insn)
unsigned int
pass_fold_mem_offsets::execute (function *fn)
{
+ /* Computing UD/DU chains for flow graphs which have a high connectivity
+ will take a long time and is unlikely to be particularly useful.
+
+ In normal circumstances a cfg should have about twice as many
+ edges as blocks. But we do not want to punish small functions
+ which have a couple switch statements. Rather than simply
+ threshold the number of blocks, uses something with a more
+ graceful degradation. */
+ if (n_edges_for_fn (fn) > 20000 + n_basic_blocks_for_fn (fn) * 4)
+ {
+ warning (OPT_Wdisabled_optimization,
+ "fold-mem-offsets: %d basic blocks and %d edges/basic block",
+ n_basic_blocks_for_fn (cfun),
+ n_edges_for_fn (cfun) / n_basic_blocks_for_fn (cfun));
+ return 0;
+ }
+
df_set_flags (DF_EQ_NOTES + DF_RD_PRUNE_DEAD_DEFS + DF_DEFER_INSN_RESCAN);
df_chain_add_problem (DF_UD_CHAIN + DF_DU_CHAIN);
df_analyze ();