(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
taskloop-4.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O2" } */
       3  
       4  int u[64], v;
       5  
       6  __attribute__((noinline, noclone)) int
       7  test (int a, int b, int c, int d, void (*fn) (int, int, int, int),
       8        int *num_tasks, int *min_iters, int *max_iters)
       9  {
      10    int i, t = 0;
      11    __builtin_memset (u, 0, sizeof u);
      12    v = 0;
      13    fn (a, b, c, d);
      14    *min_iters = 0;
      15    *max_iters = 0;
      16    *num_tasks = v;
      17    if (v)
      18      {
      19        *min_iters = u[0];
      20        *max_iters = u[0];
      21        t = u[0];
      22        for (i = 1; i < v; i++)
      23  	{
      24  	  if (*min_iters > u[i])
      25  	    *min_iters = u[i];
      26  	  if (*max_iters < u[i])
      27  	    *max_iters = u[i];
      28  	  t += u[i];
      29  	}
      30      }
      31    return t;
      32  }
      33  
      34  void
      35  grainsize (int a, int b, int c, int d)
      36  {
      37    int i, j = 0, k = 0;
      38    #pragma omp taskloop firstprivate (j, k) grainsize(d)
      39    for (i = a; i < b; i += c)
      40      {
      41        if (j == 0)
      42  	{
      43  	  #pragma omp atomic capture
      44  	    k = v++;
      45  	  if (k >= 64)
      46  	    __builtin_abort ();
      47  	}
      48        u[k] = ++j;
      49      }
      50  }
      51  
      52  void
      53  num_tasks (int a, int b, int c, int d)
      54  {
      55    int i, j = 0, k = 0;
      56    #pragma omp taskloop firstprivate (j, k) num_tasks(d)
      57    for (i = a; i < b; i += c)
      58      {
      59        if (j == 0)
      60  	{
      61  	  #pragma omp atomic capture
      62  	    k = v++;
      63  	  if (k >= 64)
      64  	    __builtin_abort ();
      65  	}
      66        u[k] = ++j;
      67      }
      68  }
      69  
      70  int
      71  main ()
      72  {
      73    #pragma omp parallel
      74      #pragma omp single
      75        {
      76  	int min_iters, max_iters, ntasks;
      77  	/* If grainsize is present, # of task loop iters is >= grainsize && < 2 * grainsize,
      78  	   unless # of loop iterations is smaller than grainsize.  */
      79  	if (test (0, 79, 1, 17, grainsize, &ntasks, &min_iters, &max_iters) != 79
      80  	    || min_iters < 17 || max_iters >= 17 * 2)
      81  	  __builtin_abort ();
      82  	if (test (-49, 2541, 7, 28, grainsize, &ntasks, &min_iters, &max_iters) != 370
      83  	    || min_iters < 28 || max_iters >= 28 * 2)
      84  	  __builtin_abort ();
      85  	if (test (7, 21, 2, 15, grainsize, &ntasks, &min_iters, &max_iters) != 7
      86  	    || ntasks != 1 || min_iters != 7 || max_iters != 7)
      87  	  __builtin_abort ();
      88  	/* If num_tasks is present, # of tasks is min (# of loop iters, num_tasks)
      89  	   and each task has at least one iteration.  */
      90  	if (test (-51, 2500, 48, 9, num_tasks, &ntasks, &min_iters, &max_iters) != 54
      91  	    || ntasks != 9)
      92  	  __builtin_abort ();
      93  	if (test (0, 25, 2, 17, num_tasks, &ntasks, &min_iters, &max_iters) != 13
      94  	    || ntasks != 13)
      95  	  __builtin_abort ();
      96        }
      97    return 0;
      98  }