[gcc r16-6128] vect: Disable niters-based skipping of uncounted vectorized loops
Victor Do Nascimento
victorldn@gcc.gnu.org
Mon Dec 15 15:28:46 GMT 2025
https://gcc.gnu.org/g:f45546d344596051ac8541a61902da01a090e646
commit r16-6128-gf45546d344596051ac8541a61902da01a090e646
Author: Victor Do Nascimento <victor.donascimento@arm.com>
Date: Mon Sep 29 16:11:08 2025 +0100
vect: Disable niters-based skipping of uncounted vectorized loops
The iteration count profitability check is irrelevant for uncounted
loops given that, even at runtime, the number of iterations is unknown
at the start of loop execution.
Likewise, the test for skipping the vectorized version of the loop is
based on whether the number of iterations that will be run for the
loop and whether it is smaller than the vectorization factor. As this
is undetermined, the check can never be run for uncounted loops.
Consequently, we skip these checks.
gcc/ChangeLog:
* tree-vect-loop-manip.cc (vect_do_peeling): Disable vector
loop skip checking.
(vect_loop_versioning): skip profitability check for uncounted loops.
Diff:
---
gcc/tree-vect-loop-manip.cc | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
index 653596a3e43d..0fa814f4769b 100644
--- a/gcc/tree-vect-loop-manip.cc
+++ b/gcc/tree-vect-loop-manip.cc
@@ -3328,11 +3328,13 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1,
because we have asserted that there are enough scalar iterations to enter
the main loop, so this skip is not necessary. When we are versioning then
we only add such a skip if we have chosen to vectorize the epilogue. */
- bool skip_vector = (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
- ? maybe_lt (LOOP_VINFO_INT_NITERS (loop_vinfo),
- bound_prolog + bound_epilog)
- : (!LOOP_VINFO_USE_VERSIONING_WITHOUT_PEELING (loop_vinfo)
- || vect_epilogues));
+ bool skip_vector = false;
+ if (!uncounted_p)
+ skip_vector = (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
+ ? maybe_lt (LOOP_VINFO_INT_NITERS (loop_vinfo),
+ bound_prolog + bound_epilog)
+ : (!LOOP_VINFO_USE_VERSIONING_WITHOUT_PEELING (loop_vinfo)
+ || vect_epilogues));
/* Epilog loop must be executed if the number of iterations for epilog
loop is known at compile time, otherwise we need to add a check at
@@ -4220,13 +4222,14 @@ vect_loop_versioning (loop_vec_info loop_vinfo,
tree version_simd_if_cond
= LOOP_REQUIRES_VERSIONING_FOR_SIMD_IF_COND (loop_vinfo);
unsigned th = LOOP_VINFO_COST_MODEL_THRESHOLD (loop_vinfo);
+ bool uncounted_p = LOOP_VINFO_NITERS_UNCOUNTED_P (loop_vinfo);
- if (vect_apply_runtime_profitability_check_p (loop_vinfo)
+ if (!uncounted_p && vect_apply_runtime_profitability_check_p (loop_vinfo)
&& !ordered_p (th, versioning_threshold))
cond_expr = fold_build2 (GE_EXPR, boolean_type_node, scalar_loop_iters,
build_int_cst (TREE_TYPE (scalar_loop_iters),
th - 1));
- if (maybe_ne (versioning_threshold, 0U))
+ if (!uncounted_p && maybe_ne (versioning_threshold, 0U))
{
tree expr = fold_build2 (GE_EXPR, boolean_type_node, scalar_loop_iters,
build_int_cst (TREE_TYPE (scalar_loop_iters),
More information about the Gcc-cvs
mailing list