aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2025-12-05 12:25:09 +0100
committerRichard Biener <rguenther@suse.de>2025-12-05 13:29:41 +0100
commit27210c145b0b293c2958b8cd8ff3ee7f6867a8a0 (patch)
treecc58552dd7e38885dfe77bcaf496a6fe574a7142 /gcc
parent7dd39924c9a696a627522e897ed8c7bd454872bd (diff)
downloadgcc-27210c145b0b293c2958b8cd8ff3ee7f6867a8a0.zip
gcc-27210c145b0b293c2958b8cd8ff3ee7f6867a8a0.tar.gz
gcc-27210c145b0b293c2958b8cd8ff3ee7f6867a8a0.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/tree-vect-loop.cc6
1 files changed, 3 insertions, 3 deletions
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 82121ca..53923c0 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