The a % b -> a - a / b pattern breaks reduction constraints, disable it for reduction stmts.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. PR tree-optimization/121767 * tree-vect-patterns.cc (vect_recog_mod_var_pattern): Disable for reductions. * gcc.dg/vect/pr121767.c: New testcase. --- gcc/testsuite/gcc.dg/vect/pr121767.c | 9 +++++++++ gcc/tree-vect-patterns.cc | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/vect/pr121767.c diff --git a/gcc/testsuite/gcc.dg/vect/pr121767.c b/gcc/testsuite/gcc.dg/vect/pr121767.c new file mode 100644 index 00000000000..3b52692a4b4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr121767.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-mcpu=neoverse-v2" { target aarch64-*-* } } */ + +int foo (int x, int y, int n) +{ + for (int i = 0; i < n; ++i) + x = x % y; + return x; +} diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc index 41ca0f085f0..f5c97242acb 100644 --- a/gcc/tree-vect-patterns.cc +++ b/gcc/tree-vect-patterns.cc @@ -5363,7 +5363,7 @@ vect_recog_mod_var_pattern (vec_info *vinfo, gimple *pattern_stmt, *def_stmt; enum tree_code rhs_code; - if (!is_gimple_assign (last_stmt)) + if (!is_gimple_assign (last_stmt) || vect_is_reduction (stmt_vinfo)) return NULL; rhs_code = gimple_assign_rhs_code (last_stmt); -- 2.43.0