This feature probably ought to be reworked as a proper target hook, but I would like to know if this is the correct solution to the problem first.
The problem is that GCN vectors have a fixed number of elements (64) and the vector size varies with element size. E.g. V64QI is 64 bytes and V64SI is 256 bytes. This is a problem because GCC has an assumption that a) vector registers are fixed size, and b) if there are multiple vector sizes you want to pick one size and stick with it for the whole function. This is a problem in various places, but mostly it's not fatal. However, get_vectype_for_scalar_type caches the vector size for the first type it encounters and then tries to apply that to all subsequent vectors, which completely destroys vectorization. The caching feature appears to be an attempt to cope with AVX having a different vector size to other x86 vector options. This patch simply disables the cache so that it must ask the backend for the preferred mode for every type. 2018-09-05 Andrew Stubbs <a...@codesourcery.com> gcc/ * tree-vect-stmts.c (get_vectype_for_scalar_type): Implement TARGET_DISABLE_CURRENT_VECTOR_SIZE. --- gcc/tree-vect-stmts.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 607a2bd..8875201 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -9945,9 +9945,12 @@ get_vectype_for_scalar_type (tree scalar_type) tree vectype; vectype = get_vectype_for_scalar_type_and_size (scalar_type, current_vector_size); +/* FIXME: use a proper target hook or macro. */ +#ifndef TARGET_DISABLE_CURRENT_VECTOR_SIZE if (vectype && known_eq (current_vector_size, 0U)) current_vector_size = GET_MODE_SIZE (TYPE_MODE (vectype)); +#endif return vectype; }