1 /* PR middle-end/95315 */
2 /* { dg-do compile } */
3 /* { dg-options "-O2 -fopenmp --param ggc-min-heapsize=0" } */
4
5 typedef float __v4sf __attribute__((vector_size (16)));
6 typedef int __v4si __attribute__((vector_size (16)));
7 typedef float __v8sf __attribute__((vector_size (32)));
8 typedef int __v8si __attribute__((vector_size (32)));
9 __v4si f1 (__v4sf, __v4sf, float *);
10 __v8si f2 (__v8sf, __v8sf, float *);
11 __v4si f3 (__v4si, int, __v4si);
12
13 #pragma omp declare variant (f1) match (construct={parallel,for,simd(simdlen(4),notinbranch,uniform(z),aligned(z:4 * sizeof (*z)))})
14 #pragma omp declare variant (f2) match (construct={for,simd(uniform(z),simdlen(8),notinbranch)})
15 int f4 (float x, float y, float *z);
16
17 #pragma omp declare variant (f3) match (construct={simd(simdlen(4),inbranch,linear(y:1))})
18 int f5 (int x, int y);
19
20 static inline __attribute__((always_inline)) int
21 ret_false (void)
22 {
23 return 0;
24 }
25
26 void
27 test (int *x, float *y, float *z, float *w)
28 {
29 #pragma omp parallel
30 #pragma omp for simd aligned (w:4 * sizeof (float))
31 for (int i = 0; i < 1024; i++)
32 if (ret_false ())
33 x[i] = f4 (y[i], z[i], w);
34 #pragma omp parallel for simd aligned (w:4 * sizeof (float)) simdlen(4)
35 for (int i = 1024; i < 2048; i++)
36 if (ret_false ())
37 x[i] = f4 (y[i], z[i], w);
38 #pragma omp simd aligned (w:4 * sizeof (float))
39 for (int i = 2048; i < 4096; i++)
40 if (ret_false ())
41 x[i] = f4 (y[i], z[i], w);
42 #pragma omp simd
43 for (int i = 4096; i < 8192; i++)
44 if (x[i] > 10 && ret_false ())
45 x[i] = f5 (x[i], i);
46 }