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.

Bootstrapped Regtested on aarch64-none-linux-gnu,
arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
-m32, -m64 and no issues.

Tested testcase on riscv64-unknown-linux-gnu. Waiting for a question on
effective targets on RVV to attach patch.

Ok for master for testcase?

Thanks,
Tamar

gcc/ChangeLog:

        PR tree-optimization/120922
        * tree-vect-loop-manip.cc (vect_gen_vector_loop_niters): Don't set range
        for partial vectors.

---
diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
index 
469694377499d7502e894b3a77e798d4de7fa685..9c58a6a01d7c9c3d97a2f8595b1ea6cff2d653f6
 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)
            {


-- 
diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
index 469694377499d7502e894b3a77e798d4de7fa685..9c58a6a01d7c9c3d97a2f8595b1ea6cff2d653f6 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