Imported Upstream version 4.7.3
[platform/upstream/gcc48.git] / gcc / testsuite / gcc.dg / vect / vect-strided-u16-i3.c
1 #include <stdarg.h>
2 #include "tree-vect.h"
3
4 #define N 128
5
6 typedef struct {
7    unsigned short a;
8    unsigned short b;
9    unsigned short c;
10 } s;
11
12 #define A(I) (I)
13 #define B(I) ((I) * 2)
14 #define C(I) ((unsigned short) ~((I) ^ 0x18))
15
16 void __attribute__ ((noinline))
17 check1 (s *res)
18 {
19   int i;
20
21   for (i = 0; i < N; i++)
22     if (res[i].a != C (i)
23         || res[i].b != A (i)
24         || res[i].c != B (i))
25       abort ();
26 }
27
28 void __attribute__ ((noinline))
29 check2 (unsigned short *res)
30 {
31   int i;
32
33   for (i = 0; i < N; i++)
34     if (res[i] != (unsigned short) (A (i) + B (i) + C (i)))
35       abort ();
36 }
37
38 void __attribute__ ((noinline))
39 check3 (s *res)
40 {
41   int i;
42
43   for (i = 0; i < N; i++)
44     if (res[i].a != i
45         || res[i].b != i
46         || res[i].c != i)
47       abort ();
48 }
49
50 void __attribute__ ((noinline))
51 check4 (unsigned short *res)
52 {
53   int i;
54
55   for (i = 0; i < N; i++)
56     if (res[i] != (unsigned short) (A (i) + B (i)))
57       abort ();
58 }
59
60 void __attribute__ ((noinline))
61 main1 (s *arr)
62 {
63   int i;
64   s *ptr = arr;
65   s res1[N];
66   unsigned short res2[N];
67
68   for (i = 0; i < N; i++)
69     {
70       res1[i].a = arr[i].c;
71       res1[i].b = arr[i].a;
72       res1[i].c = arr[i].b;
73     }
74   check1 (res1);
75
76   for (i = 0; i < N; i++)
77     res2[i] = arr[i].a + arr[i].b + arr[i].c;
78   check2 (res2);
79
80   for (i = 0; i < N; i++)
81     {
82       res1[i].a = i;
83       res1[i].b = i;
84       res1[i].c = i;
85     }
86   check3 (res1);
87
88   for (i = 0; i < N; i++)
89     res2[i] = arr[i].a + arr[i].b;
90   check4 (res2);
91 }
92
93 int main (void)
94 {
95   int i;
96   s arr[N];
97
98   check_vect ();
99
100   for (i = 0; i < N; i++)
101     {
102       arr[i].a = A (i);
103       arr[i].b = B (i);
104       arr[i].c = C (i);
105     }
106   main1 (arr);
107
108   return 0;
109 }
110
111 /* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect"  { target vect_strided3 } } } */
112 /* { dg-final { cleanup-tree-dump "vect" } } */