1/* complex reductions.  */
2
3#define vl 32
4
5int
6main(void)
7{
8  const int n = 1000;
9  int i;
10  __complex__ double result, array[n];
11  int lresult;
12
13  /* '+' reductions.  */
14#pragma acc parallel vector_length (vl)
15#pragma acc loop reduction (+:result)
16  for (i = 0; i < n; i++)
17    result += array[i];
18
19  /* Needs support for complex multiplication.  */
20
21//   /* '*' reductions.  */
22// #pragma acc parallel vector_length (vl)
23// #pragma acc loop reduction (*:result)
24//   for (i = 0; i < n; i++)
25//     result *= array[i];
26//
27//   /* 'max' reductions.  */
28// #pragma acc parallel vector_length (vl)
29// #pragma acc loop reduction (+:result)
30//   for (i = 0; i < n; i++)
31//       result = result > array[i] ? result : array[i];
32//
33//   /* 'min' reductions.  */
34// #pragma acc parallel vector_length (vl)
35// #pragma acc loop reduction (+:result)
36//   for (i = 0; i < n; i++)
37//       result = result < array[i] ? result : array[i];
38
39  /* '&&' reductions.  */
40#pragma acc parallel vector_length (vl)
41#pragma acc loop reduction (&&:lresult)
42  for (i = 0; i < n; i++)
43    lresult = lresult && (__real__(result) > __real__(array[i]));
44
45  /* '||' reductions.  */
46#pragma acc parallel vector_length (vl)
47#pragma acc loop reduction (||:lresult)
48  for (i = 0; i < n; i++)
49    lresult = lresult || (__real__(result) > __real__(array[i]));
50
51  return 0;
52}
53