On 20/07/2026 11:17, Alfie Richards wrote:
When the partial loop control check is within the loop body, use the
current control instead of the next loop control for the latch.
gcc/ChangeLog:
PR tree-optimization/126301
* tree-vect-loop-manip.cc (vect_set_loop_controls_directly):
Change to use current iteration control when
LOOP_VINFO_EARLY_BREAKS_VECT_PEELED.
(vect_set_loop_condition_partial_vectors_avx512):
Change to use current iteration control when
LOOP_VINFO_EARLY_BREAKS_VECT_PEELED.
-- >8 --
Fixes the linked PR but has the undesirable side effect of separating
the check and branch from the mask definitions via branches so they can
no longer be combined.
I am working on a pass for that separately.
Reg tested and bootstrapped on aarch64, x86_64, armhf
KR,
Alfie
---
gcc/tree-vect-loop-manip.cc | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
index ec9dec1b713..c69aea41ad3 100644
--- a/gcc/tree-vect-loop-manip.cc
+++ b/gcc/tree-vect-loop-manip.cc
@@ -511,6 +511,10 @@ vect_set_loop_controls_directly (class loop *loop,
loop_vec_info loop_vinfo,
tree iv_type = LOOP_VINFO_RGROUP_IV_TYPE (loop_vinfo);
bool use_masks_p = LOOP_VINFO_FULLY_MASKED_P (loop_vinfo);
+ /* Check if this control will be the main exit for the loop. */
+ bool main_exit_p = single_pred (LOOP_VINFO_LOOP (loop_vinfo)->latch)
+ == LOOP_VINFO_MAIN_EXIT (loop_vinfo)->src;
+
tree ctrl_type = rgc->type;
unsigned int nitems_per_iter = rgc->max_nscalars_per_iter * rgc->factor;
poly_uint64 nitems_per_ctrl = TYPE_VECTOR_SUBPARTS (ctrl_type) *
rgc->factor;
@@ -714,7 +718,8 @@ vect_set_loop_controls_directly (class loop *loop,
loop_vec_info loop_vinfo,
/* Provide a definition of each control in the group. */
tree next_ctrl = NULL_TREE;
- tree ctrl;
+ tree ctrl = NULL_TREE;
+ tree exit_ctrl = NULL_TREE;
unsigned int i;
FOR_EACH_VEC_ELT_REVERSE (rgc->controls, i, ctrl)
{
@@ -822,6 +827,10 @@ vect_set_loop_controls_directly (class loop *loop,
loop_vec_info loop_vinfo,
gsi_insert_seq_before (test_gsi, seq, GSI_SAME_STMT);
}
+ /* If this is the main exit for the loop, then this will be in the header
+ of the loop and so we should check next_ctrl. Otherwise, this is
+ in the body of the loop, and so we should use ctrl. */
+ exit_ctrl = main_exit_p ? next_ctrl : ctrl;
vect_set_loop_control (loop, ctrl, init_ctrl, next_ctrl);
}
@@ -837,7 +846,7 @@ vect_set_loop_controls_directly (class loop *loop, loop_vec_info loop_vinfo,
gimple_seq_add_stmt (header_seq, minus);
}
- return next_ctrl;
+ return exit_ctrl;
}
/* Set up the iteration condition and rgroup controls for LOOP, given
@@ -1023,6 +1032,10 @@ vect_set_loop_condition_partial_vectors_avx512 (class
loop *loop,
Ah appologies, I forgot to re "gcc format-patch", please ignore any
changes to this function.
tree orig_niters = niters;
gimple_seq preheader_seq = NULL;
+ /* Check if this control will be the main exit for the loop. */
+ bool main_exit_p = single_pred (LOOP_VINFO_LOOP (loop_vinfo)->latch)
+ == LOOP_VINFO_MAIN_EXIT (loop_vinfo)->src;
+
/* Create an IV that counts down from niters and whose step
is the number of iterations processed in the current iteration.
Produce the controls with compares like the following.
@@ -1113,6 +1126,7 @@ vect_set_loop_condition_partial_vectors_avx512 (class
loop *loop,
tree next_ctrl = NULL_TREE;
tree first_rem = NULL_TREE;
tree ctrl;
+ tree exit_ctrl = NULL_TREE;
unsigned int i;
FOR_EACH_VEC_ELT_REVERSE (rgc.controls, i, ctrl)
{
@@ -1201,6 +1215,10 @@ vect_set_loop_condition_partial_vectors_avx512 (class
loop *loop,
UNKNOWN_LOCATION,
LT_EXPR, ctrl_type, cmp_series, rem);
+ /* If this is the main exit for the loop, then this will be in the
+ header of the loop and so we should use next_ctrl. Otherwise,
+ this is in the body of the loop, and so we should use ctrl. */
+ exit_ctrl = main_exit_p ? next_ctrl : ctrl;
vect_set_loop_control (loop, ctrl, init_ctrl, next_ctrl);
}
}