Imported Upstream version 4.7.3
[platform/upstream/gcc48.git] / gcc / testsuite / gcc.dg / vect / vect-reduc-1char-big-array.c
1 /* { dg-require-effective-target vect_int } */
2
3 #include <stdarg.h>
4 #include "tree-vect.h"
5
6 #define N 256
7
8 unsigned char ub[N];
9 unsigned char uc[N];
10 unsigned char diff;
11
12 volatile int y = 0;
13
14 __attribute__ ((noinline)) void
15 main1 (unsigned char x, unsigned char max_result, unsigned char min_result)
16 {
17   int i;
18   unsigned char udiff = 2;
19   unsigned char umax = x;
20   unsigned char umin = x;
21
22   diff = 2;
23   for (i = 0; i < N; i++) {
24     ub[i] = i;
25     uc[i] = i;
26     if (i%16 == 0)
27       {
28         ub[i] = i+2;
29         diff += 2;
30       }
31     if (uc[i] > max_result)
32       max_result = uc[i];
33     if (uc[i] < min_result)
34       min_result = uc[i];
35
36     /* Avoid vectorization.  */
37     if (y)
38       abort ();
39   }
40   for (i = 0; i < N; i++) {
41     udiff += (unsigned char) (ub[i] - uc[i]);
42   }
43
44   for (i = 0; i < N; i++) {
45     umax = umax < uc[i] ? uc[i] : umax;
46   }
47
48   for (i = 0; i < N; i++) {
49     umin = umin > uc[i] ? uc[i] : umin;
50   }
51
52   /* check results:  */
53   if (udiff != diff)
54     abort ();
55   if (umax != max_result)
56     abort ();
57   if (umin != min_result)
58     abort ();
59 }
60
61 int main (void)
62 {
63   check_vect ();
64
65   main1 (100, 100, 1);
66   main1 (0, 15, 0);
67   return 0;
68 }
69
70 /* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail vect_no_int_max } } } */
71 /* { dg-final { cleanup-tree-dump "vect" } } */