On Wed, Mar 6, 2024 at 9:21 PM Robin Dapp <rdapp....@gmail.com> wrote: > > Hi, > > r14-7036-gcbf569486b2dec added an epilogue vectorization guard for early > break but PR114196 shows that we also run into the problem without early > break. Therefore remove early break from the conditions. > > gcc/ChangeLog: > > PR middle-end/114196 > > * tree-vect-loop-manip.cc (vect_can_peel_nonlinear_iv_p): Remove > early break check from guards. > > gcc/testsuite/ChangeLog: > > * gcc.target/aarch64/pr114196.c: New test. > * gcc.target/riscv/rvv/autovec/pr114196.c: New test. > --- > gcc/testsuite/gcc.target/aarch64/pr114196.c | 19 +++++++++++++++++++ > .../gcc.target/riscv/rvv/autovec/pr114196.c | 19 +++++++++++++++++++ > gcc/tree-vect-loop-manip.cc | 6 +++--- > 3 files changed, 41 insertions(+), 3 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/aarch64/pr114196.c > create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr114196.c > > diff --git a/gcc/testsuite/gcc.target/aarch64/pr114196.c > b/gcc/testsuite/gcc.target/aarch64/pr114196.c > new file mode 100644 > index 00000000000..15e4b0e31b8 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/pr114196.c > @@ -0,0 +1,19 @@ > +/* { dg-do compile } */ > +/* { dg-options { -O3 -fno-vect-cost-model -march=armv9-a > -msve-vector-bits=256 } } */ > + > +unsigned a; > +int b; > +long *c; > + > +int > +main () > +{ > + for (int d = 0; d < 22; d += 4) { > + b = ({ > + int e = c[d]; > + e; > + }) > + ? 0 : -c[d]; > + a *= 3; > + } > +} > diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr114196.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr114196.c > new file mode 100644 > index 00000000000..7ba9cbbed70 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr114196.c > @@ -0,0 +1,19 @@ > +/* { dg-do compile } */ > +/* { dg-options { -O3 -fno-vect-cost-model -march=rv64gcv_zvl256b > -mabi=lp64d -mrvv-vector-bits=zvl } } */ > + > +unsigned a; > +int b; > +long *c; > + > +int > +main () > +{ > + for (int d = 0; d < 22; d += 4) { > + b = ({ > + int e = c[d]; > + e; > + }) > + ? 0 : -c[d]; > + a *= 3; > + } > +} > diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc > index f72da915103..c3cd20eef70 100644 > --- a/gcc/tree-vect-loop-manip.cc > +++ b/gcc/tree-vect-loop-manip.cc > @@ -2183,9 +2183,9 @@ vect_can_peel_nonlinear_iv_p (loop_vec_info loop_vinfo, > perform the peeling. The below condition mirrors that of > vect_gen_vector_loop_niters where niters_vector_mult_vf_var then sets > step_vector to VF rather than 1. This is what creates the nonlinear > - IV. PR113163. */ > - if (LOOP_VINFO_EARLY_BREAKS (loop_vinfo) > - && LOOP_VINFO_VECT_FACTOR (loop_vinfo).is_constant () > + IV. PR113163. > + This also happens without early breaks, see PR114196. */
Can you instead reword to not mention early breaks, maybe instead say PR113163 (with early breaks), PR114196 (without)? The dump message also needs adjustments, it mentions early breaks as well. The comment says it matches a condition in vect_gen_vector_loop_niters but I can't see what that means ... Tamar? > + if (LOOP_VINFO_VECT_FACTOR (loop_vinfo).is_constant () > && LOOP_VINFO_USING_PARTIAL_VECTORS_P (loop_vinfo) > && induction_type != vect_step_op_neg) > { > -- > 2.43.2