diff options
author | Richard Biener <rguenther@suse.de> | 2021-02-25 11:31:37 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-04-23 12:05:42 +0200 |
commit | 58ad6b2802592f1448eed48e8ad4e0e87985cecb (patch) | |
tree | 30b72ca9d3cf65ffb8a78916140aca0253359da6 | |
parent | 500305a92ef85e6b87ad428a35221c62f4037b93 (diff) | |
download | gcc-58ad6b2802592f1448eed48e8ad4e0e87985cecb.tar.gz |
First do add_noreturn_fake_exit_edges in connect_infinite_loops_to_exit
Most callers of connect_infinite_loops_to_exit already do this but
the few that do not end up with extra exit edges. The following
makes that consistent, also matching the post-dominance DFS walk code.
2021-02-25 Richard Biener <rguenther@suse.de>
* cfganal.c (connect_infinite_loops_to_exit): First call
add_noreturn_fake_exit_edges.
* ipa-sra.c (process_scan_results): Do not call the now redundant
add_noreturn_fake_exit_edges.
* predict.c (tree_estimate_probability): Likewise.
(rebuild_frequencies): Likewise.
* store-motion.c (one_store_motion_pass): Likewise.
-rw-r--r-- | gcc/cfganal.c | 10 | ||||
-rw-r--r-- | gcc/ipa-sra.c | 1 | ||||
-rw-r--r-- | gcc/predict.c | 2 | ||||
-rw-r--r-- | gcc/store-motion.c | 1 |
4 files changed, 7 insertions, 7 deletions
diff --git a/gcc/cfganal.c b/gcc/cfganal.c index 2627c2ff457..cec5abe30f9 100644 --- a/gcc/cfganal.c +++ b/gcc/cfganal.c @@ -582,9 +582,9 @@ add_noreturn_fake_exit_edges (void) make_single_succ_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), EDGE_FAKE); } -/* This function adds a fake edge between any infinite loops to the - exit block. Some optimizations require a path from each node to - the exit node. +/* This function adds a fake edge between any noreturn block and + infinite loops to the exit block. Some optimizations require a path + from each node to the exit node. See also Morgan, Figure 3.10, pp. 82-83. @@ -596,6 +596,10 @@ add_noreturn_fake_exit_edges (void) void connect_infinite_loops_to_exit (void) { + /* First add fake exits to noreturn blocks, this is required to + discover only truly infinite loops below. */ + add_noreturn_fake_exit_edges (); + /* Perform depth-first search in the reverse graph to find nodes reachable from the exit block. */ depth_first_search dfs; diff --git a/gcc/ipa-sra.c b/gcc/ipa-sra.c index 1571921cb48..7a89906cee6 100644 --- a/gcc/ipa-sra.c +++ b/gcc/ipa-sra.c @@ -2394,7 +2394,6 @@ process_scan_results (cgraph_node *node, struct function *fun, if (!pdoms_calculated) { gcc_checking_assert (cfun); - add_noreturn_fake_exit_edges (); connect_infinite_loops_to_exit (); calculate_dominance_info (CDI_POST_DOMINATORS); pdoms_calculated = true; diff --git a/gcc/predict.c b/gcc/predict.c index dc2327d4032..5d0cae5c4a4 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -3106,7 +3106,6 @@ tree_estimate_probability (bool dry_run) { basic_block bb; - add_noreturn_fake_exit_edges (); connect_infinite_loops_to_exit (); /* We use loop_niter_by_eval, which requires that the loops have preheaders. */ @@ -4289,7 +4288,6 @@ rebuild_frequencies (void) if (profile_status_for_fn (cfun) == PROFILE_GUESSED) { loop_optimizer_init (0); - add_noreturn_fake_exit_edges (); mark_irreducible_loops (); connect_infinite_loops_to_exit (); estimate_bb_frequencies (true); diff --git a/gcc/store-motion.c b/gcc/store-motion.c index f0401cae272..3f6e003219d 100644 --- a/gcc/store-motion.c +++ b/gcc/store-motion.c @@ -1152,7 +1152,6 @@ one_store_motion_pass (void) /* Now compute kill & transp vectors. */ build_store_vectors (); - add_noreturn_fake_exit_edges (); connect_infinite_loops_to_exit (); edge_list = pre_edge_rev_lcm (num_stores, st_transp, st_avloc, |