Merge -r 127928:132243 from trunk
[official-gcc.git] / gcc / testsuite / gcc.dg / vect / slp-21.c
blob327045e4789ef0698971fc572a8672b7fbc4d5b4
1 /* { dg-require-effective-target vect_int } */
3 #include <stdarg.h>
4 #include <stdio.h>
5 #include "tree-vect.h"
7 #define N 128
9 int
10 main1 ()
12 unsigned short i;
13 unsigned short out[N*8], out2[N*8], b0, b1, b2, b3, b4, a0, a1, a2, a3, b5;
14 unsigned short in[N*8];
16 for (i = 0; i < N*8; i++)
18 in[i] = i;
21 /* Different operations in both cases - vectorization with interleaving. */
22 for (i = 0; i < N; i++)
24 a0 = in[i*4];
25 a1 = in[i*4 + 1];
26 a2 = in[i*4 + 2];
27 a3 = in[i*4 + 3];
29 b0 = a0 * 8;
30 b1 = a1 + 7;
31 b2 = a2 + 6;
32 b3 = a3 * 5;
34 b4 = a2 + 4;
35 b5 = a3 + 3;
37 out[i*4] = b0;
38 out[i*4 + 1] = b1;
39 out[i*4 + 2] = b2;
40 out[i*4 + 3] = b3;
42 out2[i*4] = b0;
43 out2[i*4 + 1] = b1;
44 out2[i*4 + 2] = b4;
45 out2[i*4 + 3] = b5;
48 /* check results: */
49 for (i = 0; i < N; i++)
51 a0 = in[i*4];
52 a1 = in[i*4 + 1];
53 a2 = in[i*4 + 2];
54 a3 = in[i*4 + 3];
56 b0 = a0 * 8;
57 b1 = a1 + 7;
58 b2 = a2 + 6;
59 b3 = a3 * 5;
61 b4 = a2 + 4;
62 b5 = a3 + 3;
64 if (out[i*4] != b0
65 || out[i*4 + 1] != b1
66 || out[i*4 + 2] != b2
67 || out[i*4 + 3] != b3)
68 abort ();
70 if (out2[i*4] != b0
71 || out2[i*4 + 1] != b1
72 || out2[i*4 + 2] != b4
73 || out2[i*4 + 3] != b5)
74 abort ();
77 /* Different operations in the first case - vectorization with interleaving. */
78 for (i = 0; i < N; i++)
80 a0 = in[i*4];
81 a1 = in[i*4 + 1];
82 a2 = in[i*4 + 2];
83 a3 = in[i*4 + 3];
85 b0 = a0 + 8;
86 b1 = a1 + 7;
87 b2 = a2 + 6;
88 b3 = a3 * 5;
90 b4 = a2 + 4;
91 b5 = a3 + 3;
93 out[i*4] = b0;
94 out[i*4 + 1] = b1;
95 out[i*4 + 2] = b2;
96 out[i*4 + 3] = b3;
98 out2[i*4] = b0;
99 out2[i*4 + 1] = b1;
100 out2[i*4 + 2] = b4;
101 out2[i*4 + 3] = b5;
104 /* check results: */
105 for (i = 0; i < N; i++)
107 a0 = in[i*4];
108 a1 = in[i*4 + 1];
109 a2 = in[i*4 + 2];
110 a3 = in[i*4 + 3];
112 b0 = a0 + 8;
113 b1 = a1 + 7;
114 b2 = a2 + 6;
115 b3 = a3 * 5;
117 b4 = a2 + 4;
118 b5 = a3 + 3;
120 if (out[i*4] != b0
121 || out[i*4 + 1] != b1
122 || out[i*4 + 2] != b2
123 || out[i*4 + 3] != b3)
124 abort ();
126 if (out2[i*4] != b0
127 || out2[i*4 + 1] != b1
128 || out2[i*4 + 2] != b4
129 || out2[i*4 + 3] != b5)
130 abort ();
134 /* Different operations in the second case - vectorization with interleaving. */
135 for (i = 0; i < N; i++)
137 a0 = in[i*4];
138 a1 = in[i*4 + 1];
139 a2 = in[i*4 + 2];
140 a3 = in[i*4 + 3];
142 b0 = a0 + 8;
143 b1 = a1 + 7;
144 b2 = a2 + 6;
145 b3 = a3 + 5;
147 b4 = a2 * 4;
148 b5 = a3 + 3;
150 out[i*4] = b0;
151 out[i*4 + 1] = b1;
152 out[i*4 + 2] = b2;
153 out[i*4 + 3] = b3;
155 out2[i*4] = b0;
156 out2[i*4 + 1] = b1;
157 out2[i*4 + 2] = b4;
158 out2[i*4 + 3] = b5;
161 /* check results: */
162 for (i = 0; i < N; i++)
164 a0 = in[i*4];
165 a1 = in[i*4 + 1];
166 a2 = in[i*4 + 2];
167 a3 = in[i*4 + 3];
169 b0 = a0 + 8;
170 b1 = a1 + 7;
171 b2 = a2 + 6;
172 b3 = a3 + 5;
174 b4 = a2 * 4;
175 b5 = a3 + 3;
177 if (out[i*4] != b0
178 || out[i*4 + 1] != b1
179 || out[i*4 + 2] != b2
180 || out[i*4 + 3] != b3)
181 abort ();
183 if (out2[i*4] != b0
184 || out2[i*4 + 1] != b1
185 || out2[i*4 + 2] != b4
186 || out2[i*4 + 3] != b5)
187 abort ();
191 return 0;
194 int main (void)
196 check_vect ();
198 main1 ();
200 return 0;
203 /* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" { target vect_strided } } } */
204 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { ! { vect_strided } } } } } */
205 /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" { target vect_strided } } } */
206 /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 0 "vect" { target { ! { vect_strided } } } } } */
207 /* { dg-final { cleanup-tree-dump "vect" } } */