56 lines
1.0 KiB
C
56 lines
1.0 KiB
C
|
/* { dg-do run } */
|
||
|
|
||
|
int x, *p = &x;
|
||
|
extern void abort (void);
|
||
|
void
|
||
|
f1 (int *q)
|
||
|
{
|
||
|
*q = 1;
|
||
|
#pragma omp flush
|
||
|
/* x, p, and *q are flushed */
|
||
|
/* because they are shared and accessible */
|
||
|
/* q is not flushed because it is not shared. */
|
||
|
}
|
||
|
|
||
|
void
|
||
|
f2 (int *q)
|
||
|
{
|
||
|
#pragma omp barrier
|
||
|
*q = 2;
|
||
|
#pragma omp barrier
|
||
|
/* a barrier implies a flush */
|
||
|
/* x, p, and *q are flushed */
|
||
|
/* because they are shared and accessible */
|
||
|
/* q is not flushed because it is not shared. */
|
||
|
}
|
||
|
|
||
|
int
|
||
|
g (int n)
|
||
|
{
|
||
|
int i = 1, j, sum = 0;
|
||
|
*p = 1;
|
||
|
#pragma omp parallel reduction(+: sum) num_threads(2)
|
||
|
{
|
||
|
f1 (&j);
|
||
|
/* i, n and sum were not flushed */
|
||
|
/* because they were not accessible in f1 */
|
||
|
/* j was flushed because it was accessible */
|
||
|
sum += j;
|
||
|
f2 (&j);
|
||
|
/* i, n, and sum were not flushed */
|
||
|
/* because they were not accessible in f2 */
|
||
|
/* j was flushed because it was accessible */
|
||
|
sum += i + j + *p + n;
|
||
|
}
|
||
|
return sum;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
main ()
|
||
|
{
|
||
|
int result = g (10);
|
||
|
if (result != 30)
|
||
|
abort ();
|
||
|
return 0;
|
||
|
}
|