1  /* { dg-do compile { target lp64 } } */
       2  /* { dg-options "-O2 -msse2" } */
       3  
       4  #include <emmintrin.h>
       5  
       6  #define SIZE (sizeof (void *))
       7  
       8  static int foo(unsigned char (*foo)[SIZE])
       9  {
      10    __m128i acc = _mm_set_epi32(0, 0, 0, 0);
      11    size_t i = 0;
      12    for(; i + sizeof(__m128i) <= SIZE; i += sizeof(__m128i)) {
      13        __m128i word;
      14        __builtin_memcpy(&word, foo + i, sizeof(__m128i));
      15        acc = _mm_add_epi32(word, acc);
      16    }
      17    if (i != SIZE) {
      18        __m128i word = _mm_set_epi32(0, 0, 0, 0);
      19        __builtin_memcpy(&word, foo + i, SIZE - i); // (1)
      20        acc = _mm_add_epi32(word, acc);
      21    }
      22    int res;
      23    __builtin_memcpy(&res, &acc, sizeof(res));
      24    return res;
      25  }
      26  
      27  int bar(void *ptr)
      28  {
      29    unsigned char buf[SIZE];
      30    __builtin_memcpy(buf, &ptr, SIZE);
      31    return foo((unsigned char(*)[SIZE])buf);
      32  }
      33  
      34  /* { dg-final { scan-assembler-times "mov" 1 } } */