From: Richard Biener Date: Thu, 6 May 2021 09:29:25 +0000 (+0200) Subject: Avoid update_ssa quadraticness in loop splitting X-Git-Tag: basepoints/gcc-13~7750 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a1ac9ffb5a7f44b2e2633b7265c21ce803c8e854;p=thirdparty%2Fgcc.git Avoid update_ssa quadraticness in loop splitting 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 * 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. --- diff --git a/gcc/tree-ssa-loop-split.c b/gcc/tree-ssa-loop-split.c index b80b6a75e62e..3a09bbc39e52 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; }