diff options
author | Vladislav Ivanishin <vlad@ispras.ru> | 2019-05-21 10:45:32 +0000 |
---|---|---|
committer | Vladislav Ivanishin <vlad@gcc.gnu.org> | 2019-05-21 10:45:32 +0000 |
commit | d8bbf1d94ce6e95650ce3f163086b20ec586f537 (patch) | |
tree | 5cbdd8f8878d9314e0908c6e1b0cc24c9933ac06 /gcc/tree-cfg.c | |
parent | 0f8e84c609c67456965b20e1274e7dca3db9ab05 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 14 |
1 files changed, 8 insertions, 6 deletions
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; |