PR tree-optimization/93247 - ICE in get_load_store_type
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 14 Jan 2020 22:24:37 +0000 (22:24 +0000)
committerRichard Sandiford <richard.sandiford@arm.com>
Wed, 15 Jan 2020 13:35:52 +0000 (13:35 +0000)
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.

2020-01-15  Richard Sandiford  <richard.sandiford@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.

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr93247-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/pr93247-2.c [new file with mode: 0644]
gcc/tree-vect-loop.c

index aa161fdd9bc34b86a8e93cca59d676d2e9934e56..3099ec4143cd451841b4403e76c352637048aa02 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-15  Richard Sandiford  <richard.sandiford@arm.com>
+
+       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.
+
 2020-01-15  Richard Sandiford  <richard.sandiford@arm.com>
 
        * tree-vect-slp.c (vectorize_slp_instance_root_stmt): Use a
index dc1952b2d18d3dbd55ee3c761ef7844b82390d71..0f0f177871989a968342316f50212824335c79d5 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-15  Richard Sandiford  <richard.sandiford@arm.com>
+
+       PR tree-optimization/93247
+       * gcc.dg/vect/pr93247-1.c: New test.
+       * gcc.dg/vect/pr93247-2.c: Likewise.
+
 2020-01-15  Martin Sebor  <msebor@redhat.com>
 
        * gcc.dg/Wstringop-overflow-17.c: Tweak test to avoid unrelated
diff --git a/gcc/testsuite/gcc.dg/vect/pr93247-1.c b/gcc/testsuite/gcc.dg/vect/pr93247-1.c
new file mode 100644 (file)
index 0000000..a3087b8
--- /dev/null
@@ -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 (file)
index 0000000..e229e15
--- /dev/null
@@ -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;
+}
index faf816116de2ca7ca76e9f05370542a7e329c30c..8e318a037a7cd4a3253cab6fd5e7e4051c2afe01 100644 (file)
@@ -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,