]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/122023 - rotate pattern with reductions
authorRichard Biener <rguenther@suse.de>
Mon, 22 Sep 2025 07:41:05 +0000 (09:41 +0200)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 22 Sep 2025 09:42:28 +0000 (11:42 +0200)
The following disables the use of rotate patterns with reductions
since it breaks then single rotate SSA use-def chain constraints.

PR tree-optimization/122023
* tree-vect-patterns.cc (vect_recog_rotate_pattern): Disable
for rotates.

* gcc.dg/vect/pr122023.c: New testcase.

gcc/testsuite/gcc.dg/vect/pr122023.c [new file with mode: 0644]
gcc/tree-vect-patterns.cc

diff --git a/gcc/testsuite/gcc.dg/vect/pr122023.c b/gcc/testsuite/gcc.dg/vect/pr122023.c
new file mode 100644 (file)
index 0000000..7555907
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target int32plus } */
+
+unsigned int gvar1;
+int gvar2;
+void f ()
+{
+  unsigned int temp1;
+  while (gvar1--)
+    {
+      temp1 = gvar2;
+      gvar2 >>= 1;
+      gvar2 &= 2147483647;
+      temp1 <<= 31;
+      gvar2 |= temp1;
+    }
+}
index 70bf768d339d7bc12a5db78a5f1cc4e145d3359b..782327235db16384c2d71186911802daf7a15ebc 100644 (file)
@@ -3882,6 +3882,10 @@ vect_recog_rotate_pattern (vec_info *vinfo,
        goto use_rotate;
     }
 
+  /* We may not use a reduction operand twice.  */
+  if (vect_is_reduction (stmt_vinfo))
+    return NULL;
+
   tree utype = unsigned_type_for (type);
   tree uvectype = get_vectype_for_scalar_type (vinfo, utype);
   if (!uvectype)