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 += N; \
      21        out += s*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 } } } */