Don't group gather loads (PR83847)
authorRichard Sandiford <richard.sandiford@linaro.org>
Tue, 16 Jan 2018 09:28:26 +0000 (09:28 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 16 Jan 2018 09:28:26 +0000 (09:28 +0000)
In the testcase we were trying to group two gather loads, even though
that isn't supported.  Fixed by explicitly disallowing grouping of
gathers and scatters.

This problem didn't show up on SVE because there we convert to
IFN_GATHER_LOAD/IFN_SCATTER_STORE pattern statements, which fail
the can_group_stmts_p check.

2018-01-16  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
* tree-vect-data-refs.c (vect_analyze_data_ref_accesses):

gcc/testsuite/
* gcc.dg/torture/pr83847.c: New test.

From-SVN: r256730

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr83847.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c

index 9cf937b2714b867bf5c8ff9e00c0ff738210f993..f83d351942ad4d82efcbc3f9fc296b6843caf0b3 100644 (file)
@@ -1,3 +1,7 @@
+2018-01-16  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * tree-vect-data-refs.c (vect_analyze_data_ref_accesses):
+
 2018-01-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/86620
index b4f38370f782885a0ff89fbe3bd3b7a9eb333cfa..9bc4d7be97c9b7b01b607b800078670771a994c1 100644 (file)
@@ -1,3 +1,7 @@
+2018-01-16  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * gcc.dg/torture/pr83847.c: New test.
+
 2018-01-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/86620
diff --git a/gcc/testsuite/gcc.dg/torture/pr83847.c b/gcc/testsuite/gcc.dg/torture/pr83847.c
new file mode 100644 (file)
index 0000000..e42541e
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-march=bdver4" { target i?86-*-* x86_64-*-* } } */
+
+typedef struct {
+  struct {
+    int a;
+    int b;
+  } c;
+} * d;
+typedef struct {
+  unsigned e;
+  d f[];
+} g;
+g h;
+d *k;
+int i(int j) {
+  if (j) {
+    *k = *h.f;
+    return 1;
+  }
+  return 0;
+}
+int l;
+int m;
+int n;
+d o;
+void p() {
+  for (; i(l); l++) {
+    n += o->c.a;
+    m += o->c.b;
+  }
+}
index 684b7c587eae43ecb3fcf80d2268809e32b18d3e..01f7138e077abf1f49e3ffbb0771b7a7d6161448 100644 (file)
@@ -2923,7 +2923,8 @@ vect_analyze_data_ref_accesses (vec_info *vinfo)
       data_reference_p dra = datarefs_copy[i];
       stmt_vec_info stmtinfo_a = vinfo_for_stmt (DR_STMT (dra));
       stmt_vec_info lastinfo = NULL;
-      if (! STMT_VINFO_VECTORIZABLE (stmtinfo_a))
+      if (!STMT_VINFO_VECTORIZABLE (stmtinfo_a)
+         || STMT_VINFO_GATHER_SCATTER_P (stmtinfo_a))
        {
          ++i;
          continue;
@@ -2932,7 +2933,8 @@ vect_analyze_data_ref_accesses (vec_info *vinfo)
        {
          data_reference_p drb = datarefs_copy[i];
          stmt_vec_info stmtinfo_b = vinfo_for_stmt (DR_STMT (drb));
-         if (! STMT_VINFO_VECTORIZABLE (stmtinfo_b))
+         if (!STMT_VINFO_VECTORIZABLE (stmtinfo_b)
+             || STMT_VINFO_GATHER_SCATTER_P (stmtinfo_b))
            break;
 
          /* ???  Imperfect sorting (non-compatible types, non-modulo