diff options
author | Richard Biener <rguenther@suse.de> | 2020-05-25 11:14:03 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-05-25 13:11:41 +0200 |
commit | d31694544d2d805151899ab0a0bc654767035ad6 (patch) | |
tree | bd053db552a082da13b6b1e617410b90177660a6 /gcc | |
parent | a0c623f58198d3c8f767a181574537720386b468 (diff) | |
download | gcc-d31694544d2d805151899ab0a0bc654767035ad6.zip gcc-d31694544d2d805151899ab0a0bc654767035ad6.tar.gz gcc-d31694544d2d805151899ab0a0bc654767035ad6.tar.bz2 |
tree-optimization/95297 - handle scalar shift arg for SLP invariant vectype
This skips invariant vector type setting for a scalar shift argument.
2020-05-25 Richard Biener <rguenther@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.
* g++.dg/vect/pr95290.cc: Likewise.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/vect/pr95290.cc | 25 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/vect/pr95297.cc | 22 | ||||
-rw-r--r-- | gcc/tree-vect-stmts.c | 3 |
5 files changed, 61 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8a08927..38ca3ef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2020-05-25 Richard Biener <rguenther@suse.de> + PR tree-optimization/95297 + * tree-vect-stmts.c (vectorizable_shift): For scalar_shift_arg + skip updating operand 1 vector type. + +2020-05-25 Richard Biener <rguenther@suse.de> + PR tree-optimization/95284 * tree-ssa-sink.c (sink_common_stores_to_bb): Amend previous fix. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index db94bd0..2ac873c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2020-05-25 Richard Biener <rguenther@suse.de> + PR tree-optimization/95297 + * g++.dg/vect/pr95297.cc: New testcase. + * g++.dg/vect/pr95290.cc: Likewise. + +2020-05-25 Richard Biener <rguenther@suse.de> + PR tree-optimization/95284 * g++.dg/torture/pr95284.C: New testcase. diff --git a/gcc/testsuite/g++.dg/vect/pr95290.cc b/gcc/testsuite/g++.dg/vect/pr95290.cc new file mode 100644 index 0000000..150bbf7 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr95290.cc @@ -0,0 +1,25 @@ +// { dg-do compile } + +typedef short a; +enum b {}; +typedef struct { + a c; +} d; +typedef struct { + a e, f; +} g; +typedef struct { + g h; +} i; +typedef struct { + d j; + int k; +} l; +class m +{ + i imgdata; + void n(); + l o; +}; +void m::n() try { imgdata.h.e = imgdata.h.f = o.j.c >> o.j.c; } catch (b) { +} diff --git a/gcc/testsuite/g++.dg/vect/pr95297.cc b/gcc/testsuite/g++.dg/vect/pr95297.cc new file mode 100644 index 0000000..6ffc92e --- /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 e7822c4..c325492 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -5774,7 +5774,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, |