https://gcc.gnu.org/g:6c8d221b74869f2760ded2d67f95dd9d275bc1a2

commit r16-2119-g6c8d221b74869f2760ded2d67f95dd9d275bc1a2
Author: Tamar Christina <tamar.christ...@arm.com>
Date:   Wed Jul 9 08:39:35 2025 +0100

    middle-end: don't set range on partial vectors [PR120922]
    
    Before the change in g:309dbcea2cabb31bde1a65cdfd30bb7f87b170a2 we would 
never
    set a range for constant VF and requires partial vector loops.
    
    I think a range could be set, since I think the number of latch executions 
is a
    ceiling division of TYPE_MAX_VALUE / vf. To account for the partial 
iteration.
    
    This would also then deal with the ICE cause in the PR where the chosen VF 
was
    much higher than TYPE_MAX_VALUE and that a mask is relied upon to make it 
safe.
    
    Since the patch was supposed to not change behavior I've added an additional
    partial vector check on the const_vf > 0 check to make it explicit that we 
only
    set it on non-partial vectors (alternative would have been to swap the 
order of
    the vf.constant(&const_vf)) check, but that would have hidden the 
requirement
    sneakily.
    
    The second patch adds support for ranges for partial masks.
    
    gcc/ChangeLog:
    
            PR tree-optimization/120922
            * tree-vect-loop-manip.cc (vect_gen_vector_loop_niters): Don't set 
range
            for partial vectors.
    
    gcc/testsuite/ChangeLog:
    
            PR tree-optimization/120922
            * gcc.dg/vect/pr120922.c: New test.

Diff:
---
 gcc/testsuite/gcc.dg/vect/pr120922.c | 18 ++++++++++++++++++
 gcc/tree-vect-loop-manip.cc          |  4 +++-
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/gcc.dg/vect/pr120922.c 
b/gcc/testsuite/gcc.dg/vect/pr120922.c
new file mode 100644
index 000000000000..1a7247a4b2f5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr120922.c
@@ -0,0 +1,18 @@
+/* { dg-require-effective-target vect_int } */
+/* { dg-additional-options "-fsigned-char -fno-strict-aliasing -fwrapv" } */
+/* { dg-additional-options "-march=rv64gcv_zvl1024b -mrvv-vector-bits=zvl 
-mrvv-max-lmul=m8 -O3" { target { riscv_v } } } */
+
+char g;
+unsigned char h;
+int i[9][6];
+int main() {
+  int k[5];
+  if (g)
+    goto l;
+  for (; h <= 5; h++)
+    i[0][h] = *k;
+l:
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump "loop vectorized" "vect" { target riscv_v } } } 
*/
diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
index 469694377499..9c58a6a01d7c 100644
--- a/gcc/tree-vect-loop-manip.cc
+++ b/gcc/tree-vect-loop-manip.cc
@@ -2857,7 +2857,9 @@ vect_gen_vector_loop_niters (loop_vec_info loop_vinfo, 
tree niters,
         we set range information to make niters analyzer's life easier.
         Note the number of latch iteration value can be TYPE_MAX_VALUE so
         we have to represent the vector niter TYPE_MAX_VALUE + 1 / vf.  */
-      if (stmts != NULL && const_vf > 0)
+      if (stmts != NULL
+         && const_vf > 0
+         && !LOOP_VINFO_USING_PARTIAL_VECTORS_P (loop_vinfo))
        {
          if (niters_no_overflow)
            {

Reply via email to