On Mon, Feb 05, 2024 at 03:31:20PM +0100, Richard Biener wrote: > On Mon, 5 Feb 2024, Tamar Christina wrote: > > > It looks like LOOP_VINFO_EARLY_BRK_STORES is "reverse"? Is that > > > why you are doing gsi_move_before + gsi_prev? Why do gsi_prev > > > at all? > > > > > > > As discussed on IRC, then how about this one. > > Incremental building passed all tests and bootstrap is running. > > > > Ok for master if bootstrap and regtesting clean? > > > > Thanks, > > Tamar > > > > gcc/ChangeLog: > > > > PR tree-optimization/113731 > > * gimple-iterator.cc (gsi_move_before): Take new parameter for update > > method. > > * gimple-iterator.h (gsi_move_before): Default new param to > > GSI_SAME_STMT. > > * tree-vect-loop.cc (move_early_exit_stmts): Call gsi_move_before with > > GSI_NEW_STMT. > > > > gcc/testsuite/ChangeLog: > > > > PR tree-optimization/113731 > > * gcc.dg/vect/vect-early-break_111-pr113731.c: New test.
So like following (Tobias asked for it on IRC)? Seems it FAILs for me on x86_64-linux unless using -msse4.2 (or -msse4), dg-add-options vect_early_break adds just -msse4.1. I believe the difference is in presence/absence of the PCMPGTQ instruction, the loop is comparing pointers (other than equality comparison) and so needs it, while in SSE4.1 one only has PCMPGT{B,W,D}, so it can > compare 16-byte vectors with 8-bit, 16-bit or 32-bit elements. Shall we add /* { dg-additional-options "-msse4.2" { target i?86-*-* x86_64-*-* } } */ to the testcase? --- gcc/gimple-iterator.h.jj 2024-01-03 11:51:33.090709553 +0100 +++ gcc/gimple-iterator.h 2024-02-06 15:23:40.732532207 +0100 @@ -86,7 +86,8 @@ extern gimple_stmt_iterator gsi_for_stmt extern gimple_stmt_iterator gsi_for_stmt (gimple *, gimple_seq *); extern gphi_iterator gsi_for_phi (gphi *); extern void gsi_move_after (gimple_stmt_iterator *, gimple_stmt_iterator *); -extern void gsi_move_before (gimple_stmt_iterator *, gimple_stmt_iterator *); +extern void gsi_move_before (gimple_stmt_iterator *, gimple_stmt_iterator *, + gsi_iterator_update = GSI_SAME_STMT); extern void gsi_move_to_bb_end (gimple_stmt_iterator *, basic_block); extern void gsi_insert_on_edge (edge, gimple *); extern void gsi_insert_seq_on_edge (edge, gimple_seq); --- gcc/gimple-iterator.cc.jj 2024-01-03 11:51:42.016585669 +0100 +++ gcc/gimple-iterator.cc 2024-02-06 15:23:12.274926647 +0100 @@ -666,10 +666,11 @@ gsi_move_after (gimple_stmt_iterator *fr /* Move the statement at FROM so it comes right before the statement - at TO. */ + at TO using method M. */ void -gsi_move_before (gimple_stmt_iterator *from, gimple_stmt_iterator *to) +gsi_move_before (gimple_stmt_iterator *from, gimple_stmt_iterator *to, + gsi_iterator_update m) { gimple *stmt = gsi_stmt (*from); gsi_remove (from, false); @@ -677,7 +678,7 @@ gsi_move_before (gimple_stmt_iterator *f /* For consistency with gsi_move_after, it might be better to have GSI_NEW_STMT here; however, that breaks several places that expect that TO does not change. */ - gsi_insert_before (to, stmt, GSI_SAME_STMT); + gsi_insert_before (to, stmt, m); } --- gcc/tree-vect-loop.cc.jj 2024-01-25 09:06:34.116831262 +0100 +++ gcc/tree-vect-loop.cc 2024-02-06 15:22:49.268245536 +0100 @@ -11800,8 +11800,7 @@ move_early_exit_stmts (loop_vec_info loo dump_printf_loc (MSG_NOTE, vect_location, "moving stmt %G", stmt); gimple_stmt_iterator stmt_gsi = gsi_for_stmt (stmt); - gsi_move_before (&stmt_gsi, &dest_gsi); - gsi_prev (&dest_gsi); + gsi_move_before (&stmt_gsi, &dest_gsi, GSI_NEW_STMT); } /* Update all the stmts with their new reaching VUSES. */ --- gcc/testsuite/gcc.dg/vect/vect-early-break_111-pr113731.c.jj 2024-02-06 15:22:49.248245813 +0100 +++ gcc/testsuite/gcc.dg/vect/vect-early-break_111-pr113731.c 2024-02-06 15:22:49.248245813 +0100 @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-add-options vect_early_break } */ +/* { dg-require-effective-target vect_early_break } */ +/* { dg-require-effective-target vect_int } */ + +/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ + +char* inet_net_pton_ipv4_bits; +char inet_net_pton_ipv4_odst; +void __errno_location(); +void inet_net_pton_ipv4(); +void inet_net_pton() { inet_net_pton_ipv4(); } +void inet_net_pton_ipv4(char *dst, int size) { + while ((inet_net_pton_ipv4_bits > dst) & inet_net_pton_ipv4_odst) { + if (size-- <= 0) + goto emsgsize; + *dst++ = '\0'; + } +emsgsize: + __errno_location(); +} Jakub