On Fri, 7 Aug 2026, Alfie Richards wrote:

> This is required for HSSR where the IV increment is not available until the 
> end
> of the loop body.

So ...

> gcc/ChangeLog:
> 
>       * tree-vect-loop-manip.cc (vect_set_loop_controls_directly):
>       Change IV increment position when peeled.
>       * tree-vect-loop.cc
>       (vect_update_ivs_after_vectorizer_for_early_breaks):
>       Change IV increment position.
> ---
>  gcc/tree-vect-loop-manip.cc | 20 ++++++++++++++++----
>  gcc/tree-vect-loop.cc       |  3 +--
>  2 files changed, 17 insertions(+), 6 deletions(-)
> 
> diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
> index 96c10340efd..cee3779e37f 100644
> --- a/gcc/tree-vect-loop-manip.cc
> +++ b/gcc/tree-vect-loop-manip.cc
> @@ -574,7 +574,10 @@ vect_set_loop_controls_directly (class loop *loop, 
> loop_vec_info loop_vinfo,
>    gimple_stmt_iterator incr_gsi;
>    bool insert_after;
>    edge exit_e = LOOP_VINFO_MAIN_EXIT (loop_vinfo);
> -  vect_iv_increment_position (exit_e, &incr_gsi, &insert_after);
> +  if (!LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo))
> +    vect_iv_increment_position (exit_e, &incr_gsi, &insert_after);
> +  else
> +    standard_iv_increment_position (loop, &incr_gsi, &insert_after);

... this assumes the main exit exits based on the not updated IV value,
correct?  Is that always true?  If so why did we need the
vect_iv_increment_position in the first place?  Also for
!LOOP_VINFO_EARLY_BREAKS_VECT_PEELED both should be the same
positions, no?

That is, I'm curious why we shouldn't simply always use
standard_iv_increment_position, like we do when !early-break?

>    if (LOOP_VINFO_USING_DECREMENTING_IV_P (loop_vinfo))
>      {
>        /* Create an IV that counts down from niters_total and whose step
> @@ -723,7 +726,10 @@ vect_set_loop_controls_directly (class loop *loop, 
> loop_vec_info loop_vinfo,
>       a demotion).  */
>    gimple_seq test_seq = NULL;
>    test_index = gimple_convert (&test_seq, compare_type, test_index);
> -  gsi_insert_seq_before (test_gsi, test_seq, GSI_SAME_STMT);
> +  if (!LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo))
> +    gsi_insert_seq_before (test_gsi, test_seq, GSI_SAME_STMT);
> +  else
> +    gsi_insert_seq_after (&incr_gsi, test_seq, GSI_NEW_STMT);
>  
>    /* Provide a definition of each control in the group.  */
>    tree next_ctrl = NULL_TREE;
> @@ -832,14 +838,20 @@ vect_set_loop_controls_directly (class loop *loop, 
> loop_vec_info loop_vinfo,
>         gimple_seq stmts = NULL;
>         next_ctrl = vect_gen_while (&stmts, ctrl_type, test_index,
>                                     this_test_limit, "next_mask");
> -       gsi_insert_seq_before (test_gsi, stmts, GSI_SAME_STMT);
> +       if (!LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo))
> +         gsi_insert_seq_before (test_gsi, stmts, GSI_SAME_STMT);
> +       else
> +         gsi_insert_seq_after (&incr_gsi, stmts, GSI_SAME_STMT);
>       }
>        else
>       {
>         next_ctrl = make_temp_ssa_name (compare_type, NULL, "next_len");
>         gimple_seq seq = vect_gen_len (next_ctrl, test_index, this_test_limit,
>                                        length_limit);
> -       gsi_insert_seq_before (test_gsi, seq, GSI_SAME_STMT);
> +       if (!LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo))
> +         gsi_insert_seq_before (test_gsi, seq, GSI_SAME_STMT);
> +       else
> +         gsi_insert_seq_after (&incr_gsi, seq, GSI_SAME_STMT);
>       }
>  
>        vect_set_loop_control (loop, ctrl, init_ctrl, next_ctrl);
> diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
> index 0a09ce8bd85..42843d17be8 100644
> --- a/gcc/tree-vect-loop.cc
> +++ b/gcc/tree-vect-loop.cc
> @@ -11202,8 +11202,7 @@ vect_update_ivs_after_vectorizer_for_early_breaks 
> (loop_vec_info loop_vinfo)
>    /* Write the adjustments at the end of the iv increment.  */
>    bool insert_after;
>    gimple_stmt_iterator incr_gsi;
> -  vect_iv_increment_position (LOOP_VINFO_MAIN_EXIT (loop_vinfo), &incr_gsi,
> -                           &insert_after);
> +  standard_iv_increment_position (loop, &incr_gsi, &insert_after);
>  
>    if (insert_after)
>      gsi_insert_seq_after (&incr_gsi, stmts, GSI_NEW_STMT);
> 

-- 
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald, Abhinav Puri; (HRB 36809, AG Nuernberg)

Reply via email to