0
|
1 /* { dg-do run } */
|
|
2
|
|
3 int x, *p = &x;
|
|
4 extern void abort (void);
|
|
5 void
|
|
6 f1 (int *q)
|
|
7 {
|
|
8 *q = 1;
|
|
9 #pragma omp flush
|
|
10 /* x, p, and *q are flushed */
|
|
11 /* because they are shared and accessible */
|
|
12 /* q is not flushed because it is not shared. */
|
|
13 }
|
|
14
|
|
15 void
|
|
16 f2 (int *q)
|
|
17 {
|
|
18 #pragma omp barrier
|
|
19 *q = 2;
|
|
20 #pragma omp barrier
|
|
21 /* a barrier implies a flush */
|
|
22 /* x, p, and *q are flushed */
|
|
23 /* because they are shared and accessible */
|
|
24 /* q is not flushed because it is not shared. */
|
|
25 }
|
|
26
|
|
27 int
|
|
28 g (int n)
|
|
29 {
|
|
30 int i = 1, j, sum = 0;
|
|
31 *p = 1;
|
|
32 #pragma omp parallel reduction(+: sum) num_threads(2)
|
|
33 {
|
|
34 f1 (&j);
|
|
35 /* i, n and sum were not flushed */
|
|
36 /* because they were not accessible in f1 */
|
|
37 /* j was flushed because it was accessible */
|
|
38 sum += j;
|
|
39 f2 (&j);
|
|
40 /* i, n, and sum were not flushed */
|
|
41 /* because they were not accessible in f2 */
|
|
42 /* j was flushed because it was accessible */
|
|
43 sum += i + j + *p + n;
|
|
44 }
|
|
45 return sum;
|
|
46 }
|
|
47
|
|
48 int
|
|
49 main ()
|
|
50 {
|
|
51 int result = g (10);
|
|
52 if (result != 30)
|
|
53 abort ();
|
|
54 return 0;
|
|
55 }
|