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