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.

Boostrapped and tested on x86_64-unknown-linux-gnu, queued for stage1.

2021-02-25  Richard Biener  <rguent...@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.
---
 gcc/cfganal.c      | 10 +++++++---
 gcc/ipa-sra.c      |  1 -
 gcc/predict.c      |  2 --
 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 d0a8e5f8e04..0bf1748ffa8 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.  */
@@ -4291,7 +4290,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,
-- 
2.26.2

Reply via email to