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. */ + 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