https://gcc.gnu.org/g:1db025c67fc19612332d1668607ab800f0251520
commit r15-6732-g1db025c67fc19612332d1668607ab800f0251520 Author: Richard Biener <rguent...@suse.de> Date: Wed Jan 8 15:12:30 2025 +0100 Avoid PHI node re-allocation in loop copying duplicate_loop_body_to_header_edge redirects the original loop entry edge to the loop copy header and the copied loop exit to the old loop header. But it does so in the order that requires temporary space for an extra edge on the original loop header, causing unnecessary re-allocations. The following avoids this by swapping the order of the redirects. * cfgloopmanip.cc (duplicate_loop_body_to_header_edge): When copying to the header edge first redirect the entry to the new loop and then the exit to the old to avoid PHI node re-allocation. Diff: --- gcc/cfgloopmanip.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/cfgloopmanip.cc b/gcc/cfgloopmanip.cc index 534e556e1e4e..17bcf9f4acc4 100644 --- a/gcc/cfgloopmanip.cc +++ b/gcc/cfgloopmanip.cc @@ -1447,9 +1447,9 @@ duplicate_loop_body_to_header_edge (class loop *loop, edge e, } else { + redirect_edge_and_branch_force (e, new_bbs[0]); redirect_edge_and_branch_force (new_spec_edges[SE_LATCH], loop->header); - redirect_edge_and_branch_force (e, new_bbs[0]); set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], e->src); e = new_spec_edges[SE_LATCH]; }