]> gcc.gnu.org Git - gcc.git/commitdiff
Avoid update_ssa quadraticness in loop splitting
authorRichard Biener <rguenther@suse.de>
Thu, 6 May 2021 09:29:25 +0000 (11:29 +0200)
committerRichard Biener <rguenther@suse.de>
Thu, 6 May 2021 11:54:02 +0000 (13:54 +0200)
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.

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

index b80b6a75e62e5b6f2b846bf3acd3419a34597df3..3a09bbc39e522aec8856d209c4f58b9f80bd755a 100644 (file)
@@ -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;
 }
 
This page took 0.070459 seconds and 5 git commands to generate.