tree-optimization/97623 - limit PRE hoist insertion
authorRichard Biener <rguenther@suse.de>
Tue, 3 Nov 2020 14:03:41 +0000 (15:03 +0100)
committerRichard Biener <rguenther@suse.de>
Tue, 3 Nov 2020 15:23:06 +0000 (16:23 +0100)
This limits insert iteration caused by PRE insertions generating
hoist insertion opportunities and vice versa.  The patch limits
the hoist insertion iterations to three by default.

2020-11-03  Richard Biener  <rguenther@suse.de>

PR tree-optimization/97623
* params.opt (-param=max-pre-hoist-insert-iterations): New.
* doc/invoke.texi (max-pre-hoist-insert-iterations): Document.
* tree-ssa-pre.c (insert): Do at most max-pre-hoist-insert-iterations
hoist insert iterations.

gcc/doc/invoke.texi
gcc/params.opt
gcc/tree-ssa-pre.c

index 89168be1d2fa0fb8fa09d7a6b0ad97babfca4603..5320e6c1e1e3c8d1482c20590049f763e11f8ff0 100644 (file)
@@ -13408,6 +13408,11 @@ is aborted and the load or store is not considered redundant.  The
 number of queries is algorithmically limited to the number of
 stores on all paths from the load to the function entry.
 
+@item max-pre-hoist-insert-iterations
+The maximum number of iterations doing insertion during code
+hoisting which is done as part of the partial redundancy elimination
+insertion phase.
+
 @item ira-max-loops-num
 IRA uses regional register allocation by default.  If a function
 contains more loops than the number given by this parameter, only at most
index 7bac39a9d588024f8df142478ad425a4a7c60677..a33a371a395df179dc8b1ed2b7ef9e9120d384fa 100644 (file)
@@ -597,6 +597,10 @@ Maximum depth of sqrt chains to use when synthesizing exponentiation by a real c
 Common Joined UInteger Var(param_max_predicted_iterations) Init(100) IntegerRange(0, 65536) Param Optimization
 The maximum number of loop iterations we predict statically.
 
+-param=max-pre-hoist-insert-iterations=
+Common Joined UInteger Var(param_max_pre_hoist_insert_iterations) Init(3) Param Optimization
+The maximum number of insert iterations done for PRE code hoisting.
+
 -param=max-reload-search-insns=
 Common Joined UInteger Var(param_max_reload_search_insns) Init(100) Param Optimization
 The maximum number of instructions to search backward when looking for equivalent reload.
index 091ecb39bb67d7726beedaac9711f84e00eb0779..39c52c9b0f0b30e7d2d83641e6b333168bb5062f 100644 (file)
@@ -3647,8 +3647,11 @@ insert (void)
 
       changed = false;
       /* Insert expressions for hoisting.  Do a backward walk here since
-        inserting into BLOCK exposes new opportunities in its predecessors.  */
-      if (flag_code_hoisting)
+        inserting into BLOCK exposes new opportunities in its predecessors.
+        Since PRE and hoist insertions can cause back-to-back iteration
+        limit that on the hoist side.  */
+      if (flag_code_hoisting
+         && num_iterations <= param_max_pre_hoist_insert_iterations)
        for (int idx = rpo_num - 1; idx >= 0; --idx)
          {
            basic_block block = BASIC_BLOCK_FOR_FN (cfun, rpo[idx]);