1 /* { dg-do run } */
2 /* { dg-require-effective-target p8vector_hw } */
3 /* { dg-options "-O2 -ftree-vectorize -mdejagnu-cpu=power8 -fno-vect-cost-model -fdump-tree-vect-details" } */
4 
5 /* To test condition reduction vectorization, where comparison operands are of
6    signed int type and condition true/false values are integer type.  */
7 
8 #include <math.h>
9 
10 extern void
11 abort (void) __attribute__ ((noreturn));
12 
13 #define N 27
14 #define INT_TYPE signed int
15 
16 __attribute__ ((noinline)) int
test_eq(INT_TYPE * a,INT_TYPE min_v)17 test_eq (INT_TYPE *a, INT_TYPE min_v)
18 {
19   int last = 0;
20 
21   for (int i = 0; i < N; i++)
22     if (a[i] == min_v)
23       last = i;
24 
25   return last;
26 }
27 
28 __attribute__ ((noinline)) int
test_ne(INT_TYPE * a,INT_TYPE min_v)29 test_ne (INT_TYPE *a, INT_TYPE min_v)
30 {
31   int last = 0;
32 
33   for (int i = 0; i < N; i++)
34     if (a[i] != min_v)
35       last = i;
36 
37   return last;
38 }
39 
40 __attribute__ ((noinline)) int
test_gt(INT_TYPE * a,INT_TYPE min_v)41 test_gt (INT_TYPE *a, INT_TYPE min_v)
42 {
43   int last = 0;
44 
45   for (int i = 0; i < N; i++)
46     if (a[i] > min_v)
47       last = i;
48 
49   return last;
50 }
51 
52 __attribute__ ((noinline)) int
test_ge(INT_TYPE * a,INT_TYPE min_v)53 test_ge (INT_TYPE *a, INT_TYPE min_v)
54 {
55   int last = 0;
56 
57   for (int i = 0; i < N; i++)
58     if (a[i] >= min_v)
59       last = i;
60 
61   return last;
62 }
63 
64 __attribute__ ((noinline)) int
test_lt(INT_TYPE * a,INT_TYPE min_v)65 test_lt (INT_TYPE *a, INT_TYPE min_v)
66 {
67   int last = 0;
68 
69   for (int i = 0; i < N; i++)
70     if (a[i] < min_v)
71       last = i;
72 
73   return last;
74 }
75 
76 __attribute__ ((noinline)) int
test_le(INT_TYPE * a,INT_TYPE min_v)77 test_le (INT_TYPE *a, INT_TYPE min_v)
78 {
79   int last = 0;
80 
81   for (int i = 0; i < N; i++)
82     if (a[i] <= min_v)
83       last = i;
84 
85   return last;
86 }
87 
88 int
main(void)89 main (void)
90 {
91   int ret = 0;
92 
93   INT_TYPE a1[N] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1,  2,  3, 4,
94 		   5,  6,  7,  8,  9,  10, 21, 22, 23, 24, 25, 26, 27};
95 
96   INT_TYPE a2[N] = {21, 22, 23, 24, 25, 26, 27, 28, 29, 10, 11, 12, 13, 14,
97 		   15, 16, 17, 18, 19, 20, 1,  2,  3,  4,  5,  6,  7};
98 
99   ret = test_eq (a1, 10);
100   if (ret != 19)
101     abort ();
102 
103   ret = test_ne (a1, 10);
104   if (ret != 26)
105     abort ();
106 
107   ret = test_gt (a2, 10);
108   if (ret != 19)
109     abort ();
110 
111   ret = test_ge (a2, 10);
112   if (ret != 19)
113     abort ();
114 
115   ret = test_lt (a1, 10);
116   if (ret != 18)
117     abort ();
118 
119   ret = test_le (a1, 10);
120   if (ret != 19)
121     abort ();
122 
123   return 0;
124 }
125 
126 /* { dg-final { scan-tree-dump-times "LOOP VECTORIZED" 6 "vect" } } */
127