1/* { dg-do run } */ 2/* { dg-options "-O2" } */ 3/* { dg-additional-options "-msse2" { target sse2_runtime } } */ 4/* { dg-additional-options "-mavx" { target avx_runtime } } */ 5 6extern void abort (); 7int a[1024] __attribute__((aligned (32))) = { 1 }; 8int b[1024] __attribute__((aligned (32))) = { 1 }; 9int k, m; 10struct U { int u; }; 11struct V { int v; }; 12 13__attribute__((noinline, noclone)) int 14foo (int *p) 15{ 16 int i, s = 0; 17 struct U u; 18 struct V v; 19 #pragma omp simd aligned(a, p : 32) linear(k: m + 1) \ 20 linear(i) reduction(+:s) lastprivate(u, v) 21 for (i = 0; i < 1024; i++) 22 { 23 int *q = &i; 24 a[i] *= p[i]; 25 u.u = p[i] + k; 26 k += m + 1; 27 v.v = p[i] + k; 28 s += p[i] + k; 29 } 30 if (u.u != 36 + 4 + 3 * 1023 || v.v != 36 + 4 + 3 * 1024 || i != 1024) 31 abort (); 32 return s; 33} 34 35__attribute__((noinline, noclone)) int 36bar (int *p) 37{ 38 int i, s = 0; 39 struct U u; 40 struct V v; 41 #pragma omp simd aligned(a, p : 32) linear(k: m + 1) \ 42 reduction(+:s) lastprivate(u, v) 43 for (i = 0; i < 1024; i++) 44 { 45 int *q = &i; 46 a[i] *= p[i]; 47 u.u = p[i] + k; 48 k += m + 1; 49 v.v = p[i] + k; 50 s += p[i] + k; 51 } 52 if (u.u != 36 + 4 + 3 * 1023 || v.v != 36 + 4 + 3 * 1024 || i != 1024) 53 abort (); 54 return s; 55} 56 57int 58main () 59{ 60#if __SIZEOF_INT__ >= 4 61 int i; 62 k = 4; 63 m = 2; 64 for (i = 0; i < 1024; i++) 65 { 66 a[i] = i - 512; 67 b[i] = (i - 51) % 39; 68 } 69 int s = foo (b); 70 for (i = 0; i < 1024; i++) 71 { 72 if (b[i] != (i - 51) % 39 73 || a[i] != (i - 512) * b[i]) 74 abort (); 75 } 76 if (k != 4 + 3 * 1024 || s != 1596127) 77 abort (); 78 k = 4; 79 m = 2; 80 for (i = 0; i < 1024; i++) 81 { 82 a[i] = i - 512; 83 b[i] = (i - 51) % 39; 84 } 85 s = bar (b); 86 for (i = 0; i < 1024; i++) 87 { 88 if (b[i] != (i - 51) % 39 89 || a[i] != (i - 512) * b[i]) 90 abort (); 91 } 92 if (k != 4 + 3 * 1024 || s != 1596127) 93 abort (); 94#endif 95 return 0; 96} 97