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) {