tree-optimization/95297 - handle scalar shift arg for SLP invariant vectype
authorRichard Biener <rguenther@suse.de>
Mon, 25 May 2020 09:14:03 +0000 (11:14 +0200)
committerRichard Biener <rguenther@suse.de>
Mon, 25 May 2020 11:11:41 +0000 (13:11 +0200)
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.

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/vect/pr95290.cc [new file with mode: 0644]
gcc/testsuite/g++.dg/vect/pr95297.cc [new file with mode: 0644]
gcc/tree-vect-stmts.c

index 8a089279e1b293247e872841d11bc2c8b05a5a16..38ca3ef863b644e12f467724cd2e8136638400a3 100644 (file)
@@ -1,3 +1,9 @@
+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
index db94bd05bc3248c1c2597f41049ffcbbbc8d1daa..2ac873c429111e998328e536c3d4c8a3baff4e91 100644 (file)
@@ -1,3 +1,9 @@
+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
diff --git a/gcc/testsuite/g++.dg/vect/pr95290.cc b/gcc/testsuite/g++.dg/vect/pr95290.cc
new file mode 100644 (file)
index 0000000..150bbf7
--- /dev/null
@@ -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 (file)
index 0000000..6ffc92e
--- /dev/null
@@ -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;
+}
index e7822c4495151921775e8c4d21197a5fe89bf18f..c3254926e228c39327a0f3d7ac662216df70532b 100644 (file)
@@ -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,