Fix xfail for 32-bit hppa*-*-* in gcc.dg/pr84877.c
[official-gcc.git] / libgomp / testsuite / libgomp.c++ / depend-iterator-1.C
blob2cff5e84334f2e2bae6aa8f0f9aabb499d274a31
1 extern "C" void abort ();
2 int arr[64], arr2[64], arr3[64];
4 int *
5 foo (int x, int y, long z)
7   int v;
8   switch (x)
9     {
10     case 1:
11       if (z != 0 || y < 0 || y >= 64)
12         abort ();
13       #pragma omp atomic capture
14       {
15         v = arr2[y];
16         arr2[y]++;
17       }
18       if (v != 0) abort ();
19       return &arr[y];
20     case 2:
21       if (y < 0 || y > 60 || (y & 3) || z < 0 || z >= 4)
22         abort ();
23       #pragma omp atomic
24       arr2[y + z] = arr2[y + z] + 4;
25       return &arr[y + z];
26     case 3:
27       if (z < 0 || z > 60 || (z & 3) || y < 0 || y >= 4)
28         abort ();
29       #pragma omp atomic
30       arr2[y + z] = arr2[y + z] + 16;
31       return &arr[y + z];
32     case 4:
33       if (y != 0 || z > 64 || z <= 0)
34         abort ();
35       #pragma omp atomic
36       arr2[z - 1] = arr2[z - 1] + 64;
37       return &arr[z - 1];
38     case 5:
39       if ((y & 3) != 0 || y < 64 || y >= 96
40           || (z & 127) != 0 || z < 512 || z >= 1024)
41         abort ();
42       y = (y - 64) + (z - 512) / 128;
43       #pragma omp atomic
44       arr2[y] = arr2[y] + 256;
45       return &arr[y];
46     case 6:
47       if ((y & 3) != 0 || y <= 64 || y > 96
48           || (z & 127) != 1 || z <= 513 || z > 1025)
49         abort ();
50       y = (y - 68) + (z - 641) / 128;
51       #pragma omp atomic
52       arr2[y] = arr2[y] + 1024;
53       return &arr[y];
54     default:
55       abort ();
56     }
59 volatile int beg, end, step, step2;
60 volatile unsigned int begu, endu;
62 template <int N>
63 void
64 bar ()
66   #pragma omp parallel
67   #pragma omp master
68   {
69     int i;
70     for (i = 0; i < 64; i++)
71       #pragma omp task depend (iterator (j=i:i+1) , out : foo (1, j, 0)[0])
72         arr[i] = i;
73     #pragma omp task depend (iterator (int k=beg:end:step,long int l=0:4:1) , inout : \
74                              foo (2, k, l)[0], foo (3, l, k)[0]) private (i)
75     for (i = 0; i < 64; i++)
76       if (arr[i] != i)
77         abort ();
78       else
79         arr[i] = arr[i] + 1;
80     #pragma omp task depend (iterator (int *p=&arr3[64]:&arr3[0]:-1), inout : \
81                              foo (4, 0, p - &arr3[0])[0]) depend (in : beg)
82     for (i = 0; i < 64; i++)
83       if (arr[i] != i + 1)
84         abort ();
85       else
86         arr[i] = arr[i] + 2;
87     #pragma omp task depend (iterator (unsigned n=begu:endu:step2, unsigned int o = 512: 1024U: (unsigned char) 128), inout : \
88                              foo (5, n + 128, o)[0])
89     for (i = 0; i < 64; i++)
90       if (arr[i] != i + 3)
91         abort ();
92       else
93         arr[i] = arr[i] + 4;
94     #pragma omp task depend (iterator (int unsigned p=endu:begu:step,unsigned q= 1025U:513U:(signed char) -128), in : \
95                              foo (6, p + 128, q)[0])
96     for (i = 0; i < 64; i++)
97       if (arr[i] != i + 7)
98         abort ();
99       else
100         arr[i] = arr[i] + 8;
101   }
104 template <typename A, typename B, typename C, typename D, typename E, typename F>
105 void
106 baz (A beg, A end, A step, D begu, D endu, A step2)
108   #pragma omp parallel
109   #pragma omp master
110   {
111     int i;
112     for (i = 0; i < 64; i++)
113       #pragma omp task depend (iterator (A j=i:i+1),out : foo (1, j, 0)[0])
114         arr[i] = i;
115     #pragma omp task depend (iterator (A k=beg:end:step,B l=0:4:1), inout : \
116                              foo (2, k, l)[0], foo (3, l, k)[0]) private (i)
117     for (i = 0; i < 64; i++)
118       if (arr[i] != i)
119         abort ();
120       else
121         arr[i] = arr[i] + 1;
122     #pragma omp task depend (iterator (C p=&arr3[64]:&arr3[0]:-1), in : \
123                              foo (4, 0, p - &arr3[0])[0]) depend (in : beg)
124     for (i = 0; i < 64; i++)
125       if (arr[i] != i + 1)
126         abort ();
127       else
128         arr[i] = arr[i] + 2;
129     #pragma omp task depend (iterator (D n=begu:endu:step2, D o = 512: 1024U:(E) 128), inout : \
130                              foo (5, n + 128, o)[0])
131     for (i = 0; i < 64; i++)
132       if (arr[i] != i + 3)
133         abort ();
134       else
135         arr[i] = arr[i] + 4;
136     #pragma omp task depend (iterator (D p=endu:begu:step,D q= 1025U:513U:(F) -128), in : \
137                              foo (6, p + 128, q)[0])
138     for (i = 0; i < 64; i++)
139       if (arr[i] != i + 7)
140         abort ();
141       else
142         arr[i] = arr[i] + 8;
143   }
147 main ()
149   int m;
150   beg = 60;
151   end = -4;
152   step = -4;
153   step2 = 4;
154   begu = -64U;
155   endu = -32U;
156   bar<0> ();
157   for (m = 0; m < 64; m++)
158     if (arr[m] != m + 15 || arr2[m] != (m < 32 ? 1365 : 85))
159       abort ();
160     else
161       arr[m] = arr2[m] = 0;
162   baz<int, long int, int *, unsigned int, unsigned char, signed char> (beg, end, step, begu, endu, step2);
163   for (m = 0; m < 64; m++)
164     if (arr[m] != m + 15 || arr2[m] != (m < 32 ? 1365 : 85))
165       abort ();
166   return 0;