3 struct C
{ unsigned long long t
; };
6 add (struct B
*x
, struct B
*y
)
16 orit (struct C
*x
, struct C
*y
)
20 #pragma omp declare reduction(+:struct A:omp_out.t += omp_in.t)
21 #pragma omp declare reduction(+:struct B:add (&omp_out, &omp_in)) initializer(zero (&omp_priv))
22 #pragma omp declare reduction(*:struct A:omp_out.t *= omp_in.t) initializer(omp_priv = { 1 })
23 #pragma omp declare reduction(|:struct C:orit (&omp_in, &omp_out))
24 #pragma omp declare reduction(&:struct D:omp_out.t = omp_out.t & omp_in.t) initializer(omp_priv = { ~0L })
25 #pragma omp declare reduction(maxb:short:omp_out = omp_in > omp_out ? omp_in : omp_out) initializer(omp_priv = -6)
29 __attribute__((noinline
, noclone
)) void
30 foo (struct A (*x
)[3][2], struct A
*y
, struct D w
[1][2])
35 #pragma omp parallel for reduction(+:x[0:2][:][0:2], z[:4]) \
36 reduction(*:y[:3]) reduction(|:a[:4]) \
37 reduction(&:w[0:1][:2]) reduction(maxb:b)
38 for (i
= 0; i
< 128; i
++)
40 x
[i
/ 64][i
% 3][(i
/ 4) & 1].t
+= i
;
47 z
[i
/ 32].t
+= (i
& 3);
50 a
[i
/ 32].t
|= 1ULL << (i
& 30);
51 w
[0][i
& 1].t
&= ~(1L << (i
/ 17 * 3));
63 for (i
= 0; i
< 9; i
++)
64 if (a
[i
].t
!= (i
< 4 ? 0x55555555ULL
: 0))
66 if (b
[0] != 78 || b
[1] != 12 || b
[2] != 22 || b
[3] != 84 || b
[4] != 127)
73 struct A a
[4][3][2] = {};
74 static int a2
[4][3][2] = {{{ 0, 0 }, { 0, 0 }, { 0, 0 }},
75 {{ 312, 381 }, { 295, 356 }, { 337, 335 }},
76 {{ 1041, 975 }, { 1016, 1085 }, { 935, 1060 }},
77 {{ 0, 0 }, { 0, 0 }, { 0, 0 }}};
78 struct A y
[5] = { { 0 }, { 1 }, { 1 }, { 1 }, { 0 } };
79 int y2
[5] = { 0, 6561, 2401, 289, 0 };
80 char z2
[10] = { 48, 49, 50, 51, 0, 0, 0, 0, 0, 0 };
81 struct D w
[1][2] = { { { ~0L }, { ~0L } } };
82 foo (&a
[1], y
+ 1, w
);
84 for (i
= 0; i
< 4; i
++)
85 for (j
= 0; j
< 3; j
++)
86 for (k
= 0; k
< 2; k
++)
87 if (a
[i
][j
][k
].t
!= a2
[i
][j
][k
])
89 for (i
= 0; i
< 5; i
++)
92 for (i
= 0; i
< 10; i
++)
95 if (w
[0][0].t
!= ~0x249249L
|| w
[0][1].t
!= ~0x249249L
)