aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.c-c++-common/for-13.c
blob: a4767278fbb1cca3183cc6664780566c2a68e108 (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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
unsigned short a[256];

__attribute__((noinline, noclone)) void
bar (void *x, unsigned short z)
{
  unsigned short *y = (unsigned short *) x;
  if (y < &a[5] || y > &a[222] || y == &a[124])
    __builtin_abort ();
  *y += z;
}

__attribute__((noinline, noclone)) void
foo (void *qx, void *rx, void *sx, int n)
{
  unsigned short (*q)[n], (*r)[n], (*s)[n], (*p)[n];
  q = (typeof (q)) qx;
  r = (typeof (r)) rx;
  s = (typeof (s)) sx;
  #pragma omp for
  for (p = q; p != r; p++)
    bar (p, 1);
  #pragma omp for
  for (p = s; p != r; p--)
    bar (p, 2);
  #pragma omp for
  for (p = q; p != r; p = p + 1)
    bar (p, 4);
  #pragma omp for
  for (p = s; p != r; p = p - 1)
    bar (p, 8);
  #pragma omp for
  for (p = q; p != r; p = 1 + p)
    bar (p, 16);
  #pragma omp for
  for (p = s; p != r; p = -1 + p)
    bar (p, 32);
  #pragma omp for
  for (p = q; p != r; p += 1)
    bar (p, 64);
  #pragma omp for
  for (p = s; p != r; p -= 1)
    bar (p, 128);
}

__attribute__((noinline, noclone)) void
baz (void *qx, void *rx, void *sx, int n)
{
  unsigned short (*q)[n], (*r)[n], (*s)[n], (*p)[n];
  q = (typeof (q)) qx;
  r = (typeof (r)) rx;
  s = (typeof (s)) sx;
  #pragma omp for
  for (p = q; p < r; p++)
    bar (p, 256);
  #pragma omp for
  for (p = s; p > r; p--)
    bar (p, 512);
  #pragma omp for
  for (p = q; p < r; p = p + 1)
    bar (p, 1024);
  #pragma omp for
  for (p = s; p > r; p = p - 1)
    bar (p, 2048);
  #pragma omp for
  for (p = q; p < r; p = 1 + p)
    bar (p, 4096);
  #pragma omp for
  for (p = s; p > r; p = -1 + p)
    bar (p, 8192);
  #pragma omp for
  for (p = q; p < r; p += 1)
    bar (p, 16384);
  #pragma omp for
  for (p = s; p > r; p -= 1)
    bar (p, 32768U);
}

int
main ()
{
  int i;
  volatile int j = 7;
#pragma omp parallel
  {
    foo (&a[5 + (j - 7)], &a[124 + (j - 7)], &a[222 + (j - 7)], j);
    baz (&a[5 + (j - 7)], &a[124 + (j - 7)], &a[222 + (j - 7)], j);
  }
  for (i = 0; i < 256; i++)
    if (i < 5 || i > 222 || i == 124 || ((i - 5) % 7) != 0)
      {
	if (a[i])
	  __builtin_abort ();
      }
    else if (i < 124 && a[i] != 1 + 4 + 16 + 64 + 256 + 1024 + 4096 + 16384)
      __builtin_abort ();
    else if (i > 124 && a[i] != 2 + 8 + 32 + 128 + 512 + 2048 + 8192 + 32768U)
      __builtin_abort ();
  return 0;
}