(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
simd-1.c
       1  // { dg-do run }
       2  // { dg-additional-options "-msse2" { target sse2_runtime } }
       3  // { dg-additional-options "-mavx" { target avx_runtime } }
       4  
       5  #define N 1024
       6  int a[N], b[N];
       7  
       8  int
       9  f1 (void)
      10  {
      11    int i;
      12    #pragma omp simd private (i)
      13    for (i = 0; i < N; i++)
      14      a[i] = b[i] * 2;
      15    #pragma omp simd lastprivate (i)
      16    for (i = 0; i < N; i++)
      17      a[i] += b[i] * 2;
      18    return i;
      19  }
      20  
      21  int
      22  f2 (void)
      23  {
      24    int i, j;
      25    #pragma omp simd private (i), collapse (2), lastprivate (j)
      26    for (i = 0; i < 32; i++)
      27      for (j = 0; j < 32; ++j)
      28        a[i * 32 + j] += b[i * 32 + j] * 2;
      29    return j;
      30  }
      31  
      32  int
      33  f3 (void)
      34  {
      35    static int i;
      36    #pragma omp for simd private (i)
      37    for (i = 0; i < N; ++i)
      38      a[i] = b[i] * 2;
      39    #pragma omp for simd lastprivate (i)
      40    for (i = 0; i < N; ++i)
      41      a[i] += b[i] * 2;
      42    return i;
      43  }
      44  
      45  int
      46  f4 (void)
      47  {
      48    static int i, j;
      49    #pragma omp for simd private (i)collapse (2)lastprivate (j)
      50    for (i = 0; i < 32; ++i)
      51      for (j = 0; j < 32; j++)
      52        a[i * 32 + j] += b[i * 32 + j] * 2;
      53    return j;
      54  }
      55  
      56  int
      57  main ()
      58  {
      59    int i;
      60    for (i = 0; i < N; ++i)
      61      a[i] = b[i] = i;
      62    if (f1 () != 1024 || f2 () != 32)
      63      __builtin_abort ();
      64    #pragma omp parallel num_threads(4)
      65    if (f3 () != 1024 || f4 () != 32)
      66      __builtin_abort ();
      67    for (i = 0; i < N; ++i)
      68      if (a[i] != 6 * i || b[i] != i)
      69        __builtin_abort ();
      70    return 0;
      71  }