On Wed, Jan 15, 2020 at 11:15 AM Richard Sandiford <richard.sandif...@arm.com> wrote: > > 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?
OK. Richard. > 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; > +}