1 int
2 main ()
3 {
4 int a, b, c = 0;
5 #pragma omp parallel num_threads(2)
6 {
7 #pragma omp barrier
8 #pragma omp single
9 {
10 #pragma omp task depend(out: a)
11 {
12 int i;
13 a = 0;
14 for (i = 0; i < 524288; ++i)
15 {
16 asm volatile ("" : "+g" (a));
17 a++;
18 }
19 }
20 #pragma omp task depend(out: b)
21 {
22 int i;
23 b = 0;
24 for (i = 0; i < 64; ++i)
25 {
26 asm volatile ("" : "+g" (b));
27 b++;
28 }
29 }
30 #pragma omp task depend(in: a) depend(mutexinoutset: c)
31 {
32 int i;
33 int d = c;
34 for (i = 0; i < 524288 + 64 - a; ++i)
35 {
36 asm volatile ("" : "+g" (d) : "g" (&a) : "memory");
37 d++;
38 }
39 asm volatile ("" : "+g" (d), "+g" (c));
40 c = d;
41 }
42 #pragma omp task depend(in: b) depend(mutexinoutset: c)
43 {
44 int i;
45 int d = c;
46 for (i = 0; i < 524288 + 64 - b; ++i)
47 {
48 asm volatile ("" : "+g" (d) : "g" (&b) : "memory");
49 d++;
50 }
51 asm volatile ("" : "+g" (d), "+g" (c));
52 c = d;
53 }
54 }
55 }
56 if (c != 524288 + 64)
57 __builtin_abort ();
58 return 0;
59 }