Small ChangeLog tweak.
[official-gcc.git] / gcc / testsuite / gcc.dg / vect / slp-21.c
blob5aef87f09cd7c41db87a72e264edd2d2ef9d1b97
1 /* { dg-require-effective-target vect_int } */
3 #include <stdarg.h>
4 #include "tree-vect.h"
6 #define N 128
8 int
9 main1 ()
11 unsigned short i;
12 unsigned short out[N*8], out2[N*8], b0, b1, b2, b3, b4, a0, a1, a2, a3, b5;
13 unsigned short in[N*8];
15 for (i = 0; i < N*8; i++)
17 in[i] = i;
20 /* Different operations in both cases - vectorization with interleaving. */
21 for (i = 0; i < N; i++)
23 a0 = in[i*4];
24 a1 = in[i*4 + 1];
25 a2 = in[i*4 + 2];
26 a3 = in[i*4 + 3];
28 b0 = a0 * 8;
29 b1 = a1 + 7;
30 b2 = a2 + 6;
31 b3 = a3 * 5;
33 b4 = a2 + 4;
34 b5 = a3 + 3;
36 out[i*4] = b0;
37 out[i*4 + 1] = b1;
38 out[i*4 + 2] = b2;
39 out[i*4 + 3] = b3;
41 out2[i*4] = b0;
42 out2[i*4 + 1] = b1;
43 out2[i*4 + 2] = b4;
44 out2[i*4 + 3] = b5;
47 /* check results: */
48 for (i = 0; i < N; i++)
50 a0 = in[i*4];
51 a1 = in[i*4 + 1];
52 a2 = in[i*4 + 2];
53 a3 = in[i*4 + 3];
55 b0 = a0 * 8;
56 b1 = a1 + 7;
57 b2 = a2 + 6;
58 b3 = a3 * 5;
60 b4 = a2 + 4;
61 b5 = a3 + 3;
63 if (out[i*4] != b0
64 || out[i*4 + 1] != b1
65 || out[i*4 + 2] != b2
66 || out[i*4 + 3] != b3)
67 abort ();
69 if (out2[i*4] != b0
70 || out2[i*4 + 1] != b1
71 || out2[i*4 + 2] != b4
72 || out2[i*4 + 3] != b5)
73 abort ();
76 /* Different operations in the first case - vectorization with interleaving. */
77 for (i = 0; i < N; i++)
79 a0 = in[i*4];
80 a1 = in[i*4 + 1];
81 a2 = in[i*4 + 2];
82 a3 = in[i*4 + 3];
84 b0 = a0 + 8;
85 b1 = a1 + 7;
86 b2 = a2 + 6;
87 b3 = a3 * 5;
89 b4 = a2 + 4;
90 b5 = a3 + 3;
92 out[i*4] = b0;
93 out[i*4 + 1] = b1;
94 out[i*4 + 2] = b2;
95 out[i*4 + 3] = b3;
97 out2[i*4] = b0;
98 out2[i*4 + 1] = b1;
99 out2[i*4 + 2] = b4;
100 out2[i*4 + 3] = b5;
103 /* check results: */
104 for (i = 0; i < N; i++)
106 a0 = in[i*4];
107 a1 = in[i*4 + 1];
108 a2 = in[i*4 + 2];
109 a3 = in[i*4 + 3];
111 b0 = a0 + 8;
112 b1 = a1 + 7;
113 b2 = a2 + 6;
114 b3 = a3 * 5;
116 b4 = a2 + 4;
117 b5 = a3 + 3;
119 if (out[i*4] != b0
120 || out[i*4 + 1] != b1
121 || out[i*4 + 2] != b2
122 || out[i*4 + 3] != b3)
123 abort ();
125 if (out2[i*4] != b0
126 || out2[i*4 + 1] != b1
127 || out2[i*4 + 2] != b4
128 || out2[i*4 + 3] != b5)
129 abort ();
133 /* Different operations in the second case - vectorization with interleaving. */
134 for (i = 0; i < N; i++)
136 a0 = in[i*4];
137 a1 = in[i*4 + 1];
138 a2 = in[i*4 + 2];
139 a3 = in[i*4 + 3];
141 b0 = a0 + 8;
142 b1 = a1 + 7;
143 b2 = a2 + 6;
144 b3 = a3 + 5;
146 b4 = a2 * 4;
147 b5 = a3 + 3;
149 out[i*4] = b0;
150 out[i*4 + 1] = b1;
151 out[i*4 + 2] = b2;
152 out[i*4 + 3] = b3;
154 out2[i*4] = b0;
155 out2[i*4 + 1] = b1;
156 out2[i*4 + 2] = b4;
157 out2[i*4 + 3] = b5;
160 /* check results: */
161 for (i = 0; i < N; i++)
163 a0 = in[i*4];
164 a1 = in[i*4 + 1];
165 a2 = in[i*4 + 2];
166 a3 = in[i*4 + 3];
168 b0 = a0 + 8;
169 b1 = a1 + 7;
170 b2 = a2 + 6;
171 b3 = a3 + 5;
173 b4 = a2 * 4;
174 b5 = a3 + 3;
176 if (out[i*4] != b0
177 || out[i*4 + 1] != b1
178 || out[i*4 + 2] != b2
179 || out[i*4 + 3] != b3)
180 abort ();
182 if (out2[i*4] != b0
183 || out2[i*4 + 1] != b1
184 || out2[i*4 + 2] != b4
185 || out2[i*4 + 3] != b5)
186 abort ();
190 return 0;
193 int main (void)
195 check_vect ();
197 main1 ();
199 return 0;
202 /* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" { target { vect_strided4 || vect_extract_even_odd } } } } */
203 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { ! { vect_strided4 || vect_extract_even_odd } } } } } */
204 /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" { target vect_strided4 } } } */
205 /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 0 "vect" { target { ! { vect_strided4 } } } } } */