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 <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to