Fix xfail for 32-bit hppa*-*-* in gcc.dg/pr84877.c
[official-gcc.git] / libgomp / testsuite / libgomp.c++ / target-in-reduction-2.C
blob5da0e903b66577342c370db9de0020b3dee871e7
1 struct S { int a, b, c[2]; };
2 #pragma omp declare reduction (+: S : (omp_out.a += omp_in.a, omp_out.b += omp_in.b)) \
3   initializer (omp_priv = { 0, 0, { 0, 0 } })
5 void
6 foo (S &x, S *&y, int n, int v)
8   S zu[3] = { { 45, 47, {} }, { 46, 48, {} }, { 47, 49, {} } };
9   S uu[n], wu[n];
10   S (&z)[3] = zu;
11   S (&u)[n] = uu;
12   S (&w)[n] = wu;
13   int i;
14   for (i = 0; i < n; i++)
15     {
16       w[i].a = u[i].a = n + i;
17       w[i].b = u[i].b = n - i;
18       w[i].c[0] = u[i].c[0] = 0;
19       w[i].c[1] = u[i].c[1] = 0;
20     }
21   #pragma omp taskgroup task_reduction (+: x, y[:2], z[1:2], u, w[1:v])
22   {
23     #pragma omp task in_reduction (+: x, y[:2], z[1:2], u, w[1:v])
24     {
25       x.a++;
26       x.b++;
27       y[0].a += 2;
28       y[0].b += 12;
29       y[1].a += 3;
30       y[1].b += 13;
31       z[1].a += 4;
32       z[1].b += 14;
33       u[0].a += 5;
34       u[0].b += 15;
35       w[1].a += 6;
36       w[1].b += 16;
37     }
38     #pragma omp target in_reduction (+: x, y[:2], z[1:2], u, w[1:v])
39     {
40       x.a += 4;
41       x.b += 14;
42       y[0].a += 5;
43       y[0].b += 15;
44       y[1].a += 6;
45       y[1].b += 16;
46       z[2].a += 7;
47       z[2].b += 17;
48       u[1].a += 8;
49       u[1].b += 18;
50       w[2].a += 7;
51       w[2].b += 17;
52     }
53     #pragma omp target in_reduction (+: x, y[:v], z[1:v], u, w[1:2])
54     {
55       x.a += 9;
56       x.b += 19;
57       y[0].a += 10;
58       y[0].b += 20;
59       y[1].a += 11;
60       y[1].b += 21;
61       z[1].a += 12;
62       z[1].b += 22;
63       u[2].a += 13;
64       u[2].b += 23;
65       w[1].a += 14;
66       w[1].b += 24;
67     }
68   }
69   if (x.a != 56 || y[0].a != 60 || y[1].a != 64)
70     __builtin_abort ();
71   if (x.b != 86 || y[0].b != 100 || y[1].b != 104)
72     __builtin_abort ();
73   if (z[0].a != 45 || z[1].a != 62 || z[2].a != 54)
74     __builtin_abort ();
75   if (z[0].b != 47 || z[1].b != 84 || z[2].b != 66)
76     __builtin_abort ();
77   if (u[0].a != 8 || u[1].a != 12 || u[2].a != 18)
78     __builtin_abort ();
79   if (u[0].b != 18 || u[1].b != 20 || u[2].b != 24)
80     __builtin_abort ();
81   if (w[0].a != 3 || w[1].a != 24 || w[2].a != 12)
82     __builtin_abort ();
83   if (w[0].b != 3 || w[1].b != 42 || w[2].b != 18)
84     __builtin_abort ();
87 void
88 bar (S &x, S *&y, int n, int v)
90   S zu[3] = { { 45, 47, {} }, { 46, 48, {} }, { 47, 49, {} } };
91   S uu[n], wu[n];
92   S (&z)[3] = zu;
93   S (&u)[n] = uu;
94   S (&w)[n] = wu;
95   int i;
96   for (i = 0; i < n; i++)
97     {
98       w[i].a = u[i].a = n + i;
99       w[i].b = u[i].b = n - i;
100       w[i].c[0] = u[i].c[0] = 0;
101       w[i].c[1] = u[i].c[1] = 0;
102     }
103   #pragma omp parallel master
104   #pragma omp taskgroup task_reduction (+: x, y[:2], z[1:2], u, w[1:v])
105   {
106     #pragma omp task in_reduction (+: x, y[:2], z[1:2], u, w[1:v])
107     {
108       x.a++;
109       x.b++;
110       y[0].a += 2;
111       y[0].b += 12;
112       y[1].a += 3;
113       y[1].b += 13;
114       z[1].a += 4;
115       z[1].b += 14;
116       u[0].a += 5;
117       u[0].b += 15;
118       w[1].a += 6;
119       w[1].b += 16;
120     }
121     #pragma omp target in_reduction (+: x, y[:2], z[1:2], u, w[1:v])
122     {
123       x.a += 4;
124       x.b += 14;
125       y[0].a += 5;
126       y[0].b += 15;
127       y[1].a += 6;
128       y[1].b += 16;
129       z[2].a += 7;
130       z[2].b += 17;
131       u[1].a += 8;
132       u[1].b += 18;
133       w[2].a += 7;
134       w[2].b += 17;
135     }
136     #pragma omp target in_reduction (+: x, y[:v], z[1:v], u, w[1:2])
137     {
138       x.a += 9;
139       x.b += 19;
140       y[0].a += 10;
141       y[0].b += 20;
142       y[1].a += 11;
143       y[1].b += 21;
144       z[1].a += 12;
145       z[1].b += 22;
146       u[2].a += 13;
147       u[2].b += 23;
148       w[1].a += 14;
149       w[1].b += 24;
150     }
151   }
152   if (x.a != 56 || y[0].a != 77 || y[1].a != 84)
153     __builtin_abort ();
154   if (x.b != 86 || y[0].b != 147 || y[1].b != 154)
155     __builtin_abort ();
156   if (z[0].a != 45 || z[1].a != 62 || z[2].a != 54)
157     __builtin_abort ();
158   if (z[0].b != 47 || z[1].b != 84 || z[2].b != 66)
159     __builtin_abort ();
160   if (u[0].a != 8 || u[1].a != 12 || u[2].a != 18)
161     __builtin_abort ();
162   if (u[0].b != 18 || u[1].b != 20 || u[2].b != 24)
163     __builtin_abort ();
164   if (w[0].a != 3 || w[1].a != 24 || w[2].a != 12)
165     __builtin_abort ();
166   if (w[0].b != 3 || w[1].b != 42 || w[2].b != 18)
167     __builtin_abort ();
171 main ()
173   S x = { 42, 52 };
174   S yu[2] = { { 43, 53 }, { 44, 54 } };
175   S *y = yu;
176   #pragma omp parallel master
177   foo (x, y, 3, 2);
178   x.a = 42;
179   x.b = 52;
180   bar (x, y, 3, 2);
181   return 0;