(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
depobj-1.c
       1  #include <stdlib.h>
       2  #include <omp.h>
       3  
       4  void
       5  dep (void)
       6  {
       7    int x = 1;
       8    omp_depend_t d1, d2;
       9    #pragma omp depobj (d1) depend(in: x)
      10    #pragma omp depobj (d2) depend(in: x)
      11    #pragma omp depobj (d2) update(out)
      12    #pragma omp parallel
      13    #pragma omp single
      14    {
      15      #pragma omp task shared (x) depend(depobj: d2)
      16      x = 2;
      17      #pragma omp task shared (x) depend(depobj: d1)
      18      if (x != 2)
      19        abort ();
      20    }
      21    #pragma omp depobj (d2) destroy
      22    #pragma omp depobj (d1) destroy
      23  }
      24  
      25  void
      26  dep2 (void)
      27  {
      28    #pragma omp parallel
      29    #pragma omp single
      30    {
      31      int x = 1;
      32      omp_depend_t d1, d2;
      33      #pragma omp depobj (d1) depend(out: x)
      34      #pragma omp depobj (*&d2) depend (in:x)
      35      #pragma omp depobj(d2)update(in)
      36      #pragma omp task shared (x) depend(depobj:d1)
      37      x = 2;
      38      #pragma omp task shared (x) depend(depobj : d2)
      39      if (x != 2)
      40        abort ();
      41      #pragma omp taskwait
      42      #pragma omp depobj(d1)destroy
      43      #pragma omp depobj((&d2)[0]) destroy
      44    }
      45  }
      46  
      47  void
      48  dep3 (void)
      49  {
      50    omp_depend_t d[2];
      51    #pragma omp parallel
      52    {
      53      int x = 1;
      54      #pragma omp single
      55      {
      56        #pragma omp depobj(d[0]) depend(out:x)
      57        #pragma omp depobj(d[1]) depend(in: x)
      58        #pragma omp task shared (x) depend(depobj: *d)
      59        x = 2;
      60        #pragma omp task shared (x) depend(depobj: *(d + 1))
      61        if (x != 2)
      62  	abort ();
      63      }
      64    }
      65    #pragma omp depobj(d[0]) destroy
      66    #pragma omp depobj(d[1]) destroy
      67  }
      68  
      69  int xx;
      70  omp_depend_t dd1, dd2;
      71  
      72  void
      73  antidep (void)
      74  {
      75    xx = 1;
      76    #pragma omp parallel
      77    #pragma omp single
      78    {
      79      #pragma omp task shared(xx) depend(depobj:dd2)
      80      if (xx != 1)
      81        abort ();
      82      #pragma omp task shared(xx) depend(depobj:dd1)
      83      xx = 2;
      84    }
      85  }
      86  
      87  int
      88  main ()
      89  {
      90    dep ();
      91    dep2 ();
      92    dep3 ();
      93    #pragma omp depobj (dd1) depend (inout: xx)
      94    #pragma omp depobj (dd2) depend (in : xx)
      95    antidep ();
      96    #pragma omp depobj (dd2) destroy
      97    #pragma omp depobj (dd1) destroy
      98    return 0;
      99  }