Fix xfail for 32-bit hppa*-*-* in gcc.dg/pr84877.c
[official-gcc.git] / libgomp / testsuite / libgomp.c++ / task-reduction-13.C
blob3d0165dfa92f87b73d19343b259bd88f2a0e7e3d
1 extern "C" void abort ();
3 struct S { S (); S (long int, long int); ~S (); static int cnt1, cnt2, cnt3; long int s, t; };
5 int S::cnt1;
6 int S::cnt2;
7 int S::cnt3;
9 S::S ()
11   #pragma omp atomic
12   cnt1++;
15 S::S (long int x, long int y) : s (x), t (y)
17   #pragma omp atomic update
18   ++cnt2;
21 S::~S ()
23   #pragma omp atomic
24   cnt3 = cnt3 + 1;
25   if (t < 3 || t > 9 || (t & 1) == 0)
26     abort ();
29 void
30 bar (S *p, S *o)
32   p->s = 1;
33   if (o->t != 5)
34     abort ();
35   p->t = 9;
38 static inline void
39 baz (S *o, S *i)
41   if (o->t != 5 || i->t != 9)
42     abort ();
43   o->s *= i->s;
46 #pragma omp declare reduction (+: S : omp_out.s += omp_in.s) initializer (omp_priv (0, 3))
47 #pragma omp declare reduction (*: S : baz (&omp_out, &omp_in)) initializer (bar (&omp_priv, &omp_orig))
49 S as[2] = { { 0, 7 }, { 0, 7 } };
50 S (&a)[2] = as;
51 S bs[7] = { { 9, 5 }, { 11, 5 }, { 1, 5 }, { 1, 5 }, { 1, 5 }, { 13, 5 }, { 15, 5 } };
52 S (&b)[7] = bs;
53 S es[3] = { { 5, 7 }, { 0, 7 }, { 5, 7 } };
54 S (&e)[3] = es;
55 S fs[5] = { { 6, 7 }, { 7, 7 }, { 0, 7 }, { 0, 7 }, { 9, 7 } };
56 S (&f)[5] = fs;
57 S gs[4] = { { 1, 7 }, { 0, 7 }, { 0, 7 }, { 2, 7 } };
58 S (&g)[4] = gs;
59 S hs[3] = { { 0, 7 }, { 1, 7 }, { 4, 7 } };
60 S (&h)[3] = hs;
61 S ks[4][2] = { { { 5, 7 }, { 6, 7 } }, { { 0, 7 }, { 0, 7 } }, { { 0, 7 }, { 0, 7 } }, { { 7, 7 }, { 8, 7 } } };
62 S (&k)[4][2] = ks;
63 S *ss;
64 S *&s = ss;
65 S (*ts)[2];
66 S (*&t)[2] = ts;
68 template <typename S, typename T>
69 void
70 foo (T &n, S *&c, S *&d, S (&m)[3], S *&r, S (&o)[4], S *&p, S (&q)[4][2])
72   T i;
73   for (i = 0; i < 2; i++)
74     #pragma omp task in_reduction (+: a, c[:2]) in_reduction (*: b[2 * n:3 * n], d[0:2]) \
75                      in_reduction (+: o[n:n*2], m[1], k[1:2][:], p[0], f[2:2]) \
76                      in_reduction (+: q[1:2][:], g[n:n*2], e[1], h[0], r[2:2]) \
77                      in_reduction (*: s[1:2], t[2:2][:])
78     {
79       a[0].s += 7;
80       a[1].s += 17;
81       b[2].s *= 2;
82       b[4].s *= 2;
83       c[0].s += 6;
84       d[1].s *= 2;
85       e[1].s += 19;
86       f[2].s += 21;
87       f[3].s += 23;
88       g[1].s += 25;
89       g[2].s += 27;
90       h[0].s += 29;
91       k[1][0].s += 31;
92       k[2][1].s += 33;
93       m[1].s += 19;
94       r[2].s += 21;
95       r[3].s += 23;
96       o[1].s += 25;
97       o[2].s += 27;
98       p[0].s += 29;
99       q[1][0].s += 31;
100       q[2][1].s += 33;
101       s[1].s *= 2;
102       t[2][0].s *= 2;
103       t[3][1].s *= 2;
104       if ((e[1].t != 7 && e[1].t != 3) || (h[0].t != 7 && h[0].t != 3)
105           || (m[1].t != 7 && m[1].t != 3) || (p[0].t != 7 && p[0].t != 3))
106         abort ();
107       for (T z = 0; z < 2; z++)
108         if ((a[z].t != 7 && a[z].t != 3) || (c[z].t != 7 && c[z].t != 3)
109             || (d[z].t != 5 && d[z].t != 9) || (f[z + 2].t != 7 && f[z + 2].t != 3)
110             || (g[z + 1].t != 7 && g[z + 1].t != 3) || (r[z + 2].t != 7 && r[z + 2].t != 3)
111             || (s[z + 1].t != 5 && s[z + 1].t != 9) || (o[z + 1].t != 7 && o[z + 1].t != 3)
112             || (k[z + 1][0].t != 7 && k[z + 1][0].t != 3) || (k[z + 1][1].t != 7 && k[z + 1][1].t != 3)
113             || (q[z + 1][0].t != 7 && q[z + 1][0].t != 3) || (q[z + 1][1].t != 7 && q[z + 1][1].t != 3)
114             || (t[z + 2][0].t != 5 && t[z + 2][0].t != 9) || (t[z + 2][1].t != 5 && t[z + 2][1].t != 9))
115           abort ();
116       for (T z = 0; z < 3; z++)
117         if (b[z + 2].t != 5 && b[z + 2].t != 9)
118           abort ();
119     }
122 template <typename S, typename T>
123 void
124 test (T &n)
126   S cs[2] = { { 0, 7 }, { 0, 7 } };
127   S (&c)[2] = cs;
128   S ps[3] = { { 0, 7 }, { 1, 7 }, { 4, 7 } };
129   S (&p)[3] = ps;
130   S qs[4][2] = { { { 5, 7 }, { 6, 7 } }, { { 0, 7 }, { 0, 7 } }, { { 0, 7 }, { 0, 7 } }, { { 7, 7 }, { 8, 7 } } };
131   S (&q)[4][2] = qs;
132   S sb[4] = { { 5, 5 }, { 1, 5 }, { 1, 5 }, { 6, 5 } };
133   S tb[5][2] = { { { 9, 5 }, { 10, 5 } }, { { 11, 5 }, { 12, 5 } }, { { 1, 5 }, { 1, 5 } }, { { 1, 5 }, { 1, 5 } }, { { 13, 5 }, { 14, 5 } } };
134   S ms[3] = { { 5, 7 }, { 0, 7 }, { 5, 7 } };
135   S os[4] = { { 1, 7 }, { 0, 7 }, { 0, 7 }, { 2, 7 } };
136   s = sb;
137   t = tb;
138   #pragma omp parallel if (0)
139   {
140     S ds[] = { { 1, 5 }, { 1, 5 } };
141     S (&d)[2] = ds;
142     S (&m)[3] = ms;
143     S rs[5] = { { 6, 7 }, { 7, 7 }, { 0, 7 }, { 0, 7 }, { 9, 7 } };
144     S (&r)[5] = rs;
145     S (&o)[4] = os;
146     #pragma omp parallel reduction (task, +: a, c) reduction (task, *: b[2 * n:3 * n], d) \
147                          reduction (task, +: e[1], f[2:2], g[n:n*2], h[0], k[1:2][0:2]) \
148                          reduction (task, +: o[n:n*2], m[1], q[1:2][:], p[0], r[2:2]) \
149                          reduction (task, *: t[2:2][:], s[1:n + 1])
150     {
151       #pragma omp for
152       for (T i = 0; i < 4; i++)
153         #pragma omp task in_reduction (+: a, c) in_reduction (*: b[2 * n:3 * n], d) \
154                          in_reduction (+: o[n:n*2], q[1:2][:], p[0], m[1], r[2:2]) \
155                          in_reduction (+: g[n:n * 2], e[1], k[1:2][:], h[0], f[2:2]) \
156                          in_reduction (*: s[1:2], t[2:2][:])
157         {
158           T j;
159           a[0].s += 2;
160           a[1].s += 3;
161           b[2].s *= 2;
162           f[3].s += 8;
163           g[1].s += 9;
164           g[2].s += 10;
165           h[0].s += 11;
166           k[1][1].s += 13;
167           k[2][1].s += 15;
168           m[1].s += 16;
169           r[2].s += 8;
170           s[1].s *= 2;
171           t[2][1].s *= 2;
172           t[3][1].s *= 2;
173           if ((e[1].t != 7 && e[1].t != 3) || (h[0].t != 7 && h[0].t != 3)
174               || (m[1].t != 7 && m[1].t != 3) || (p[0].t != 7 && p[0].t != 3))
175             abort ();
176           for (T z = 0; z < 2; z++)
177             if ((a[z].t != 7 && a[z].t != 3) || (c[z].t != 7 && c[z].t != 3)
178                 || (d[z].t != 5 && d[z].t != 9) || (f[z + 2].t != 7 && f[z + 2].t != 3)
179                 || (g[z + 1].t != 7 && g[z + 1].t != 3) || (r[z + 2].t != 7 && r[z + 2].t != 3)
180                 || (s[z + 1].t != 5 && s[z + 1].t != 9) || (o[z + 1].t != 7 && o[z + 1].t != 3)
181                 || (k[z + 1][0].t != 7 && k[z + 1][0].t != 3) || (k[z + 1][1].t != 7 && k[z + 1][1].t != 3)
182                 || (q[z + 1][0].t != 7 && q[z + 1][0].t != 3) || (q[z + 1][1].t != 7 && q[z + 1][1].t != 3)
183                 || (t[z + 2][0].t != 5 && t[z + 2][0].t != 9) || (t[z + 2][1].t != 5 && t[z + 2][1].t != 9))
184               abort ();
185           for (T z = 0; z < 3; z++)
186             if (b[z + 2].t != 5 && b[z + 2].t != 9)
187               abort ();
188           for (j = 0; j < 2; j++)
189             #pragma omp task in_reduction (+: a, c[:2]) \
190                              in_reduction (*: b[2 * n:3 * n], d[n - 1:n + 1]) \
191                              in_reduction (+: e[1], f[2:2], g[n:n*2], h[0], k[1:2][:2]) \
192                              in_reduction (+: m[1], r[2:2], o[n:n*2], p[0], q[1:2][:2]) \
193                              in_reduction (*: s[n:2], t[2:2][:])
194             {
195               m[1].s += 6;
196               r[2].s += 7;
197               q[1][0].s += 17;
198               q[2][0].s += 19;
199               a[0].s += 4;
200               a[1].s += 5;
201               b[3].s *= 2;
202               b[4].s *= 2;
203               f[3].s += 18;
204               g[1].s += 29;
205               g[2].s += 18;
206               h[0].s += 19;
207               s[2].s *= 2;
208               t[2][0].s *= 2;
209               t[3][0].s *= 2;
210               S *cp = c;
211               S *dp = d;
212               S *rp = r;
213               S *pp = p;
214               if ((e[1].t != 7 && e[1].t != 3) || (h[0].t != 7 && h[0].t != 3)
215                   || (m[1].t != 7 && m[1].t != 3) || (p[0].t != 7 && p[0].t != 3))
216                 abort ();
217               for (T z = 0; z < 2; z++)
218                 if ((a[z].t != 7 && a[z].t != 3) || (c[z].t != 7 && c[z].t != 3)
219                     || (d[z].t != 5 && d[z].t != 9) || (f[z + 2].t != 7 && f[z + 2].t != 3)
220                     || (g[z + 1].t != 7 && g[z + 1].t != 3) || (r[z + 2].t != 7 && r[z + 2].t != 3)
221                     || (s[z + 1].t != 5 && s[z + 1].t != 9) || (o[z + 1].t != 7 && o[z + 1].t != 3)
222                     || (k[z + 1][0].t != 7 && k[z + 1][0].t != 3) || (k[z + 1][1].t != 7 && k[z + 1][1].t != 3)
223                     || (q[z + 1][0].t != 7 && q[z + 1][0].t != 3) || (q[z + 1][1].t != 7 && q[z + 1][1].t != 3)
224                     || (t[z + 2][0].t != 5 && t[z + 2][0].t != 9) || (t[z + 2][1].t != 5 && t[z + 2][1].t != 9))
225                   abort ();
226               for (T z = 0; z < 3; z++)
227                 if (b[z + 2].t != 5 && b[z + 2].t != 9)
228                   abort ();
229               foo (n, cp, dp, m, rp, o, pp, q);
230               r[3].s += 18;
231               o[1].s += 29;
232               o[2].s += 18;
233               p[0].s += 19;
234               c[0].s += 4;
235               c[1].s += 5;
236               d[0].s *= 2;
237               e[1].s += 6;
238               f[2].s += 7;
239               k[1][0].s += 17;
240               k[2][0].s += 19;
241             }
242           r[3].s += 8;
243           o[1].s += 9;
244           o[2].s += 10;
245           p[0].s += 11;
246           q[1][1].s += 13;
247           q[2][1].s += 15;
248           b[3].s *= 2;
249           c[0].s += 4;
250           c[1].s += 9;
251           d[0].s *= 2;
252           e[1].s += 16;
253           f[2].s += 8;
254         }
255     }
256     if (d[0].s != 1LL << (8 + 4)
257         || d[1].s != 1LL << 16
258         || m[0].s != 5
259         || m[1].s != 19 * 16 + 6 * 8 + 16 * 4
260         || m[2].s != 5
261         || r[0].s != 6
262         || r[1].s != 7
263         || r[2].s != 21 * 16 + 7 * 8 + 8 * 4
264         || r[3].s != 23 * 16 + 18 * 8 + 8 * 4
265         || r[4].s != 9
266         || o[0].s != 1
267         || o[1].s != 25 * 16 + 29 * 8 + 9 * 4
268         || o[2].s != 27 * 16 + 18 * 8 + 10 * 4
269         || o[3].s != 2)
270       abort ();
271     if (e[1].t != 7 || h[0].t != 7 || m[1].t != 7 || p[0].t != 7)
272       abort ();
273     for (T z = 0; z < 2; z++)
274       if (a[z].t != 7 || c[z].t != 7 || d[z].t != 5 || f[z + 2].t != 7
275           || g[z + 1].t != 7 || r[z + 2].t != 7 || s[z + 1].t != 5 || o[z + 1].t != 7
276           || k[z + 1][0].t != 7 || k[z + 1][1].t != 7 || q[z + 1][0].t != 7 || q[z + 1][1].t != 7
277           || t[z + 2][0].t != 5 || t[z + 2][1].t != 5)
278         abort ();
279     for (T z = 0; z < 3; z++)
280       if (b[z + 2].t != 5)
281         abort ();
282   }
283   if (a[0].s != 7 * 16 + 4 * 8 + 2 * 4
284       || a[1].s != 17 * 16 + 5 * 8 + 3 * 4
285       || b[0].s != 9 || b[1].s != 11
286       || b[2].s != 1LL << (16 + 4)
287       || b[3].s != 1LL << (8 + 4)
288       || b[4].s != 1LL << (16 + 8)
289       || b[5].s != 13 || b[6].s != 15
290       || c[0].s != 6 * 16 + 4 * 8 + 4 * 4
291       || c[1].s != 5 * 8 + 9 * 4
292       || e[0].s != 5
293       || e[1].s != 19 * 16 + 6 * 8 + 16 * 4
294       || e[2].s != 5
295       || f[0].s != 6
296       || f[1].s != 7
297       || f[2].s != 21 * 16 + 7 * 8 + 8 * 4
298       || f[3].s != 23 * 16 + 18 * 8 + 8 * 4
299       || f[4].s != 9
300       || g[0].s != 1
301       || g[1].s != 25 * 16 + 29 * 8 + 9 * 4
302       || g[2].s != 27 * 16 + 18 * 8 + 10 * 4
303       || g[3].s != 2
304       || h[0].s != 29 * 16 + 19 * 8 + 11 * 4
305       || h[1].s != 1 || h[2].s != 4
306       || k[0][0].s != 5 || k[0][1].s != 6
307       || k[1][0].s != 31 * 16 + 17 * 8
308       || k[1][1].s != 13 * 4
309       || k[2][0].s != 19 * 8
310       || k[2][1].s != 33 * 16 + 15 * 4
311       || k[3][0].s != 7 || k[3][1].s != 8
312       || p[0].s != 29 * 16 + 19 * 8 + 11 * 4
313       || p[1].s != 1 || p[2].s != 4
314       || q[0][0].s != 5 || q[0][1].s != 6
315       || q[1][0].s != 31 * 16 + 17 * 8
316       || q[1][1].s != 13 * 4
317       || q[2][0].s != 19 * 8
318       || q[2][1].s != 33 * 16 + 15 * 4
319       || q[3][0].s != 7 || q[3][1].s != 8
320       || sb[0].s != 5
321       || sb[1].s != 1LL << (16 + 4)
322       || sb[2].s != 1LL << 8
323       || sb[3].s != 6
324       || tb[0][0].s != 9 || tb[0][1].s != 10 || tb[1][0].s != 11 || tb[1][1].s != 12
325       || tb[2][0].s != 1LL << (16 + 8)
326       || tb[2][1].s != 1LL << 4
327       || tb[3][0].s != 1LL << 8
328       || tb[3][1].s != 1LL << (16 + 4)
329       || tb[4][0].s != 13 || tb[4][1].s != 14)
330     abort ();
334 main ()
336   int c1 = S::cnt1, c2 = S::cnt2, c3 = S::cnt3;
337   int n = 1;
338   test<S, int> (n);
339   if (S::cnt1 + S::cnt2 - c1 - c2 != S::cnt3 - c3)
340     abort ();
341   return 0;