The following avoids splitting an edge before redirecting it.  This
allows the loop father of the new block to be correct in the first
place.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

        PR tree-optimization/113385
        * tree-vect-loop-manip.cc (slpeel_tree_duplicate_loop_to_edge_cfg):
        First redirect, then split the exit edge.
---
 gcc/tree-vect-loop-manip.cc | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
index 1d6e5e045c3..c7e73f65155 100644
--- a/gcc/tree-vect-loop-manip.cc
+++ b/gcc/tree-vect-loop-manip.cc
@@ -1613,11 +1613,11 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop 
*loop, edge loop_exit,
            {
              if (!alt_loop_exit_block)
                {
-                 alt_loop_exit_block = split_edge (exit);
                  edge res = redirect_edge_and_branch (
-                               single_succ_edge (alt_loop_exit_block),
+                               exit,
                                new_preheader);
                  flush_pending_stmts (res);
+                 alt_loop_exit_block = split_edge (res);
                  continue;
                }
              dest = alt_loop_exit_block;
-- 
2.35.3

Reply via email to