aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.c-c++-common/lastprivate-conditional-3.c
blob: 6c4370abaa31f1d187a947e65f7236567902cbc4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/* { dg-do run } */
/* { dg-require-effective-target tls_runtime } */
/* { dg-additional-options "-std=gnu99" {target c } } */

#include <omp.h>
#include <stdlib.h>

int r, s, u, v, t;
int *x;

void
foo (int *a)
{
  int i;
  long long j;
  #pragma omp for lastprivate (conditional: u, x) ordered
  for (i = 15; i < 64; i++)
    {
      #pragma omp critical
      {
	if ((a[i] % 5) == 3)
	  u = i;
      }
      #pragma omp ordered
      {
	if ((a[i] % 7) == 2)
	  x = &a[i];
      }
    }
  #pragma omp for lastprivate (conditional: v) reduction (+:r, s) schedule (nonmonotonic: static) reduction (task, +: t)
  for (i = -3; i < 119; i += 2)
    {
      ++s;
      #pragma omp taskgroup
      {
	#pragma omp task in_reduction (+: t)
	  ++t;
	if ((a[i + 4] % 11) == 9)
	  v = i;
	else
	  ++r;
      }
    }
}

int
main ()
{
  int a[128], i;
  for (i = 0; i < 128; i++)
    a[i] = i;
  #pragma omp parallel
  foo (a);
  if (u != 63 || v != 115 || x != &a[58] || r != 55 || s != 61 || t != 61)
    abort ();
  return 0;
}