1 /* Write a reduction loop to be reduced using vector shifts.  */
2 
3 #include "tree-vect.h"
4 
5 #if VECTOR_BITS > 128
6 #define N (VECTOR_BITS / 8)
7 #else
8 #define N 16
9 #endif
10 
11 extern void abort(void);
12 
13 unsigned char in[N] __attribute__((__aligned__(16)));
14 
15 int
main(unsigned char argc,char ** argv)16 main (unsigned char argc, char **argv)
17 {
18   unsigned char i = 0;
19   unsigned char sum = 1;
20   unsigned char expected = 1;
21 
22   check_vect ();
23 
24   for (i = 0; i < N; i++)
25     {
26       in[i] = (i + i + 1) & 0xfd;
27       asm volatile ("" ::: "memory");
28     }
29 
30   for (i = 0; i < N; i++)
31     {
32       expected |= in[i];
33       asm volatile ("" ::: "memory");
34     }
35 
36   for (i = 0; i < N; i++)
37     sum |= in[i];
38 
39   if (sum != expected)
40     {
41       __builtin_printf("Failed %d\n", sum);
42       abort();
43     }
44 
45   return 0;
46 }
47 
48 /* { dg-final { scan-tree-dump "Reduce using vector shifts" "vect" { target { whole_vector_shift && { ! vect_logical_reduc } } } } } */
49 /* { dg-final { scan-tree-dump "Reduce using direct vector reduction" "vect" { target vect_logical_reduc } } } */
50