https://gcc.gnu.org/g:27210c145b0b293c2958b8cd8ff3ee7f6867a8a0

commit r16-5912-g27210c145b0b293c2958b8cd8ff3ee7f6867a8a0
Author: Richard Biener <[email protected]>
Date:   Fri Dec 5 12:25:09 2025 +0100

    Fix vect_need_peeling_or_partial_vectors_p wrt peeling for gaps
    
    The code assuming that peeling for gaps can be elided by means of
    knowing niters and prologue peeling is wrong.  Peeling for gaps
    means we need an epilog.
    
            * tree-vect-loop.cc (vect_need_peeling_or_partial_vectors_p):
            When peeling for gaps we always need an epilog.

Diff:
---
 gcc/tree-vect-loop.cc | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 82121ca21ba4..53923c07e181 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -942,6 +942,9 @@ vect_need_peeling_or_partial_vectors_p (loop_vec_info 
loop_vinfo)
 {
   unsigned HOST_WIDE_INT const_vf;
 
+  if (LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo))
+    return true;
+
   loop_vec_info main_loop_vinfo
     = (LOOP_VINFO_EPILOGUE_P (loop_vinfo)
        ? LOOP_VINFO_MAIN_LOOP_INFO (loop_vinfo) : loop_vinfo);
@@ -952,14 +955,11 @@ vect_need_peeling_or_partial_vectors_p (loop_vec_info 
loop_vinfo)
         peeled for reasons other than niters.  */
       unsigned int peel_niter
        = LOOP_VINFO_PEELING_FOR_ALIGNMENT (main_loop_vinfo);
-      if (LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo))
-       peel_niter += 1;
       return !multiple_p (LOOP_VINFO_INT_NITERS (loop_vinfo) - peel_niter,
                          LOOP_VINFO_VECT_FACTOR (loop_vinfo));
     }
 
   if (!LOOP_VINFO_PEELING_FOR_ALIGNMENT (main_loop_vinfo)
-      && !LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo)
       && LOOP_VINFO_VECT_FACTOR (loop_vinfo).is_constant (&const_vf))
     {
       /* When the number of iterations is a multiple of the vectorization

Reply via email to