libcpp, c, middle-end: Optimize initializers using #embed in C
[official-gcc.git] / gcc / testsuite / gcc.dg / vect / vect-strided-u16-i3.c
blob5d94e8f49bc41431df9de2b809c65e48cc269fa0
1 #include <stdarg.h>
2 #include "tree-vect.h"
4 #define N 128
6 typedef struct {
7 unsigned short a;
8 unsigned short b;
9 unsigned short c;
10 } s;
12 #define A(I) (I)
13 #define B(I) ((I) * 2)
14 #define C(I) ((unsigned short) ~((I) ^ 0x18))
16 void __attribute__ ((noinline))
17 check1 (s *res)
19 int i;
21 #pragma GCC novector
22 for (i = 0; i < N; i++)
23 if (res[i].a != C (i)
24 || res[i].b != A (i)
25 || res[i].c != B (i))
26 abort ();
29 void __attribute__ ((noinline))
30 check2 (unsigned short *res)
32 int i;
34 #pragma GCC novector
35 for (i = 0; i < N; i++)
36 if (res[i] != (unsigned short) (A (i) + B (i) + C (i)))
37 abort ();
40 void __attribute__ ((noinline))
41 check3 (s *res)
43 int i;
45 #pragma GCC novector
46 for (i = 0; i < N; i++)
47 if (res[i].a != i
48 || res[i].b != i
49 || res[i].c != i)
50 abort ();
53 void __attribute__ ((noinline))
54 check4 (unsigned short *res)
56 int i;
58 #pragma GCC novector
59 for (i = 0; i < N; i++)
60 if (res[i] != (unsigned short) (A (i) + B (i)))
61 abort ();
64 void __attribute__ ((noinline))
65 main1 (s *arr)
67 int i;
68 s *ptr = arr;
69 s res1[N];
70 unsigned short res2[N];
72 for (i = 0; i < N; i++)
74 res1[i].a = arr[i].c;
75 res1[i].b = arr[i].a;
76 res1[i].c = arr[i].b;
78 check1 (res1);
80 for (i = 0; i < N; i++)
81 res2[i] = arr[i].a + arr[i].b + arr[i].c;
82 check2 (res2);
84 for (i = 0; i < N; i++)
86 res1[i].a = i;
87 res1[i].b = i;
88 res1[i].c = i;
90 check3 (res1);
92 for (i = 0; i < N; i++)
93 res2[i] = arr[i].a + arr[i].b;
94 check4 (res2);
97 int main (void)
99 int i;
100 s arr[N];
102 check_vect ();
104 for (i = 0; i < N; i++)
106 arr[i].a = A (i);
107 arr[i].b = B (i);
108 arr[i].c = C (i);
110 main1 (arr);
112 return 0;
115 /* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" { target vect_strided3 } } } */