Fix xfail for 32-bit hppa*-*-* in gcc.dg/pr84877.c
[official-gcc.git] / libgomp / testsuite / libgomp.c++ / task-reduction-14.C
blob3f4e79b16c5916f502a6a6914901235ae72bdafb
1 #include <omp.h>
2 #include <stdlib.h>
4 struct A { A (); ~A (); A (const A &); static int cnt1, cnt2, cnt3; int a; };
5 int A::cnt1;
6 int A::cnt2;
7 int A::cnt3;
8 A::A () : a (0)
10   #pragma omp atomic
11   cnt1++;
13 A::A (const A &x) : a (x.a)
15   #pragma omp atomic
16   cnt2++;
18 A::~A ()
20   #pragma omp atomic
21   cnt3++;
23 #pragma omp declare reduction (+: A: omp_out.a += omp_in.a)
25 void
26 foo (int x)
28   A a, b[2];
29   int d = 1;
30   long int e[2] = { 1L, 1L };
31   int c = 0;
32   #pragma omp parallel
33   {
34     if (x && omp_get_thread_num () == 0)
35       {
36         for (int i = 0; i < 10000000; ++i)
37           asm volatile ("");
38         c = 1;
39         #pragma omp cancel parallel
40       }
41     #pragma omp for reduction (task, +: a, b) reduction (task, *: d, e)
42     for (int i = 0; i < 64; i++)
43       #pragma omp task in_reduction (+: a, b) in_reduction (*: d, e)
44       {
45         a.a++;
46         b[0].a += 2;
47         b[1].a += 3;
48         d *= ((i & 7) == 0) + 1;
49         e[0] *= ((i & 7) == 3) + 1;
50         e[1] *= ((i & 3) == 2) + 1;
51       }
52     if (x && omp_get_cancellation ())
53       abort ();
54   }
55   if (!c)
56     {
57       if (a.a != 64 || b[0].a != 128 || b[1].a != 192)
58         abort ();
59       if (d != 256 || e[0] != 256L || e[1] != 65536L)
60         abort ();
61     }
64 int
65 main ()
67   int c1 = A::cnt1, c2 = A::cnt2, c3 = A::cnt3;
68   volatile int zero = 0;
69   foo (zero);
70   if (A::cnt1 + A::cnt2 - c1 - c2 != A::cnt3 - c3)
71     abort ();