On 06/10/2026 21:55, Tamar Christina wrote:
Hi Alfie,

Hi Tamar,

Thank you for the review!

-----Original Message-----
From: Alfie Richards <[email protected]>
Sent: 17 September 2026 15:40
To: [email protected]
Cc: Alex Coplan <[email protected]>; Alice Carlotti
<[email protected]>; Andrea Pinski
<[email protected]>; Richard Biener <[email protected]>;
Tamar Christina <[email protected]>; Zdenek Dvorak <[email protected]>;
Robin Dapp <[email protected]>; Richard Sandiford
<[email protected]>; Kyrylo Tkachov <[email protected]>;
Alfie Richards <[email protected]>
Subject: [PATCH v3 01/16] fix: vect: Consider IV increment being invariant for
loop bounds

Loops with loop invariant increments cannot have known iteration bounds
as the number of elements processed each iteration is unknown.

gcc/ChangeLog:

        * tree-vect-loop.cc (vect_transform_loop): Add checks for
        iv loop increment being invariant.
---
  gcc/tree-vect-loop.cc | 8 ++++++--
  1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 4a049238142..c7407098dc1 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -11508,7 +11508,8 @@ vect_transform_loop (loop_vec_info loop_vinfo,
gimple *loop_vectorized_call)
          /* Both peeling for alignment and peeling for gaps can end up
             with the scalar epilogue running for more than VF-1 iterations.  */
          && !main_vinfo->peeling_for_alignment
-         && !main_vinfo->peeling_for_gaps)
+         && !main_vinfo->peeling_for_gaps
+         && LOOP_VINFO_IV_INCREMENT_INVARIANT_P (loop_vinfo))
        {

This I agree with...

          unsigned int bound;
          poly_uint64 main_iters
@@ -11524,7 +11525,10 @@ vect_transform_loop (loop_vec_info
loop_vinfo, gimple *loop_vectorized_call)
              = wi::umin ((bound_wide_int) (bound - 1),
                          loop->nb_iterations_upper_bound);
        }
-  }
+
+      if (loop_vinfo && !LOOP_VINFO_IV_INCREMENT_INVARIANT_P
(loop_vinfo))
+       loop->any_upper_bound = false;

... but is this not too conservative? My reading to RISC-V[1] and s390's use
of SELECT_VL guarantees forward progress.  So the upper bound for an
SELECT_VL loop without first faults is just the original scalar loop upper 
bound when not
Peeling for alignment using masking, and when LOOP_VINFO_MASK_SKIP_NITERS it's
loop->nb_iterations_upper_bound + VF isn't it?

Also in vect_set_loop_condition_partial_vectors don't we have to set
loop->nb_iterations to NULL_TREE? since we definitely don't know the exact 
latch iteration
count.

Or did I misunderstand something?

Ah no you are completely right, that was a bit over zealous of me,

Will fix.

Thanks,
Alfie>
Thanks,
Tamar

[1] 
https://docs.riscv.org/reference/isa/v20260120/unpriv/v-st-ext.html#constraints-on-setting-vl

+    }
    if (loop->any_likely_upper_bound)
      loop->nb_iterations_likely_upper_bound
        = (final_iter_may_be_partial
--
2.43.0


Reply via email to