Commit 711421af by Richard Sandiford

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.
parent 86c3a7d8
2020-01-15 Richard Sandiford <richard.sandiford@arm.com> 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 * tree-vect-slp.c (vectorize_slp_instance_root_stmt): Use a
VIEW_CONVERT_EXPR if the vectorized constructor has a diffeent VIEW_CONVERT_EXPR if the vectorized constructor has a diffeent
type from the lhs. type from the lhs.
......
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> 2020-01-15 Martin Sebor <msebor@redhat.com>
* gcc.dg/Wstringop-overflow-17.c: Tweak test to avoid unrelated * gcc.dg/Wstringop-overflow-17.c: Tweak test to avoid unrelated
......
/* { 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);
}
}
/* { 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;
}
...@@ -8452,7 +8452,8 @@ update_epilogue_loop_vinfo (class loop *epilogue, tree advance) ...@@ -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 updated offset we set using ADVANCE. Instead we have to make sure the
reference in the data references point to the corresponding copy of reference in the data references point to the corresponding copy of
the original in the epilogue. */ 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) DR_REF (dr)
= simplify_replace_tree (DR_REF (dr), NULL_TREE, NULL_TREE, = simplify_replace_tree (DR_REF (dr), NULL_TREE, NULL_TREE,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment