aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-pre.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-01-04 11:59:35 +0100
committerRichard Biener <rguenther@suse.de>2022-01-04 13:17:14 +0100
commitebc853deb7cc0487de9ef6e891a007ba853d1933 (patch)
treeff4a9fa8eb5948ec31be0b09adfaa64f9746c5be /gcc/tree-ssa-pre.c
parentbeed3f8f60492289ca6211d86c54a2254a642035 (diff)
downloadgcc-ebc853deb7cc0487de9ef6e891a007ba853d1933.zip
gcc-ebc853deb7cc0487de9ef6e891a007ba853d1933.tar.gz
gcc-ebc853deb7cc0487de9ef6e891a007ba853d1933.tar.bz2
tree-optimization/103690 - not up-to-date SSA and PRE DCE
This avoids running simple_dce_from_worklist on partially not up-to-date SSA form (in unreachable code regions) by scheduling CFG cleanup manually as is done anyway when tail-merging runs. 2022-01-04 Richard Biener <rguenther@suse.de> PR tree-optimization/103690 * tree-pass.h (tail_merge_optimize): Adjust. * tree-ssa-tail-merge.c (tail_merge_optimize): Pass in whether to re-split critical edges, move CFG cleanup ... * tree-ssa-pre.c (pass_pre::execute): ... here, before simple_dce_from_worklist and delay freeing inserted_exprs from ... (fini_pre): .. here.
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r--gcc/tree-ssa-pre.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index f67bd07..ab24fa9 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -4306,7 +4306,6 @@ fini_pre ()
value_expressions.release ();
constant_value_expressions.release ();
expressions.release ();
- BITMAP_FREE (inserted_exprs);
bitmap_obstack_release (&grand_bitmap_obstack);
bitmap_set_pool.release ();
pre_expr_pool.release ();
@@ -4431,16 +4430,28 @@ pass_pre::execute (function *fun)
vn_valueize = NULL;
+ fini_pre ();
+
+ scev_finalize ();
+ loop_optimizer_finalize ();
+
+ /* Perform a CFG cleanup before we run simple_dce_from_worklist since
+ unreachable code regions will have not up-to-date SSA form which
+ confuses it. */
+ bool need_crit_edge_split = false;
+ if (todo & TODO_cleanup_cfg)
+ {
+ cleanup_tree_cfg ();
+ todo &= ~TODO_cleanup_cfg;
+ need_crit_edge_split = true;
+ }
+
/* Because we don't follow exactly the standard PRE algorithm, and decide not
to insert PHI nodes sometimes, and because value numbering of casts isn't
perfect, we sometimes end up inserting dead code. This simple DCE-like
pass removes any insertions we made that weren't actually used. */
simple_dce_from_worklist (inserted_exprs);
-
- fini_pre ();
-
- scev_finalize ();
- loop_optimizer_finalize ();
+ BITMAP_FREE (inserted_exprs);
/* TODO: tail_merge_optimize may merge all predecessors of a block, in which
case we can merge the block with the remaining predecessor of the block.
@@ -4449,7 +4460,7 @@ pass_pre::execute (function *fun)
- call merge_blocks after all tail merge iterations
- mark TODO_cleanup_cfg when necessary
- share the cfg cleanup with fini_pre. */
- todo |= tail_merge_optimize (todo);
+ todo |= tail_merge_optimize (todo, need_crit_edge_split);
free_rpo_vn ();