aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislav Ivanishin <vlad@ispras.ru>2019-05-21 10:45:32 +0000
committerVladislav Ivanishin <vlad@gcc.gnu.org>2019-05-21 10:45:32 +0000
commitd8bbf1d94ce6e95650ce3f163086b20ec586f537 (patch)
tree5cbdd8f8878d9314e0908c6e1b0cc24c9933ac06
parent0f8e84c609c67456965b20e1274e7dca3db9ab05 (diff)
downloadgcc-d8bbf1d94ce6e95650ce3f163086b20ec586f537.zip
gcc-d8bbf1d94ce6e95650ce3f163086b20ec586f537.tar.gz
gcc-d8bbf1d94ce6e95650ce3f163086b20ec586f537.tar.bz2
Don't split non-critical edges in crited
gcc/ChangeLog: * tree-cfg.h (split_critical_edges): Add for_edge_insertion_p parameter with default value false to declaration. (split_edges_for_insertion): New inline function. Wrapper for split_critical_edges with for_edge_insertion_p = true. * tree-cfg.c (split_critical_edges): Don't split non-critical edges if for_edge_insertion_p is false. Fix whitespace. * tree-ssa-pre.c (pass_pre::execute): Call split_edges_for_insertion instead of split_critical_edges. * gcc/tree-ssa-tail-merge.c (tail_merge_optimize): Ditto. * gcc/tree-ssa-sink.c (pass_sink_code::execute): Ditto. (pass_data_sink_code): Update function name in the comment. From-SVN: r271461
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/tree-cfg.c14
-rw-r--r--gcc/tree-cfg.h9
-rw-r--r--gcc/tree-ssa-pre.c2
-rw-r--r--gcc/tree-ssa-sink.c4
-rw-r--r--gcc/tree-ssa-tail-merge.c2
6 files changed, 34 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d341a64..e9f7b1f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,19 @@
2019-05-21 Vladislav Ivanishin <vlad@ispras.ru>
+ * tree-cfg.h (split_critical_edges): Add for_edge_insertion_p
+ parameter with default value false to declaration.
+ (split_edges_for_insertion): New inline function. Wrapper for
+ split_critical_edges with for_edge_insertion_p = true.
+ * tree-cfg.c (split_critical_edges): Don't split non-critical
+ edges if for_edge_insertion_p is false. Fix whitespace.
+ * tree-ssa-pre.c (pass_pre::execute): Call
+ split_edges_for_insertion instead of split_critical_edges.
+ * gcc/tree-ssa-tail-merge.c (tail_merge_optimize): Ditto.
+ * gcc/tree-ssa-sink.c (pass_sink_code::execute): Ditto.
+ (pass_data_sink_code): Update function name in the comment.
+
+2019-05-21 Vladislav Ivanishin <vlad@ispras.ru>
+
* tree-ssa-uninit.c (value_sat_pred_p): This new function is a wrapper
around is_value_included_in that knows how to handle BIT_AND_EXPR.
(is_pred_expr_subset_of): Use the new function. Handle more cases where
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 4655d7f..85ce204 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -8932,10 +8932,11 @@ struct cfg_hooks gimple_cfg_hooks = {
};
-/* Split all critical edges. */
+/* Split all critical edges. Split some extra (not necessarily critical) edges
+ if FOR_EDGE_INSERTION_P is true. */
unsigned int
-split_critical_edges (void)
+split_critical_edges (bool for_edge_insertion_p /* = false */)
{
basic_block bb;
edge e;
@@ -8958,11 +8959,12 @@ split_critical_edges (void)
end by control flow statements, such as RESX.
Go ahead and split them too. This matches the logic in
gimple_find_edge_insert_loc. */
- else if ((!single_pred_p (e->dest)
- || !gimple_seq_empty_p (phi_nodes (e->dest))
- || e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
+ else if (for_edge_insertion_p
+ && (!single_pred_p (e->dest)
+ || !gimple_seq_empty_p (phi_nodes (e->dest))
+ || e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
&& e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
- && !(e->flags & EDGE_ABNORMAL))
+ && !(e->flags & EDGE_ABNORMAL))
{
gimple_stmt_iterator gsi;
diff --git a/gcc/tree-cfg.h b/gcc/tree-cfg.h
index 212f5ff..836f8e8 100644
--- a/gcc/tree-cfg.h
+++ b/gcc/tree-cfg.h
@@ -105,7 +105,7 @@ extern void extract_true_false_edges_from_block (basic_block, edge *, edge *);
extern tree find_case_label_for_value (const gswitch *switch_stmt, tree val);
extern edge find_taken_edge_switch_expr (const gswitch *switch_stmt, tree val);
extern unsigned int execute_fixup_cfg (void);
-extern unsigned int split_critical_edges (void);
+extern unsigned int split_critical_edges (bool for_edge_insertion_p = false);
extern basic_block insert_cond_bb (basic_block, gimple *, gimple *,
profile_probability);
extern bool gimple_find_sub_bbs (gimple_seq, gimple_stmt_iterator *);
@@ -128,4 +128,11 @@ should_remove_lhs_p (tree lhs)
&& !TREE_ADDRESSABLE (TREE_TYPE (lhs)));
}
+
+inline unsigned int
+split_edges_for_insertion ()
+{
+ return split_critical_edges (/*for_edge_insertion_p=*/true);
+}
+
#endif /* _TREE_CFG_H */
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 469199f..086f8c3 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -4183,7 +4183,7 @@ pass_pre::execute (function *fun)
/* This has to happen before VN runs because
loop_optimizer_init may create new phis, etc. */
loop_optimizer_init (LOOPS_NORMAL);
- split_critical_edges ();
+ split_edges_for_insertion ();
scev_initialize ();
calculate_dominance_info (CDI_DOMINATORS);
diff --git a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c
index fe762f5..77abe3a 100644
--- a/gcc/tree-ssa-sink.c
+++ b/gcc/tree-ssa-sink.c
@@ -610,7 +610,7 @@ const pass_data pass_data_sink_code =
"sink", /* name */
OPTGROUP_NONE, /* optinfo_flags */
TV_TREE_SINK, /* tv_id */
- /* PROP_no_crit_edges is ensured by running split_critical_edges in
+ /* PROP_no_crit_edges is ensured by running split_edges_for_insertion in
pass_data_sink_code::execute (). */
( PROP_cfg | PROP_ssa ), /* properties_required */
0, /* properties_provided */
@@ -636,7 +636,7 @@ unsigned int
pass_sink_code::execute (function *fun)
{
loop_optimizer_init (LOOPS_NORMAL);
- split_critical_edges ();
+ split_edges_for_insertion ();
connect_infinite_loops_to_exit ();
memset (&sink_stats, 0, sizeof (sink_stats));
calculate_dominance_info (CDI_DOMINATORS);
diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c
index 3eb63b5..cbd5a27 100644
--- a/gcc/tree-ssa-tail-merge.c
+++ b/gcc/tree-ssa-tail-merge.c
@@ -1746,7 +1746,7 @@ tail_merge_optimize (unsigned int todo)
{
cleanup_tree_cfg ();
todo &= ~TODO_cleanup_cfg;
- split_critical_edges ();
+ split_edges_for_insertion ();
}
if (!dom_info_available_p (CDI_DOMINATORS))