Fix xfail for 32-bit hppa*-*-* in gcc.dg/pr84877.c
[official-gcc.git] / libgomp / testsuite / libgomp.c++ / scan-3.C
blob5e83958bf77e0e89b7d0aef225a4077ffca3a61f
1 // { dg-require-effective-target size32plus }
3 extern "C" void abort ();
4 int r, a[1024], b[1024], q;
6 #pragma omp declare reduction (foo: int: omp_out += omp_in) initializer (omp_priv = 0)
8 __attribute__((noipa)) void
9 foo (int *a, int *b, int &r)
11   #pragma omp for reduction (inscan, foo:r)
12   for (int i = 0; i < 1024; i++)
13     {
14       r += a[i];
15       #pragma omp scan inclusive(r)
16       b[i] = r;
17     }
20 __attribute__((noipa)) int
21 bar (void)
23   int &s = q;
24   q = 0;
25   #pragma omp parallel
26   #pragma omp for reduction (inscan, foo:s)
27   for (int i = 0; i < 1024; i++)
28     {
29       s += 2 * a[i];
30       #pragma omp scan inclusive(s)
31       b[i] = s;
32     }
33   return s;
36 __attribute__((noipa)) void
37 baz (int *a, int *b, int &r)
39   #pragma omp parallel for reduction (inscan, foo:r)
40   for (int i = 0; i < 1024; i++)
41     {
42       r += a[i];
43       #pragma omp scan inclusive(r)
44       b[i] = r;
45     }
48 __attribute__((noipa)) int
49 qux (void)
51   int &s = q;
52   q = 0;
53   #pragma omp parallel for reduction (inscan, foo:s)
54   for (int i = 0; i < 1024; i++)
55     {
56       s += 2 * a[i];
57       #pragma omp scan inclusive(s)
58       b[i] = s;
59     }
60   return s;
63 int
64 main ()
66   int s = 0;
67   for (int i = 0; i < 1024; ++i)
68     {
69       a[i] = i;
70       b[i] = -1;
71       asm ("" : "+g" (i));
72     }
73   #pragma omp parallel
74   foo (a, b, r);
75   if (r != 1024 * 1023 / 2)
76     abort ();
77   for (int i = 0; i < 1024; ++i)
78     {
79       s += i;
80       if (b[i] != s)
81         abort ();
82       else
83         b[i] = 25;
84     }
85   if (bar () != 1024 * 1023)
86     abort ();
87   s = 0;
88   for (int i = 0; i < 1024; ++i)
89     {
90       s += 2 * i;
91       if (b[i] != s)
92         abort ();
93       else
94         b[i] = -1;
95     }
96   r = 0;
97   baz (a, b, r);
98   if (r != 1024 * 1023 / 2)
99     abort ();
100   s = 0;
101   for (int i = 0; i < 1024; ++i)
102     {
103       s += i;
104       if (b[i] != s)
105         abort ();
106       else
107         b[i] = -25;
108     }
109   if (qux () != 1024 * 1023)
110     abort ();
111   s = 0;
112   for (int i = 0; i < 1024; ++i)
113     {
114       s += 2 * i;
115       if (b[i] != s)
116         abort ();
117     }
118   return 0;