https://gcc.gnu.org/g:20cd438f2f49ed4816cba9ecc558ee3377b342ba
commit r16-3491-g20cd438f2f49ed4816cba9ecc558ee3377b342ba Author: Richard Biener <rguent...@suse.de> Date: Mon Sep 1 13:29:23 2025 +0200 tree-optimization/121744 - handle CST << var in shift pattern recog 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. Diff: --- gcc/testsuite/gcc.dg/vect/pr121744-1.c | 13 +++++++++++++ gcc/tree-vect-patterns.cc | 3 +-- 2 files changed, 14 insertions(+), 2 deletions(-) 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 000000000000..81f499662cdb --- /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 65704e5f338c..16694d7991cd 100644 --- a/gcc/tree-vect-patterns.cc +++ b/gcc/tree-vect-patterns.cc @@ -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))