diff options
author | Richard Biener <rguenther@suse.de> | 2020-11-11 11:51:59 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-11-11 12:51:40 +0100 |
commit | bd87cc14ebdb6789e067fb1828d5808407c308b3 (patch) | |
tree | b8a9996427f6fef9253105e725212f444c7bb178 /gcc/tree-ssa-pre.c | |
parent | 46c705e70e078f6a1920d92e49042125d5e18495 (diff) | |
download | gcc-bd87cc14ebdb6789e067fb1828d5808407c308b3.zip gcc-bd87cc14ebdb6789e067fb1828d5808407c308b3.tar.gz gcc-bd87cc14ebdb6789e067fb1828d5808407c308b3.tar.bz2 |
tree-optimization/97623 - Avoid PRE hoist insertion iteration
The recent previous change in this area limited hoist insertion
iteration via a param but the following is IMHO better since
we are not really interested in PRE opportunities exposed by
hoisting but only the other way around. So this moves hoist
insertion after PRE iteration finished and removes hoist
insertion iteration alltogether.
2020-11-11 Richard Biener <rguenther@suse.de>
PR tree-optimization/97623
* params.opt (-param=max-pre-hoist-insert-iterations): Remove
again.
* doc/invoke.texi (max-pre-hoist-insert-iterations): Likewise.
* tree-ssa-pre.c (insert): Move hoist insertion after PRE
insertion iteration and do not iterate it.
* gcc.dg/tree-ssa/ssa-hoist-3.c: Adjust.
* gcc.dg/tree-ssa/ssa-hoist-7.c: Likewise.
* gcc.dg/tree-ssa/ssa-pre-30.c: Likewise.
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r-- | gcc/tree-ssa-pre.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index da2b689..d90249c 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -3695,18 +3695,6 @@ insert (void) fprintf (dump_file, "Starting insert iteration %d\n", num_iterations); changed = false; - /* Insert expressions for hoisting. Do a backward walk here since - 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]); - if (EDGE_COUNT (block->succs) >= 2) - changed |= do_hoist_insertion (block); - } for (int idx = 0; idx < rpo_num; ++idx) { basic_block block = BASIC_BLOCK_FOR_FN (cfun, rpo[idx]); @@ -3754,6 +3742,28 @@ insert (void) statistics_histogram_event (cfun, "insert iterations", num_iterations); + /* AVAIL_OUT is not needed after insertion so we don't have to + propagate NEW_SETS from hoist insertion. */ + FOR_ALL_BB_FN (bb, cfun) + { + bitmap_set_pool.remove (NEW_SETS (bb)); + NEW_SETS (bb) = NULL; + } + + /* Insert expressions for hoisting. Do a backward walk here since + inserting into BLOCK exposes new opportunities in its predecessors. + Since PRE and hoist insertions can cause back-to-back iteration + and we are interested in PRE insertion exposed hoisting opportunities + but not in hoisting exposed PRE ones do hoist insertion only after + PRE insertion iteration finished and do not iterate it. */ + if (flag_code_hoisting) + for (int idx = rpo_num - 1; idx >= 0; --idx) + { + basic_block block = BASIC_BLOCK_FOR_FN (cfun, rpo[idx]); + if (EDGE_COUNT (block->succs) >= 2) + changed |= do_hoist_insertion (block); + } + free (rpo); } |