1 /* { dg-do run } */
2 /* { dg-require-effective-target avx2 } */
3 /* { dg-options "-O3 -mavx2 -fno-common -mtune=skylake" } */
4 
5 #include "avx2-check.h"
6 
7 #define N 1024
8 float vf1[N+16], vf2[N], vf3[N];
9 int k[N];
10 
11 __attribute__((noinline, noclone)) void
foo(void)12 foo (void)
13 {
14   int i;
15   for (i = 0; i < N; i++)
16     {
17       float f;
18       if (vf3[i] < 0.0f)
19 	f = vf1[k[i]];
20       else
21 	f = 7.0f;
22       vf2[i] = f;
23     }
24 }
25 
26 static void
avx2_test(void)27 avx2_test (void)
28 {
29   int i;
30   for (i = 0; i < N + 16; i++)
31     {
32       vf1[i] = 5.5f * i;
33       if (i >= N)
34 	continue;
35       vf2[i] = 2.0f;
36       vf3[i] = (i & 1) ? i : -i - 1;
37       k[i] = (i & 1) ? ((i & 2) ? -i : N / 2 + i) : (i * 7) % N;
38       asm ("");
39     }
40   foo ();
41   for (i = 0; i < N; i++)
42     if (vf1[i] != 5.5 * i
43 	|| vf2[i] != ((i & 1) ? 7.0f : 5.5f * ((i * 7) % N))
44 	|| vf3[i] != ((i & 1) ? i : -i - 1)
45 	|| k[i] != ((i & 1) ? ((i & 2) ? -i : N / 2 + i) : ((i * 7) % N)))
46       abort ();
47 }
48