(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
taskloop-2.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O2" } */
       3  /* { dg-additional-options "-std=c99" { target c } } */
       4  /* { dg-additional-options "-msse2" { target sse2_runtime } } */
       5  /* { dg-additional-options "-mavx" { target avx_runtime } } */
       6  
       7  int u[1024], v[1024], w[1024], m;
       8  
       9  __attribute__((noinline, noclone)) void
      10  f1 (long a, long b)
      11  {
      12    #pragma omp taskloop simd default(none) shared(u, v, w) nogroup
      13    for (long d = a; d < b; d++)
      14      u[d] = v[d] + w[d];
      15  }
      16  
      17  __attribute__((noinline, noclone)) int
      18  f2 (long a, long b, long c)
      19  {
      20    int d, e;
      21    #pragma omp taskloop simd default(none) shared(u, v, w) linear(d:1) linear(c:5) lastprivate(e)
      22    for (d = a; d < b; d++)
      23      {
      24        u[d] = v[d] + w[d];
      25        c = c + 5;
      26        e = c + 9;
      27      }
      28    return d + c + e;
      29  }
      30  
      31  __attribute__((noinline, noclone)) int
      32  f3 (long a, long b)
      33  {
      34    int d;
      35    #pragma omp taskloop simd default(none) shared(u, v, w)
      36    for (d = a; d < b; d++)
      37      {
      38        int *p = &d;
      39        u[d] = v[d] + w[d];
      40      }
      41    return d;
      42  }
      43  
      44  __attribute__((noinline, noclone)) int
      45  f4 (long a, long b, long c, long d)
      46  {
      47    int e, f, g;
      48    #pragma omp taskloop simd default(none) shared(u, v, w) collapse(2) lastprivate(g)
      49    for (e = a; e < b; e++)
      50      for (f = c; f < d; f++)
      51        {
      52  	int *p = &e;
      53  	int *q = &f;
      54  	int r = 32 * e + f;
      55  	u[r] = v[r] + w[r];
      56  	g = r;
      57        }
      58    return e + f + g;
      59  }
      60  
      61  __attribute__((noinline, noclone)) int
      62  f5 (long a, long b, long c, long d)
      63  {
      64    int e, f;
      65    #pragma omp taskloop simd default(none) shared(u, v, w) collapse(2)
      66    for (e = a; e < b; e++)
      67      for (f = c; f < d; f++)
      68        {
      69  	int r = 32 * e + f;
      70  	u[r] = v[r] + w[r];
      71        }
      72    return e + f;
      73  }
      74  
      75  int
      76  main ()
      77  {
      78    int i;
      79    for (i = 0; i < 1024; i++)
      80      {
      81        v[i] = i;
      82        w[i] = i + 1;
      83      }
      84    #pragma omp parallel
      85      #pragma omp single
      86        f1 (0, 1024);
      87    for (i = 0; i < 1024; i++)
      88      if (u[i] != 2 * i + 1)
      89        __builtin_abort ();
      90      else
      91        {
      92  	v[i] = 1024 - i;
      93  	w[i] = 512 - i;
      94        }
      95    #pragma omp parallel
      96      #pragma omp single
      97        m = f2 (2, 1022, 17);
      98    for (i = 0; i < 1024; i++)
      99      if ((i < 2 || i >= 1022) ? u[i] != 2 * i + 1 : u[i] != 1536 - 2 * i)
     100        __builtin_abort ();
     101      else
     102        {
     103  	v[i] = i;
     104  	w[i] = i + 1;
     105        }
     106    if (m != 1022 + 2 * (1020 * 5 + 17) + 9)
     107      __builtin_abort ();
     108    #pragma omp parallel
     109      #pragma omp single
     110        m = f3 (0, 1024);
     111    for (i = 0; i < 1024; i++)
     112      if (u[i] != 2 * i + 1)
     113        __builtin_abort ();
     114      else
     115        {
     116  	v[i] = 1024 - i;
     117  	w[i] = 512 - i;
     118        }
     119    if (m != 1024)
     120      __builtin_abort ();
     121    #pragma omp parallel
     122      #pragma omp single
     123        m = f4 (0, 32, 0, 32);
     124    for (i = 0; i < 1024; i++)
     125      if (u[i] != 1536 - 2 * i)
     126        __builtin_abort ();
     127      else
     128        {
     129  	v[i] = i;
     130  	w[i] = i + 1;
     131        }
     132    if (m != 32 + 32 + 1023)
     133      __builtin_abort ();
     134    #pragma omp parallel
     135      #pragma omp single
     136        m = f5 (0, 32, 0, 32);
     137    for (i = 0; i < 1024; i++)
     138      if (u[i] != 2 * i + 1)
     139        __builtin_abort ();
     140      else
     141        {
     142  	v[i] = 1024 - i;
     143  	w[i] = 512 - i;
     144        }
     145    if (m != 32 + 32)
     146      __builtin_abort ();
     147    return 0;
     148  }