This skips invariant vector type setting for a scalar shift argument. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard. 2020-05-25 Richard Biener <rguent...@suse.de> PR tree-optimization/95297 * tree-vect-stmts.c (vectorizable_shift): For scalar_shift_arg skip updating operand 1 vector type. * g++.dg/vect/pr95297.cc: New testcase. --- gcc/testsuite/g++.dg/vect/pr95297.cc | 22 ++++++++++++++++++++++ gcc/tree-vect-stmts.c | 3 ++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/vect/pr95297.cc diff --git a/gcc/testsuite/g++.dg/vect/pr95297.cc b/gcc/testsuite/g++.dg/vect/pr95297.cc new file mode 100644 index 00000000000..6ffc92e5fd0 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr95297.cc @@ -0,0 +1,22 @@ +// { dg-do compile } +// { dg-additional-options "-O3 -fvect-cost-model=dynamic" } + +extern bool var_10; +extern int var_16; +extern short var_17; +extern long var_18; +extern int arr_3[][13]; + +int min(const int &a, const int &b) +{ + return a < b ? a : b; +} + +void test() { + for (short a = 0; a < 010; a++) + for (char b = 0; b < 012; b++) + arr_3[a][b] = min(-var_10, 0) + 2147483647 >> var_10; + var_16 = (bool)4; + var_17 = 0; + var_18 = -1594153176; +} diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 9023dd4c216..76c7b995817 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -5784,7 +5784,8 @@ vectorizable_shift (vec_info *vinfo, { if (slp_node && (!vect_maybe_update_slp_op_vectype (slp_op0, vectype) - || !vect_maybe_update_slp_op_vectype (slp_op1, op1_vectype))) + || (!scalar_shift_arg + && !vect_maybe_update_slp_op_vectype (slp_op1, op1_vectype)))) { if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, -- 2.25.1