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
      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
      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  }