(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
depend-iterator-1.c
       1  #ifdef __cplusplus
       2  extern "C"
       3  #endif
       4  void abort (void);
       5  int arr[64], arr2[64], arr3[64];
       6  
       7  int *
       8  foo (int x, int y, long z)
       9  {
      10    int v;
      11    switch (x)
      12      {
      13      case 1:
      14        if (z != 0 || y < 0 || y >= 64)
      15  	abort ();
      16        #pragma omp atomic capture
      17        {
      18  	v = arr2[y];
      19  	arr2[y]++;
      20        }
      21        if (v != 0) abort ();
      22        return &arr[y];
      23      case 2:
      24        if (y < 0 || y > 60 || (y & 3) || z < 0 || z >= 4)
      25  	abort ();
      26        #pragma omp atomic
      27        arr2[y + z] = arr2[y + z] + 4;
      28        return &arr[y + z];
      29      case 3:
      30        if (z < 0 || z > 60 || (z & 3) || y < 0 || y >= 4)
      31  	abort ();
      32        #pragma omp atomic
      33        arr2[y + z] = arr2[y + z] + 16;
      34        return &arr[y + z];
      35      case 4:
      36        if (y != 0 || z > 64 || z <= 0)
      37  	abort ();
      38        #pragma omp atomic
      39        arr2[z - 1] = arr2[z - 1] + 64;
      40        return &arr[z - 1];
      41      case 5:
      42        if ((y & 3) != 0 || y < 64 || y >= 96
      43  	  || (z & 127) != 0 || z < 512 || z >= 1024)
      44  	abort ();
      45        y = (y - 64) + (z - 512) / 128;
      46        #pragma omp atomic
      47        arr2[y] = arr2[y] + 256;
      48        return &arr[y];
      49      case 6:
      50        if ((y & 3) != 0 || y <= 64 || y > 96
      51  	  || (z & 127) != 1 || z <= 513 || z > 1025)
      52  	abort ();
      53        y = (y - 68) + (z - 641) / 128;
      54        #pragma omp atomic
      55        arr2[y] = arr2[y] + 1024;
      56        return &arr[y];
      57      default:
      58        abort ();
      59      }
      60  }
      61  
      62  volatile int beg, end, step, step2;
      63  volatile unsigned int begu, endu;
      64  
      65  int
      66  main ()
      67  {
      68    int m;
      69    beg = 60;
      70    end = -4;
      71    step = -4;
      72    step2 = 4;
      73    begu = -64U;
      74    endu = -32U;
      75    #pragma omp parallel
      76    #pragma omp master
      77    {
      78      int i;
      79      for (i = 0; i < 64; i++)
      80        #pragma omp task depend (iterator (j=i:i+1) , out : foo (1, j, 0)[0])
      81  	arr[i] = i;
      82      #pragma omp task depend (iterator (int k=beg:end:step,long int l=0:4:1) , inout : \
      83  			     foo (2, k, l)[0], foo (3, l, k)[0]) private (i)
      84      for (i = 0; i < 64; i++)
      85        if (arr[i] != i)
      86  	abort ();
      87        else
      88  	arr[i] = arr[i] + 1;
      89      #pragma omp task depend (iterator (int *p=&arr3[64]:&arr3[0]:-1) , inout : \
      90  			     foo (4, 0, p - &arr3[0])[0]) depend (in : beg)
      91      for (i = 0; i < 64; i++)
      92        if (arr[i] != i + 1)
      93  	abort ();
      94        else
      95  	arr[i] = arr[i] + 2;
      96      #pragma omp task depend (iterator (unsigned n=begu:endu:step2, unsigned int o = 512: 1024U: (unsigned char) 128), inout : \
      97  			     foo (5, n + 128, o)[0])
      98      for (i = 0; i < 64; i++)
      99        if (arr[i] != i + 3)
     100  	abort ();
     101        else
     102  	arr[i] = arr[i] + 4;
     103      #pragma omp task depend (iterator (int unsigned p=endu:begu:step,unsigned q= 1025U:513U:(signed char) -128), in : \
     104  			     foo (6, p + 128, q)[0])
     105      for (i = 0; i < 64; i++)
     106        if (arr[i] != i + 7)
     107  	abort ();
     108        else
     109  	arr[i] = arr[i] + 8;
     110    }
     111    for (m = 0; m < 64; m++)
     112      if (arr[m] != m + 15 || arr2[m] != (m < 32 ? 1365 : 85))
     113        abort ();
     114    return 0;
     115  }