diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr93247-1.c | 49 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr93247-2.c | 12 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 3 |
5 files changed, 75 insertions, 1 deletions
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, |