Avoid update_ssa quadraticness in loop splitting

Message ID nycvar.YFH.7.76.2105061352230.11431@elmra.sevgm.obk
State New
Headers show
Series
  • Avoid update_ssa quadraticness in loop splitting
Related show

Commit Message

Richard Biener May 6, 2021, 11:53 a.m.
We already take care to not apply loop splitting to IL produced
by splitting so we should be able to delay updating SSA and
loop-closed SSA that was left broken after loop versioning
until after we processed all opportunities.

Bootstrapped and tested on x86_64-unknown-linux-gnu, I've also
built SPEC CPU 2017 with and without LTO for extra verification
and added a -fopt-info-loop message to one path where it was missing
to verify we are actually splitting loops in SPEC (we do).

Pushed.

2021-05-06  Richard Biener  <rguenther@suse.de>

	* tree-ssa-loop-split.c (split_loop): Delay updating SSA form.
	Output an opt-info message.
	(do_split_loop_on_cond): Likewise.
	(tree_ssa_split_loops): Update SSA form here.
---
 gcc/tree-ssa-loop-split.c | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

-- 
2.26.2

Patch

diff --git a/gcc/tree-ssa-loop-split.c b/gcc/tree-ssa-loop-split.c
index b80b6a75e62..3a09bbc39e5 100644
--- a/gcc/tree-ssa-loop-split.c
+++ b/gcc/tree-ssa-loop-split.c
@@ -589,7 +589,6 @@  split_loop (class loop *loop1)
 					   profile_probability::always (),
 					   true);
 	gcc_assert (loop2);
-	update_ssa (TODO_update_ssa);
 
 	edge new_e = connect_loops (loop1, loop2);
 	connect_loop_phis (loop1, loop2, new_e);
@@ -621,14 +620,13 @@  split_loop (class loop *loop1)
 
 	free_original_copy_tables ();
 
-	/* We destroyed LCSSA form above.  Eventually we might be able
-	   to fix it on the fly, for now simply punt and use the helper.  */
-	rewrite_into_loop_closed_ssa_1 (NULL, 0, SSA_OP_USE, loop1);
-
 	changed = true;
 	if (dump_file && (dump_flags & TDF_DETAILS))
 	  fprintf (dump_file, ";; Loop split.\n");
 
+	if (dump_enabled_p ())
+	  dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, guard_stmt, "loop split\n");
+
 	/* Only deal with the first opportunity.  */
 	break;
       }
@@ -1532,8 +1530,6 @@  do_split_loop_on_cond (struct loop *loop1, edge invar_branch)
   to_loop1->flags |= true_invar ? EDGE_FALSE_VALUE : EDGE_TRUE_VALUE;
   to_loop2->flags |= true_invar ? EDGE_TRUE_VALUE : EDGE_FALSE_VALUE;
 
-  update_ssa (TODO_update_ssa);
-
   /* Due to introduction of a control flow edge from loop1 latch to loop2
      pre-header, we should update PHIs in loop2 to reflect this connection
      between loop1 and loop2.  */
@@ -1541,8 +1537,6 @@  do_split_loop_on_cond (struct loop *loop1, edge invar_branch)
 
   free_original_copy_tables ();
 
-  rewrite_into_loop_closed_ssa_1 (NULL, 0, SSA_OP_USE, loop1);
-
   return true;
 }
 
@@ -1644,7 +1638,10 @@  tree_ssa_split_loops (void)
   free_dominance_info (CDI_POST_DOMINATORS);
 
   if (changed)
-    return TODO_cleanup_cfg;
+    {
+      rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
+      return TODO_cleanup_cfg;
+    }
   return 0;
 }