My earlier update_epilogue_loop_vinfo patch introduced an ICE on these
tests for AVX512.  If we use pattern stmts, STMT_VINFO_GATHER_SCATTER_P
is valid for both the original stmt and the pattern stmt, but
STMT_VINFO_MEMORY_ACCESS_TYPE is valid only for the latter.

Tested on x86_64-linux-gnu and aarch64-linux-gnu.  OK to install?

Richard


2020-01-15  Richard Sandiford  <richard.sandif...@arm.com>

gcc/
        PR tree-optimization/93247
        * tree-vect-loop.c (update_epilogue_loop_vinfo): Check the access
        type of the stmt that we're going to vectorize.

gcc/testsuite/
        PR tree-optimization/93247
        * gcc.dg/vect/pr93247-1.c: New test.
        * gcc.dg/vect/pr93247-2.c: Likewise.

diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index faf816116de..8e318a037a7 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -8452,7 +8452,8 @@ update_epilogue_loop_vinfo (class loop *epilogue, tree 
advance)
         updated offset we set using ADVANCE.  Instead we have to make sure the
         reference in the data references point to the corresponding copy of
         the original in the epilogue.  */
-      if (STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_vinfo) == VMAT_GATHER_SCATTER)
+      if (STMT_VINFO_MEMORY_ACCESS_TYPE (vect_stmt_to_vectorize (stmt_vinfo))
+         == VMAT_GATHER_SCATTER)
        {
          DR_REF (dr)
            = simplify_replace_tree (DR_REF (dr), NULL_TREE, NULL_TREE,
diff --git a/gcc/testsuite/gcc.dg/vect/pr93247-1.c 
b/gcc/testsuite/gcc.dg/vect/pr93247-1.c
new file mode 100644
index 00000000000..a3087b81d67
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr93247-1.c
@@ -0,0 +1,49 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-march=skylake" { target x86_64-*-* i?86-*-* } } */
+
+typedef struct {
+  unsigned num;
+} VEC_tree_base;
+
+enum {
+  LTO_DECL_STREAM_NAMESPACE_DECL,
+  LTO_DECL_STREAM_LABEL_DECL,
+  LTO_N_DECL_STREAMS
+};
+
+struct lto_tree_ref_encoder {
+  VEC_tree_base *trees;
+} typedef *lto_out_decl_state_ptr;
+
+typedef struct {
+  lto_out_decl_state_ptr vec[1];
+} VEC_lto_out_decl_state_ptr_base;
+
+VEC_lto_out_decl_state_ptr_base *a;
+int f;
+long g;
+int
+fn1(struct lto_tree_ref_encoder *p1) {
+  int i;
+  long b;
+  i = 0;
+  for (; i < LTO_N_DECL_STREAMS; i++) {
+    struct lto_tree_ref_encoder c = *p1;
+    int d;
+    VEC_tree_base *e = c.trees;
+    d = e ? e->num : 0;
+    b += d;
+  }
+  return b;
+}
+int
+fn2() {
+  lto_out_decl_state_ptr h;
+  struct lto_tree_ref_encoder j;
+  unsigned k;
+  for (; k < f; k++) {
+    h = a->vec[k];
+    j = *h;
+    g += fn1(&j);
+  }
+}
diff --git a/gcc/testsuite/gcc.dg/vect/pr93247-2.c 
b/gcc/testsuite/gcc.dg/vect/pr93247-2.c
new file mode 100644
index 00000000000..e229e15d87a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr93247-2.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-march=skylake-avx512" { target x86_64-*-* 
i?86-*-* } } */
+
+int
+foo (int *a, double *b, int *c)
+{
+  int f, g = 0;
+  for (f = 0; f < 100; f++)
+    if (b[f] && c[a[f]])
+      g++;
+  return g;
+}

Reply via email to