On Wed, Jun 26, 2019 at 10:17:26AM +0200, Uros Bizjak wrote:
> Please note that the patch regresses
> 
> FAIL: gcc.target/i386/sse2-vect-simd-11.c scan-tree-dump-times vect
> "vectorized [1-3] loops" 2
> FAIL: gcc.target/i386/sse2-vect-simd-15.c scan-tree-dump-times vect
> "vectorized [1-3] loops" 2
> 
> For some reason, the compiler decides to vectorize with 8-byte
> vectors, resulting in:
> 
> missed:   not vectorized: relevant stmt not supported: _8 = (short
> unsigned int) _4;
> missed:  bad operation or unsupported loop bound.
> missed: couldn't vectorize loop
> 
> However, the unpatched compiler is able to vectorize loop using
> 16-byte vectors. It looks that the compiler should re-run
> vectorization with wider vectors, if vectorization with narrower
> vectors fails. Jakub, Richard, do you have any insight in this issue?
> 
> 2019-06-26  Uroš Bizjak  <ubiz...@gmail.com>
> 
>         * config/i386/i386.c (ix86_autovectorize_vector_sizes):
>         Autovectorize 8-byte vectors for TARGET_MMX_WITH_SSE.

The patch isn't correct if TARGET_MMX_WITH_SSE, but not TARGET_AVX, because
in that case it will push only that 8 and nothing else, while you really
want to have 16 and 8 in that order, so that it tries to vectorize first
with 16-byte vectors and fall back to 8-byte.  The hook is supposed to
either push nothing at all, then only one vector size is tried,
one derived from preferred_simd_mode, or push all possible vectorization
sizes to be tried.

The following patch fixes the failures:

--- gcc/config/i386/i386.c.jj   2019-06-26 09:15:53.474869259 +0200
+++ gcc/config/i386/i386.c      2019-06-26 10:42:01.354106012 +0200
@@ -21401,6 +21401,11 @@ ix86_autovectorize_vector_sizes (vector_
       sizes->safe_push (16);
       sizes->safe_push (32);
     }
+  else if (TARGET_MMX_WITH_SSE)
+    sizes->safe_push (16);
+
+  if (TARGET_MMX_WITH_SSE)
+    sizes->safe_push (8);
 }
 
 /* Implemenation of targetm.vectorize.get_mask_mode.  */


        Jakub

Reply via email to