1 /* { dg-require-effective-target vect_simd_clones } */
2 /* { dg-additional-options "-fopenmp-simd" } */
3 /* { dg-additional-options "-mavx" { target avx_runtime } } */
4 
5 #include "tree-vect.h"
6 
7 #ifndef N
8 #define N 1024
9 #endif
10 
11 int a[N];
12 long long int b[N];
13 short c[N];
14 
15 #pragma omp declare simd
16 #pragma omp declare simd uniform(b) linear(c:3)
17 __attribute__((noinline)) short
foo(int a,long long int b,int c)18 foo (int a, long long int b, int c)
19 {
20   return a + b + c;
21 }
22 
23 __attribute__((noinline, noclone)) void
bar(int x)24 bar (int x)
25 {
26   int i;
27   if (x == 0)
28     {
29     #pragma omp simd
30       for (i = 0; i < N; i++)
31 	c[i] = foo (a[i], b[i], c[i]);
32     }
33   else
34     {
35     #pragma omp simd
36       for (i = 0; i < N; i++)
37 	c[i] = foo (a[i], x, i * 3);
38     }
39 }
40 
41 __attribute__((noinline, noclone)) void
baz(void)42 baz (void)
43 {
44   int i;
45   for (i = 0; i < N; i++)
46     {
47       a[i] = 2 * i;
48       b[i] = -7 * i + 6;
49       c[i] = (i & 31) << 4;
50     }
51 }
52 
53 int
main()54 main ()
55 {
56   int i;
57   check_vect ();
58   baz ();
59   bar (0);
60   for (i = 0; i < N; i++)
61     if (a[i] != 2 * i || b[i] != 6 - 7 * i
62 	|| c[i] != 6 - 5 * i + ((i & 31) << 4))
63       abort ();
64     else
65       a[i] = c[i];
66   bar (17);
67   for (i = 0; i < N; i++)
68     if (a[i] != 6 - 5 * i + ((i & 31) << 4)
69 	|| b[i] != 6 - 7 * i
70 	|| c[i] != 23 - 2 * i + ((i & 31) << 4))
71       abort ();
72   return 0;
73 }
74 
75