[gcc/devel/c++-modules] PR tree-optimization/93247 - ICE in get_load_store_type

Nathan Sidwell nathan@gcc.gnu.org
Fri Jan 17 19:17:00 GMT 2020


https://gcc.gnu.org/g:711421af001b8f4f044f485c78f1d07ed5201656

commit 711421af001b8f4f044f485c78f1d07ed5201656
Author: Richard Sandiford <richard.sandiford@arm.com>
Date:   Tue Jan 14 22:24:37 2020 +0000

    PR tree-optimization/93247 - ICE in get_load_store_type
    
    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.

Diff:
---
 gcc/ChangeLog                         |  6 +++++
 gcc/testsuite/ChangeLog               |  6 +++++
 gcc/testsuite/gcc.dg/vect/pr93247-1.c | 49 +++++++++++++++++++++++++++++++++++
 gcc/testsuite/gcc.dg/vect/pr93247-2.c | 12 +++++++++
 gcc/tree-vect-loop.c                  |  3 ++-
 5 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index aa161fd..3099ec4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
 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
 	VIEW_CONVERT_EXPR if the vectorized constructor has a diffeent
 	type from the lhs.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dc1952b..0f0f177 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..a3087b8
--- /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 0000000..e229e15
--- /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;
+}
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index faf8161..8e318a0 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,



More information about the Gcc-cvs mailing list