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_loop_versioning): skip
profitability check for uncounted loops.
* tree-vect-loop-manip.cc (vect_do_peeling): Disable vector
loop skip checking.
---
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 18a5059251b..640735388fe 100644
--- a/gcc/tree-vect-loop-manip.cc
+++ b/gcc/tree-vect-loop-manip.cc
@@ -3293,11 +3293,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
@@ -4157,13 +4159,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)
- && !ordered_p (th, versioning_threshold))
+ && !ordered_p (th, versioning_threshold) && !uncounted_p)
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),
--
2.43.0