]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/121744 - handle CST << var in shift pattern recog
authorRichard Biener <rguenther@suse.de>
Mon, 1 Sep 2025 11:29:23 +0000 (13:29 +0200)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 1 Sep 2025 13:18:17 +0000 (15:18 +0200)
We currently do not handle promotion/demotion of 'var' when the
left operand of a variable shift is constant.  There's no good
reason why, so the following fixes this omission.

PR tree-optimization/121744
* tree-vect-patterns.cc (vect_recog_vector_vector_shift_pattern):
Allow constant left operand.

* gcc.dg/vect/pr121744-1.c: New testcase.

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

diff --git a/gcc/testsuite/gcc.dg/vect/pr121744-1.c b/gcc/testsuite/gcc.dg/vect/pr121744-1.c
new file mode 100644 (file)
index 0000000..81f4996
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-mavx2" { target avx2 } } */
+
+unsigned long a[1024];
+unsigned int b[1024];
+
+void foo()
+{
+  for (int i = 0; i < 1024; ++i)
+    a[i] = 1ul << b[i];
+}
+
+/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { target vect_var_shift } } } */
index 65704e5f338c8fd072d724661db51b267b546cbb..16694d7991cdf3cf99fd523f341bcaf8ca1f041e 100644 (file)
@@ -4077,8 +4077,7 @@ vect_recog_vector_vector_shift_pattern (vec_info *vinfo,
   lhs = gimple_assign_lhs (last_stmt);
   oprnd0 = gimple_assign_rhs1 (last_stmt);
   oprnd1 = gimple_assign_rhs2 (last_stmt);
-  if (TREE_CODE (oprnd0) != SSA_NAME
-      || TREE_CODE (oprnd1) != SSA_NAME
+  if (TREE_CODE (oprnd1) != SSA_NAME
       || TYPE_MODE (TREE_TYPE (oprnd0)) == TYPE_MODE (TREE_TYPE (oprnd1))
       || !INTEGRAL_TYPE_P (TREE_TYPE (oprnd0))
       || !type_has_mode_precision_p (TREE_TYPE (oprnd1))