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

Reply via email to