AVR: Assert minimal required bit width of section_common::flags.
[gcc.git] / libgomp / testsuite / libgomp.c++ / taskloop-reduction-2.C
blobf1de5dae2ea269d48b46e63628fd0ee8510ba34e
1 extern "C" void abort ();
3 int as[2];
4 int (&a)[2] = as;
5 long long int bs[7] = { 9, 11, 1, 1, 1, 13, 15 };
6 long long int (&b)[7] = bs;
7 int es[3] = { 5, 0, 5 };
8 int (&e)[3] = es;
9 int fs[5] = { 6, 7, 0, 0, 9 };
10 int (&f)[5] = fs;
11 int gs[4] = { 1, 0, 0, 2 };
12 int (&g)[4] = gs;
13 int hs[3] = { 0, 1, 4 };
14 int (&h)[3] = hs;
15 int ks[4][2] = { { 5, 6 }, { 0, 0 }, { 0, 0 }, { 7, 8 } };
16 int (&k)[4][2] = ks;
17 long long *ss;
18 long long *&s = ss;
19 long long (*ts)[2];
20 long long (*&t)[2] = ts;
21 struct U { U (); ~U () {}; U (const U &); int u[4]; };
23 U::U
26   u[0] = 0; u[1] = 1; u[2] = 2; u[3] = 3;
29 U::U
30 (const U &r)
32   u[0] = r.u[0]; u[1] = r.u[1]; u[2] = r.u[2]; u[3] = r.u[3];
35 void
36 foo (int &n, int *&c, long long int *&d, int (&m)[3], int *&r, int (&o)[4], int *&p, int (&q)[4][2])
38   int i;
39   U u;
40   u.u[2] = 8;
41   #pragma omp taskloop in_reduction (+: a, c[:2]) in_reduction (*: b[2 * n:3 * n], d[0:2]) \
42                        in_reduction (+: o[n:n*2], m[1], k[1:2][:], p[0], f[2:2]) \
43                        in_reduction (+: q[1:2][:], g[n:n*2], e[1], h[0], r[2:2]) \
44                        in_reduction (*: s[1:2], t[2:2][:]) firstprivate (u) nogroup
45   for (i = 0; i < 2; i++)
46     {
47       a[0] += 7;
48       a[1] += 17;
49       b[2] *= 2;
50       b[4] *= 2;
51       c[0] += 6;
52       d[1] *= 2;
53       e[1] += 19;
54       f[2] += 21;
55       f[3] += 23;
56       g[1] += 25;
57       g[2] += 27;
58       h[0] += 29;
59       k[1][0] += 31;
60       k[2][1] += 33;
61       m[1] += 19;
62       r[2] += 21;
63       r[3] += 23;
64       o[1] += 25;
65       o[2] += 27;
66       p[0] += 29;
67       q[1][0] += 31;
68       q[2][1] += 33;
69       s[1] *= 2;
70       t[2][0] *= 2;
71       t[3][1] *= 2;
72       if (u.u[2] != 8)
73         abort ();
74     }
77 void
78 test (int &n)
80   int cs[2] = { 0, 0 };
81   int (&c)[2] = cs;
82   int ps[3] = { 0, 1, 4 };
83   int (&p)[3] = ps;
84   int qs[4][2] = { { 5, 6 }, { 0, 0 }, { 0, 0 }, { 7, 8 } };
85   int (&q)[4][2] = qs;
86   long long sb[4] = { 5, 1, 1, 6 };
87   long long tb[5][2] = { { 9, 10 }, { 11, 12 }, { 1, 1 }, { 1, 1 }, { 13, 14 } };
88   int ms[3] = { 5, 0, 5 };
89   int os[4] = { 1, 0, 0, 2 };
90   s = sb;
91   t = tb;
92   U u;
93   u.u[2] = 10;
94   #pragma omp parallel
95   #pragma omp single
96   {
97     long long int ds[] = { 1, 1 };
98     long long int (&d)[2] = ds;
99     int (&m)[3] = ms;
100     int rs[5] = { 6, 7, 0, 0, 9 };
101     int (&r)[5] = rs;
102     int (&o)[4] = os;
103     int i;
104     #pragma omp taskloop reduction (+: a, c) reduction (*: b[2 * n:3 * n], d) \
105                          reduction (+: e[1], f[2:2], g[n:n*2], h[0], k[1:2][0:2]) \
106                          reduction (+: o[n:n*2], m[1], q[1:2][:], p[0], r[2:2]) \
107                          reduction (*: t[2:2][:], s[1:n + 1]) firstprivate (u)
108     for (i = 0; i < 4; i++)
109       {
110         int j;
111         a[0] += 2;
112         a[1] += 3;
113         b[2] *= 2;
114         f[3] += 8;
115         g[1] += 9;
116         g[2] += 10;
117         h[0] += 11;
118         k[1][1] += 13;
119         k[2][1] += 15;
120         m[1] += 16;
121         r[2] += 8;
122         s[1] *= 2;
123         t[2][1] *= 2;
124         t[3][1] *= 2;
125         if (u.u[2] != 10)
126           abort ();
127         for (j = 0; j < 2; j++)
128           #pragma omp task in_reduction (+: a, c[:2]) \
129                            in_reduction (*: b[2 * n:3 * n], d[n - 1:n + 1]) \
130                            in_reduction (+: e[1], f[2:2], g[n:n*2], h[0], k[1:2][:2]) \
131                            in_reduction (+: m[1], r[2:2], o[n:n*2], p[0], q[1:2][:2]) \
132                            in_reduction (*: s[n:2], t[2:2][:]) firstprivate (u)
133           {
134             m[1] += 6;
135             r[2] += 7;
136             q[1][0] += 17;
137             q[2][0] += 19;
138             a[0] += 4;
139             a[1] += 5;
140             b[3] *= 2;
141             b[4] *= 2;
142             f[3] += 18;
143             g[1] += 29;
144             g[2] += 18;
145             h[0] += 19;
146             s[2] *= 2;
147             t[2][0] *= 2;
148             t[3][0] *= 2;
149             int *cp = c;
150             long long int *dp = d;
151             int *rp = r;
152             int *pp = p;
153             foo (n, cp, dp, m, rp, o, pp, q);
154             if (u.u[2] != 10)
155               abort ();
156             r[3] += 18;
157             o[1] += 29;
158             o[2] += 18;
159             p[0] += 19;
160             c[0] += 4;
161             c[1] += 5;
162             d[0] *= 2;
163             e[1] += 6;
164             f[2] += 7;
165             k[1][0] += 17;
166             k[2][0] += 19;
167           }
168         r[3] += 8;
169         o[1] += 9;
170         o[2] += 10;
171         p[0] += 11;
172         q[1][1] += 13;
173         q[2][1] += 15;
174         b[3] *= 2;
175         c[0] += 4;
176         c[1] += 9;
177         d[0] *= 2;
178         e[1] += 16;
179         f[2] += 8;
180       }
181     if (d[0] != 1LL << (8 + 4)
182         || d[1] != 1LL << 16
183         || m[0] != 5
184         || m[1] != 19 * 16 + 6 * 8 + 16 * 4
185         || m[2] != 5
186         || r[0] != 6
187         || r[1] != 7
188         || r[2] != 21 * 16 + 7 * 8 + 8 * 4
189         || r[3] != 23 * 16 + 18 * 8 + 8 * 4
190         || r[4] != 9
191         || o[0] != 1
192         || o[1] != 25 * 16 + 29 * 8 + 9 * 4
193         || o[2] != 27 * 16 + 18 * 8 + 10 * 4
194         || o[3] != 2)
195       abort ();
196   }
197   if (a[0] != 7 * 16 + 4 * 8 + 2 * 4
198       || a[1] != 17 * 16 + 5 * 8 + 3 * 4
199       || b[0] != 9 || b[1] != 11
200       || b[2] != 1LL << (16 + 4)
201       || b[3] != 1LL << (8 + 4)
202       || b[4] != 1LL << (16 + 8)
203       || b[5] != 13 || b[6] != 15
204       || c[0] != 6 * 16 + 4 * 8 + 4 * 4
205       || c[1] != 5 * 8 + 9 * 4
206       || e[0] != 5
207       || e[1] != 19 * 16 + 6 * 8 + 16 * 4
208       || e[2] != 5
209       || f[0] != 6
210       || f[1] != 7
211       || f[2] != 21 * 16 + 7 * 8 + 8 * 4
212       || f[3] != 23 * 16 + 18 * 8 + 8 * 4
213       || f[4] != 9
214       || g[0] != 1
215       || g[1] != 25 * 16 + 29 * 8 + 9 * 4
216       || g[2] != 27 * 16 + 18 * 8 + 10 * 4
217       || g[3] != 2
218       || h[0] != 29 * 16 + 19 * 8 + 11 * 4
219       || h[1] != 1 || h[2] != 4
220       || k[0][0] != 5 || k[0][1] != 6
221       || k[1][0] != 31 * 16 + 17 * 8
222       || k[1][1] != 13 * 4
223       || k[2][0] != 19 * 8
224       || k[2][1] != 33 * 16 + 15 * 4
225       || k[3][0] != 7 || k[3][1] != 8
226       || p[0] != 29 * 16 + 19 * 8 + 11 * 4
227       || p[1] != 1 || p[2] != 4
228       || q[0][0] != 5 || q[0][1] != 6
229       || q[1][0] != 31 * 16 + 17 * 8
230       || q[1][1] != 13 * 4
231       || q[2][0] != 19 * 8
232       || q[2][1] != 33 * 16 + 15 * 4
233       || q[3][0] != 7 || q[3][1] != 8
234       || sb[0] != 5
235       || sb[1] != 1LL << (16 + 4)
236       || sb[2] != 1LL << 8
237       || sb[3] != 6
238       || tb[0][0] != 9 || tb[0][1] != 10 || tb[1][0] != 11 || tb[1][1] != 12
239       || tb[2][0] != 1LL << (16 + 8)
240       || tb[2][1] != 1LL << 4
241       || tb[3][0] != 1LL << 8
242       || tb[3][1] != 1LL << (16 + 4)
243       || tb[4][0] != 13 || tb[4][1] != 14)
244     abort ();
248 main ()
250   int n = 1;
251   test (n);
252   return 0;