From d8bbf1d94ce6e95650ce3f163086b20ec586f537 Mon Sep 17 00:00:00 2001 From: Vladislav Ivanishin Date: Tue, 21 May 2019 10:45:32 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 14 ++++++++++++++ gcc/tree-cfg.c | 14 ++++++++------ gcc/tree-cfg.h | 9 ++++++++- gcc/tree-ssa-pre.c | 2 +- gcc/tree-ssa-sink.c | 4 ++-- gcc/tree-ssa-tail-merge.c | 2 +- 6 files changed, 34 insertions(+), 11 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d341a64440c..e9f7b1f4d38 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2019-05-21 Vladislav Ivanishin + + * 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 * tree-ssa-uninit.c (value_sat_pred_p): This new function is a wrapper diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 4655d7f8073..85ce204ec26 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 212f5ff5919..836f8e8af51 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 469199fa213..086f8c33336 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 fe762f54d96..77abe3aa4b6 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 3eb63b5fa6d..cbd5a277b39 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)) -- 2.30.2