1 /* PR c/59984 */
2 /* { dg-require-effective-target vect_simd_clones } */
3 /* { dg-additional-options "-fopenmp-simd" } */
4
5 #include "tree-vect.h"
6
7 #define N 128
8
9 int a[N];
10
11 #pragma omp declare simd
12 __attribute__((noinline)) void
13 foo (int in, int *out1, int *out2)
14 {
15 *out1 = in * in - 1;
16 *out2 = in * in + 1;
17 }
18
19 #pragma omp declare simd linear (out1, out2)
20 __attribute__((noinline)) void
21 bar (int in, int *out1, int *out2)
22 {
23 *out1 = in * in - 1;
24 *out2 = in * in + 1;
25 }
26
27 __attribute__((noinline)) void
28 test (void)
29 {
30 int i;
31 for (i = 0; i < N; i++)
32 a[i] = i;
33 #pragma omp simd
34 for (i = 0; i < N; i++)
35 {
36 int v1, v2;
37 foo (a[i], &v1, &v2);
38 a[i] = v1 * v2;
39 }
40 for (i = 0; i < N; i++)
41 if (a[i] != i * i * i * i - 1)
42 __builtin_abort ();
43 for (i = 0; i < N; i++)
44 a[i] = i;
45 #pragma omp simd
46 for (i = 0; i < N; i++)
47 {
48 int v1, v2;
49 bar (a[i], &v1, &v2);
50 a[i] = v1 * v2;
51 }
52 for (i = 0; i < N; i++)
53 if (a[i] != i * i * i * i - 1)
54 __builtin_abort ();
55 }
56
57 int
58 main ()
59 {
60 check_vect ();
61 test ();
62 return 0;
63 }
64