First do add_noreturn_fake_exit_edges in connect_infinite_loops_to_exit
authorRichard Biener <rguenther@suse.de>
Thu, 25 Feb 2021 10:31:37 +0000 (11:31 +0100)
committerRichard Biener <rguenther@suse.de>
Fri, 23 Apr 2021 10:05:42 +0000 (12:05 +0200)
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.

gcc/cfganal.c
gcc/ipa-sra.c
gcc/predict.c
gcc/store-motion.c

index 2627c2f..cec5abe 100644 (file)
@@ -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;
index 1571921..7a89906 100644 (file)
@@ -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;
index dc2327d..5d0cae5 100644 (file)
@@ -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);
index f0401ca..3f6e003 100644 (file)
@@ -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,