1 /* { dg-additional-options "-fopenmp-simd -fno-tree-vectorize" } */
2 /* { dg-additional-options "-mavx" { target avx_runtime } } */
3 /* { dg-final { scan-tree-dump "vectorized 1\[1-2] loops" "vect" { target i?86-*-* x86_64-*-* } } } */
4
5 #include "tree-vect.h"
6
7 int x, i, j;
8 volatile int a, b, c, d, e, f, g, h;
9 int k[11][101];
10
11 __attribute__((noipa)) void
12 doit (void)
13 {
14 int niters, err = 0;
15 for (i = 1; i <= 10; i++)
16 for (j = 1; j <= 10 * i; j++)
17 {
18 k[i][j] = 1;
19 asm volatile ("" : : : "memory");
20 }
21 a = 1; b = 11; c = 1; d = 0; e = 1; f = 10; g = 1; h = 1;
22 niters = 0; i = -100; j = -100; x = -100;
23 #pragma omp simd collapse(2) lastprivate (i, j, x) reduction(+:niters) reduction(|:err)
24 for (i = 1; i <= 10; i++)
25 for (j = 1; j <= 10 * i; j++)
26 {
27 err |= (i < 1);
28 err |= (i > 10);
29 err |= (j < 1);
30 err |= (j > 10 * i);
31 err |= (k[i][j] != 1);
32 k[i][j]++;
33 x = i * 1024 + (j & 1023);
34 niters++;
35 }
36 if (i != 11 || j != 101 || x != 10340 || niters != 550 || err)
37 abort ();
38 niters = 0; i = -100; j = -100; x = -100;
39 #pragma omp simd collapse(2) lastprivate (i, j, x) reduction(+:niters) reduction(|:err)
40 for (i = a; i < b; i += c)
41 for (j = d * i + e; j < g + i * f; j += h)
42 {
43 err |= (i < 1);
44 err |= (i > 10);
45 err |= (j < 1);
46 err |= (j > 10 * i);
47 err |= (k[i][j] != 2);
48 k[i][j]++;
49 x = i * 1024 + (j & 1023);
50 niters++;
51 }
52 if (i != 11 || j != 101 || x != 10340 || niters != 550 || err)
53 abort ();
54 for (i = 1; i <= 10; i++)
55 for (j = 1; j <= 10 * i; j++)
56 if (k[i][j] == 3)
57 k[i][j] = 0;
58 else
59 abort ();
60 for (i = 0; i < 11; i++)
61 for (j = 0; j < 101; j++)
62 if (k[i][j] != 0)
63 abort ();
64 for (i = 0; i < 10; i++)
65 for (j = 0; j < 10 * i; j++)
66 {
67 k[i][j] = 1;
68 asm volatile ("" : : : "memory");
69 }
70 a = 0; b = 10; c = 1; d = 0; e = 0; f = 10; g = 0; h = 1;
71 niters = 0; i = -100; j = -100; x = -100;
72 #pragma omp simd collapse(2) lastprivate (i, j, x) reduction(+:niters) reduction(|:err)
73 for (i = 0; i < 10; i++)
74 for (j = 0; j < 10 * i; j++)
75 {
76 err |= (i < 0);
77 err |= (i >= 10);
78 err |= (j < 0);
79 err |= (j >= 10 * i);
80 err |= (k[i][j] != 1);
81 k[i][j]++;
82 x = i * 1024 + (j & 1023);
83 niters++;
84 }
85 if (i != 10 || j != 90 || x != 9305 || niters != 450 || err)
86 abort ();
87 niters = 0; i = -100; j = -100; x = -100;
88 #pragma omp simd collapse(2) lastprivate (i, j, x) reduction(+:niters) reduction(|:err)
89 for (i = a; i < b; i += c)
90 for (j = d * i + e; j < g + i * f; j += h)
91 {
92 err |= (i < 0);
93 err |= (i >= 10);
94 err |= (j < 0);
95 err |= (j >= 10 * i);
96 err |= (k[i][j] != 2);
97 k[i][j]++;
98 x = i * 1024 + (j & 1023);
99 niters++;
100 }
101 if (i != 10 || j != 90 || x != 9305 || niters != 450 || err)
102 abort ();
103 for (i = 0; i < 10; i++)
104 for (j = 0; j < 10 * i; j++)
105 if (k[i][j] == 3)
106 k[i][j] = 0;
107 else
108 abort ();
109 for (i = 0; i < 11; i++)
110 for (j = 0; j < 101; j++)
111 if (k[i][j] != 0)
112 abort ();
113 for (i = 4; i < 10; i++)
114 for (j = -9 + 2 * i; j < i; j++)
115 {
116 k[i][j + 1] = 1;
117 asm volatile ("" : : : "memory");
118 }
119 a = 4; b = 10; c = 1; d = 2; e = -9; f = 1; g = 0; h = 1;
120 niters = 0; i = -100; j = -100; x = -100;
121 #pragma omp simd collapse(2) lastprivate (i, j, x) reduction(+:niters) reduction(|:err)
122 for (i = 4; i < 10; i++)
123 for (j = -9 + 2 * i; j < i; j++)
124 {
125 err |= (i < 4);
126 err |= (i >= 10);
127 err |= (j < -9 + 2 * i);
128 err |= (j >= i);
129 err |= (k[i][j + 1] != 1);
130 k[i][j + 1]++;
131 x = i * 1024 + (j & 1023);
132 niters++;
133 }
134 if (/*i != 10 || j != 9 || */x != 8199 || niters != 15 || err)
135 abort ();
136 niters = 0; i = -100; j = -100; x = -100;
137 #pragma omp simd collapse(2) lastprivate (i, j, x) reduction(+:niters) reduction(|:err)
138 for (i = a; i < b; i += c)
139 for (j = d * i + e; j < g + i * f; j += h)
140 {
141 err |= (i < 4);
142 err |= (i >= 10);
143 err |= (j < -9 + 2 * i);
144 err |= (j >= i);
145 err |= (k[i][j + 1] != 2);
146 k[i][j + 1]++;
147 x = i * 1024 + (j & 1023);
148 niters++;
149 }
150 if (/*i != 10 || j != 9 || */x != 8199 || niters != 15 || err)
151 abort ();
152 for (i = 4; i < 10; i++)
153 for (j = -9 + 2 * i; j < i; j++)
154 if (k[i][j + 1] == 3)
155 k[i][j + 1] = 0;
156 else
157 abort ();
158 for (i = 0; i < 11; i++)
159 for (j = 0; j < 101; j++)
160 if (k[i][j] != 0)
161 abort ();
162 for (i = 1; i < 10; i += 2)
163 for (j = 1; j < i + 1; j++)
164 {
165 k[i][j] = 1;
166 asm volatile ("" : : : "memory");
167 }
168 a = 1; b = 10; c = 2; d = 0; e = 1; f = 1; g = 1; h = 1;
169 niters = 0; i = -100; j = -100; x = -100;
170 #pragma omp simd collapse(2) lastprivate (i, j, x) reduction(+:niters) reduction(|:err)
171 for (i = 1; i < 10; i += 2)
172 for (j = 1; j < i + 1; j++)
173 {
174 err |= (i < 1);
175 err |= (i >= 10);
176 err |= (j < 1);
177 err |= (j >= i + 1);
178 err |= (k[i][j] != 1);
179 k[i][j]++;
180 x = i * 1024 + (j & 1023);
181 niters++;
182 }
183 if (i != 11 || j != 10 || x != 9225 || niters != 25 || err)
184 abort ();
185 niters = 0; i = -100; j = -100; x = -100;
186 #pragma omp simd collapse(2) lastprivate (i, j, x) reduction(+:niters) reduction(|:err)
187 for (i = a; i < b; i += c)
188 for (j = d * i + e; j < g + i * f; j += h)
189 {
190 err |= (i < 1);
191 err |= (i >= 10);
192 err |= (j < 1);
193 err |= (j >= i + 1);
194 err |= (k[i][j] != 2);
195 k[i][j]++;
196 x = i * 1024 + (j & 1023);
197 niters++;
198 }
199 if (i != 11 || j != 10 || x != 9225 || niters != 25 || err)
200 abort ();
201 for (i = 1; i < 10; i += 2)
202 for (j = 1; j < i + 1; j++)
203 if (k[i][j] == 3)
204 k[i][j] = 0;
205 else
206 abort ();
207 for (i = 0; i < 11; i++)
208 for (j = 0; j < 101; j++)
209 if (k[i][j] != 0)
210 abort ();
211 for (j = -11; j >= -41; j -= 15)
212 {
213 k[0][-j] = 1;
214 asm volatile ("" : : : "memory");
215 }
216 a = 4; b = 8; c = 12; d = -8; e = -9; f = -3; g = 6; h = 15;
217 niters = 0; i = -100; j = -100; x = -100;
218 #pragma omp simd collapse(2) lastprivate (i, j, x) reduction(+:niters) reduction(|:err)
219 for (i = 4; i < 8; i += 12)
220 for (j = -8 * i - 9; j < i * -3 + 6; j += 15)
221 {
222 err |= (i != 4);
223 err |= (j < -41);
224 err |= (j > -11);
225 err |= (k[0][-j] != 1);
226 k[0][-j]++;
227 x = i * 1024 + (j & 1023);
228 niters++;
229 }
230 if (i != 16 || j != 4 || x != 5109 || niters != 3 || err)
231 abort ();
232 niters = 0; i = -100; j = -100; x = -100;
233 #pragma omp simd collapse(2) lastprivate (i, j, x) reduction(+:niters) reduction(|:err)
234 for (i = a; i < b; i += c)
235 for (j = d * i + e; j < g + i * f; j += h)
236 {
237 err |= (i != 4);
238 err |= (j < -41);
239 err |= (j > -11);
240 err |= (k[0][-j] != 2);
241 k[0][-j]++;
242 x = i * 1024 + (j & 1023);
243 niters++;
244 }
245 if (i != 16 || j != 4 || x != 5109 || niters != 3 || err)
246 abort ();
247 for (j = -11; j >= -41; j -= 15)
248 if (k[0][-j] == 3)
249 k[0][-j] = 0;
250 else
251 abort ();
252 for (j = -11; j >= -41; j--)
253 if (k[0][-j] != 0)
254 abort ();
255 for (j = -34; j <= -7; j++)
256 {
257 k[0][-j] = 1;
258 asm volatile ("" : : : "memory");
259 }
260 a = -13; b = 7; c = 12; d = 3; e = 5; f = 0; g = -6; h = 1;
261 niters = 0; i = -100; j = -100; x = -100;
262 #pragma omp simd collapse(2) lastprivate (i, j, x) reduction(+:niters) reduction(|:err)
263 for (i = -13; i < 7; i += 12)
264 for (j = 3 * i + 5; j < -6; j++)
265 {
266 err |= (i != -13);
267 err |= (j < -34);
268 err |= (j > -7);
269 err |= (k[0][-j] != 1);
270 k[0][-j]++;
271 x = i * 1024 + (j & 1023);
272 niters++;
273 }
274 if (/*i != 11 || j != 2 || */x != -12295 || niters != 28 || err)
275 abort ();
276 niters = 0; i = -100; j = -100; x = -100;
277 #pragma omp simd collapse(2) lastprivate (i, j, x) reduction(+:niters) reduction(|:err)
278 for (i = a; i < b; i += c)
279 for (j = d * i + e; j < g + i * f; j += h)
280 {
281 err |= (i != -13);
282 err |= (j < -34);
283 err |= (j > -7);
284 err |= (k[0][-j] != 2);
285 k[0][-j]++;
286 x = i * 1024 + (j & 1023);
287 niters++;
288 }
289 if (/*i != 11 || j != 2 || */x != -12295 || niters != 28 || err)
290 abort ();
291 for (j = -34; j <= -7; j++)
292 if (k[0][-j] == 3)
293 k[0][-j] = 0;
294 else
295 abort ();
296 }
297
298 int
299 main ()
300 {
301 check_vect ();
302 doit ();
303 return 0;
304 }