On Mon, 5 Feb 2024, Tamar Christina wrote:
> Hi All,
>
> We use gsi_move_before (&stmt_gsi, &dest_gsi); to request that the new
> statement
> be placed before any other statement. Typically this then moves the current
> pointer to be after the statement we just inserted.
>
> However it looks like when the BB is empty, this does not happen and the CUR
> pointer stays NULL. There's a comment in the source of gsi_insert_before
> that
> explains:
>
> /* If CUR is NULL, we link at the end of the sequence (this case happens
>
> so it adds it to the end instead of start like you asked. This means that in
> this case there's nothing to move and so we shouldn't move the pointer if
> we're
> already at the HEAD.
The issue is that a gsi_end_p () is ambiguous, it could be the start
or the end. gsi_insert_before treats it as "end" while gsi_insert_after
treats it as "start" since you can't really insert "after" the "end".
gsi_move_before doesn't update the insertion pointer (using
GSI_SAME_STMT), so with a gsi_end_p () you get what you ask for.
Btw,
/* Move all stmts that need moving. */
basic_block dest_bb = LOOP_VINFO_EARLY_BRK_DEST_BB (loop_vinfo);
gimple_stmt_iterator dest_gsi = gsi_start_bb (dest_bb);
should probably use gsi_after_labels (dest_bb) just in case.
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?
> Bootstrapped Regtested on aarch64-none-linux-gnu and no issues.
>
> Ok for master?
>
> Thanks,
> Tamar
>
> gcc/ChangeLog:
>
> PR tree-optimization/113731
> * tree-vect-loop.cc (move_early_exit_stmts): Conditionally move pointer.
>
> gcc/testsuite/ChangeLog:
>
> PR tree-optimization/113731
> * gcc.dg/vect/vect-early-break_111-pr113731.c: New test.
>
> --- inline copy of patch --
> diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_111-pr113731.c
> b/gcc/testsuite/gcc.dg/vect/vect-early-break_111-pr113731.c
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..2d6db91df97625a7f11609d034e89af0461129b2
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_111-pr113731.c
> @@ -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();
> +}
> diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
> index
> 30b90d99925bea74caf14833d8ab1695607d0fe9..e2587315020a35a7d4ebd3e7a9842caa36bb5d3c
> 100644
> --- a/gcc/tree-vect-loop.cc
> +++ b/gcc/tree-vect-loop.cc
> @@ -11801,7 +11801,8 @@ move_early_exit_stmts (loop_vec_info loop_vinfo)
>
> gimple_stmt_iterator stmt_gsi = gsi_for_stmt (stmt);
> gsi_move_before (&stmt_gsi, &dest_gsi);
> - gsi_prev (&dest_gsi);
> + if (!gsi_end_p (dest_gsi))
> + gsi_prev (&dest_gsi);
> }
>
> /* Update all the stmts with their new reaching VUSES. */
>
>
>
>
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)