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];
        }

Reply via email to