| // PR middle-end/66702 |
| // { dg-options "-O2" } |
| // { dg-additional-options "-msse2" { target sse2_runtime } } |
| // { dg-additional-options "-mavx" { target avx_runtime } } |
| |
| void |
| bar (int &a, int &b, int *&c, int &d) |
| { |
| volatile int x; |
| int *volatile y; |
| x = a; a = x; |
| x = b; b = x; |
| y = c; c = y; |
| x = d; d = x; |
| } |
| |
| void (*volatile barp) (int &, int &, int *&, int &) = bar; |
| |
| #pragma omp declare simd uniform(b, c) linear(d:2) aligned(c:32) notinbranch |
| int |
| foo (int a, int b, int *c, int d) |
| { |
| a++; |
| b++; |
| c += 8; |
| d += 2; |
| barp (a, b, c, d); |
| return a + b + *c + d; |
| } |
| |
| volatile int e = 5; |
| int c[64] __attribute__((aligned (32))); |
| |
| int |
| main () |
| { |
| int d = 7, r = 0; |
| int b = e; |
| for (int i = 0; i < 64; i++) |
| c[i] = i; |
| #pragma omp simd reduction(+:r) linear(d:2) |
| for (int i = 0; i < 64; i++) |
| { |
| r += foo (i, b, c, d); |
| d += 2; |
| } |
| if (r != 7584) |
| __builtin_abort (); |
| } |