(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
depend-1.c
       1  #include <stdlib.h>
       2  #include <unistd.h>
       3  
       4  void
       5  test (int ifval)
       6  {
       7    int a[8], b[8], i;
       8    for (i = 0; i < 8; i++)
       9      {
      10        a[i] = i;
      11        b[i] = 2 * i;
      12      }
      13    #pragma omp parallel
      14    #pragma omp single
      15    {
      16      #pragma omp task shared(a) depend(in: a[0])
      17      {
      18        usleep (5000);
      19        a[0] = 42;
      20      }
      21      #pragma omp task shared(a) depend(out: a[1])
      22      {
      23        usleep (5000);
      24        a[1] = 43;
      25      }
      26      #pragma omp task shared(a) depend(inout: a[2])
      27      {
      28        usleep (5000);
      29        a[2] = 44;
      30      }
      31      #pragma omp task shared(a) depend(mutexinoutset: a[3])
      32      {
      33        usleep (5000);
      34        a[3] = 45;
      35      }
      36      #pragma omp task shared(a)
      37      {
      38        usleep (15000);
      39        a[4] = 46;
      40      }
      41      #pragma omp task shared(b) depend(in: b[0])
      42      {
      43        usleep (5000);
      44        b[0] = 47;
      45      }
      46      #pragma omp task shared(b) depend(in: b[4])
      47      {
      48        usleep (5000);
      49        b[4] = 48;
      50      }
      51      #pragma omp task shared(b) depend(inoutset: b[5])
      52      {
      53        usleep (5000);
      54        b[5] = 49;
      55      }
      56      /* None of the above tasks depend on each other.
      57         The following task depends on all but the a[4] = 46; one.  */
      58      #pragma omp task shared(a, b) depend(out: omp_all_memory) private(i) if(ifval)
      59      {
      60        if (a[0] != 42 || a[1] != 43 || a[2] != 44 || a[3] != 45
      61  	  || a[5] != 5 || a[6] != 6 || a[7] != 7
      62  	  || b[0] != 47 || b[1] != 2 || b[2] != 4 || b[3] != 6
      63  	  || b[4] != 48 || b[5] != 49 || b[6] != 12 || b[7] != 14)
      64  	abort ();
      65        for (i = 0; i < 8; ++i)
      66  	if (i != 4)
      67  	  a[i] = 3 * i + 7;
      68        for (i = 0; i < 8; ++i)
      69  	b[i] = 4 * i - 7;
      70      }
      71      /* The following task depends on both b[0] = 47; and
      72         above omp_all_memory tasks, but as the latter depends on
      73         the former, effectively it is dependent just on the omp_all_memory
      74         task.  */
      75      #pragma omp task shared(b) depend(inout: b[0])
      76      {
      77        usleep (5000);
      78        b[0] = 49;
      79      }
      80      /* The following task depends on all the above except a[4] = 46; one,
      81         but it can be reduced to dependency on the above omp_all_memory
      82         one and b[0] = 49; one.  */
      83      #pragma omp task shared(a, b) depend(inout: b[7], omp_all_memory, b[6]) \
      84  		     private(i) if(ifval)
      85      {
      86        for (i = 0; i < 8; ++i)
      87  	if (i != 4)
      88  	  {
      89  	    if (a[i] != 3 * i + 7)
      90  	      abort ();
      91  	    a[i] = 5 * i + 50;
      92  	  }
      93        if (b[0] != 49)
      94  	abort ();
      95        b[0] = 6 * i + 57;
      96        for (i = 1; i < 8; ++i)
      97  	{
      98  	  if (b[i] != 4 * i - 7) 
      99  	    abort ();
     100  	  b[i] = 6 * i + 57;
     101  	}
     102      }
     103      #pragma omp taskwait
     104      if (a[4] != 46)
     105        abort ();
     106    }
     107  }
     108  
     109  int
     110  main ()
     111  {
     112    test (1);
     113    test (0);
     114    return 0;
     115  }