aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-05-25 11:14:03 +0200
committerRichard Biener <rguenther@suse.de>2020-05-25 13:11:41 +0200
commitd31694544d2d805151899ab0a0bc654767035ad6 (patch)
treebd053db552a082da13b6b1e617410b90177660a6 /gcc
parenta0c623f58198d3c8f767a181574537720386b468 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/vect/pr95290.cc25
-rw-r--r--gcc/testsuite/g++.dg/vect/pr95297.cc22
-rw-r--r--gcc/tree-vect-stmts.c3
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,