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.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
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 | 13 +++++++++++++
gcc/tree-vect-patterns.cc | 3 +--
2 files changed, 14 insertions(+), 2 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/vect/pr121744-1.c
diff --git a/gcc/testsuite/gcc.dg/vect/pr121744-1.c
b/gcc/testsuite/gcc.dg/vect/pr121744-1.c
new file mode 100644
index 00000000000..81f499662cd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr121744-1.c
@@ -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 } } } */
diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc
index 07172c55a51..9f3cc65d215 100644
--- a/gcc/tree-vect-patterns.cc
+++ b/gcc/tree-vect-patterns.cc
@@ -4073,8 +4073,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))
--
2.43.0