tree-optimization/113385 - wrong loop father with early exit vectorization

Message ID 20240115113240.B85A03857B8B@sourceware.org
State Unresolved
Headers
Series tree-optimization/113385 - wrong loop father with early exit vectorization |

Checks

Context Check Description
snail/gcc-patch-check warning Git am fail log

Commit Message

Richard Biener Jan. 15, 2024, 11:26 a.m. UTC
  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(-)
  

Patch

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;