1 // PR middle-end/66702
2 // { dg-do run { target vect_simd_clones } }
3 // { dg-options "-O2" }
4 // { dg-additional-options "-msse2" { target sse2_runtime } }
5 // { dg-additional-options "-mavx" { target avx_runtime } }
6
7 void
bar(int & a,int & b,int * & c,int & d)8 bar (int &a, int &b, int *&c, int &d)
9 {
10 volatile int x;
11 int *volatile y;
12 x = a; a = x;
13 x = b; b = x;
14 y = c; c = y;
15 x = d; d = x;
16 }
17
18 void (*volatile barp) (int &, int &, int *&, int &) = bar;
19
20 #pragma omp declare simd uniform(b, c) linear(d:2) aligned(c:32) notinbranch
21 int
foo(int a,int b,int * c,int d)22 foo (int a, int b, int *c, int d)
23 {
24 a++;
25 b++;
26 c += 8;
27 d += 2;
28 barp (a, b, c, d);
29 return a + b + *c + d;
30 }
31
32 volatile int e = 5;
33 int c[64] __attribute__((aligned (32)));
34
35 int
main()36 main ()
37 {
38 int d = 7, r = 0;
39 int b = e;
40 for (int i = 0; i < 64; i++)
41 c[i] = i;
42 #pragma omp simd reduction(+:r) linear(d:2)
43 for (int i = 0; i < 64; i++)
44 {
45 r += foo (i, b, c, d);
46 d += 2;
47 }
48 if (r != 7584)
49 __builtin_abort ();
50 }
51