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;
> +}

Reply via email to