1  /* { dg-require-effective-target vect_int } */
       2  /* { dg-additional-options "-O3 -fno-version-loops-for-strides" } */
       3  
       4  #include <string.h>
       5  #include "tree-vect.h"
       6  
       7  /* AVX512BW has V64QImode, make char_1 vectorizable with that.  */
       8  #define MAX_VEC_ELEMENTS 64
       9  
      10  #define FOO(T,N) \
      11  void __attribute__((noinline,noclone)) \
      12  foo_ ## T ## _ ## N (T * __restrict__ in_, T * __restrict__ out_, int s) \
      13  { \
      14    T *in = __builtin_assume_aligned (in_, __BIGGEST_ALIGNMENT__); \
      15    T *out = __builtin_assume_aligned (out_, __BIGGEST_ALIGNMENT__); \
      16    for (int i = 0; i < MAX_VEC_ELEMENTS; i++) \
      17      { \
      18        for (int j = 0; j < N; ++j) \
      19          out[j] = in[j]; \
      20        in += s*N; \
      21        out += N; \
      22      } \
      23  }
      24  
      25  #define TEST(T,N) \
      26   do { \
      27    memset (out, 0, 4096); \
      28    foo_ ## T ## _ ## N ((T *)in, (T *)out, 1); \
      29    if (memcmp (in, out, sizeof (T) * MAX_VEC_ELEMENTS * N) != 0) \
      30      __builtin_abort (); \
      31    for (int i = sizeof (T) * MAX_VEC_ELEMENTS * N; i < 4096; ++i) \
      32      if (out[i] != 0) \
      33        __builtin_abort (); \
      34   } while (0)
      35  
      36  FOO(char, 1)
      37  FOO(char, 2)
      38  FOO(char, 3)
      39  FOO(char, 4)
      40  FOO(char, 6)
      41  FOO(char, 8)
      42  FOO(int, 1)
      43  FOO(int, 2)
      44  FOO(int, 3)
      45  FOO(int, 4)
      46  FOO(int, 6)
      47  FOO(int, 8)
      48  FOO(int, 16)
      49  
      50  char in[4096] __attribute__((aligned(__BIGGEST_ALIGNMENT__)));
      51  char out[4096] __attribute__((aligned(__BIGGEST_ALIGNMENT__)));
      52  
      53  int main()
      54  {
      55    check_vect ();
      56  
      57    for (int i = 0; i < 4096; ++i)
      58      {
      59        in[i] = i;
      60        __asm__ volatile ("" : : : "memory");
      61      }
      62  
      63    TEST(char, 1);
      64    TEST(char, 2);
      65    TEST(char, 3);
      66    TEST(char, 4);
      67    TEST(char, 6);
      68    TEST(char, 8);
      69    TEST(int, 1);
      70    TEST(int, 2);
      71    TEST(int, 3);
      72    TEST(int, 4);
      73    TEST(int, 6);
      74    TEST(int, 8);
      75    TEST(int, 16);
      76  
      77    return 0;
      78  }
      79  
      80  /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 13 "vect" { target vect_hw_misalign } } } */
      81  /* For ! vect_hw_misalign it depends on vector size and actual alignment
      82     requirements of the target which functions can be vectorized.  Avoid
      83     that bean-counting and per-target listing here.  */