(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
allocate-1.c
       1  #include <omp.h>
       2  #include <stdlib.h>
       3  #include <stdint.h>
       4  
       5  struct S { int a, b; };
       6  
       7  void
       8  foo (int x, int *p, int *q, int px, omp_allocator_handle_t h, int fl)
       9  {
      10    int y = 0, r = 0, i, i1, l, l2[4], l3, n = 8;
      11    int i2, j2, n2 = 9, l4;
      12    int i3, j3, n3 = 10, l5;
      13    int i4, j4, n4 = 11, l6;
      14    int i5, n5;
      15    int v[x], w[x];
      16    int r2[4] = { 0, 0, 0, 0 };
      17    int xo = x;
      18    struct S s = { 27, 29 };
      19    for (i = 0; i < 4; i++)
      20      p[i] = 0;
      21    for (i = 0; i < 3; i++)
      22      q[i] = 0;
      23    for (i = 0; i < x; i++)
      24      w[i] = i;
      25    #pragma omp parallel private (y, v) firstprivate (x) allocate (x, y, v)
      26    {
      27      int *volatile p1 = &x;
      28      int *volatile p2 = &y;
      29      if (x != 42)
      30        abort ();
      31      #pragma omp barrier
      32      *p2 = 1;
      33      p1[0]++;
      34      v[0] = 7;
      35      v[41] = 8;
      36      #pragma omp barrier
      37      if (x != 43 || y != 1)
      38        abort ();
      39      if (v[0] != 7 || v[41] != 8)
      40        abort ();
      41      if ((fl & 2) && (((uintptr_t) p1 | (uintptr_t) p2
      42  	| (uintptr_t) &v[0]) & 63) != 0)
      43        abort ();
      44    }
      45    x = xo;
      46    #pragma omp teams
      47    #pragma omp parallel private (y) firstprivate (x, w) allocate (h: x, y, w)
      48    {
      49      int *volatile p1 = &x;
      50      int *volatile p2 = &y;
      51      if (x != 42 || w[17] != 17 || w[41] != 41)
      52        abort ();
      53      #pragma omp barrier
      54      *p2 = 1;
      55      p1[0]++;
      56      w[19]++;
      57      #pragma omp barrier
      58      if (x != 43 || y != 1 || w[19] != 20)
      59        abort ();
      60      if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p2
      61  		      | (uintptr_t) &w[0]) & 63) != 0)
      62        abort ();
      63    }
      64    x = xo;
      65    #pragma omp parallel for private (y) firstprivate (x) allocate (h: x, y, r, l, n) reduction(+: r) lastprivate (l) linear (n: 16)
      66    for (i = 0; i < 64; i++)
      67      {
      68        if (x != 42)
      69  	abort ();
      70        y = 1;
      71        l = i;
      72        n += y + 15;
      73        r += i;
      74        if ((fl & 1) && (((uintptr_t) &x | (uintptr_t) &y | (uintptr_t) &r
      75  			| (uintptr_t) &l | (uintptr_t) &n) & 63) != 0)
      76  	abort ();
      77      }
      78    x = xo;
      79    #pragma omp parallel
      80    {
      81      #pragma omp for lastprivate (l2) private (i1) allocate (h: l2, l3, i1) lastprivate (conditional: l3)
      82      for (i1 = 0; i1 < 64; i1++)
      83        {
      84  	l2[0] = i1;
      85  	l2[1] = i1 + 1;
      86  	l2[2] = i1 + 2;
      87  	l2[3] = i1 + 3;
      88  	if (i1 < 37)
      89  	  l3 = i1;
      90  	if ((fl & 1) && (((uintptr_t) &l2[0] | (uintptr_t) &l3 | (uintptr_t) &i1) & 63) != 0)
      91  	  abort ();
      92        }
      93      #pragma omp for collapse(2) lastprivate(l4, i2, j2) linear (n2:17) allocate (h: n2, l4, i2, j2)
      94      for (i2 = 3; i2 < 5; i2++)
      95        for (j2 = 17; j2 < 22; j2 += 2)
      96  	{
      97  	  n2 += 17;
      98  	  l4 = i2 * 31 + j2;
      99  	  if ((fl & 1) && (((uintptr_t) &l4 | (uintptr_t) &n2
     100  			    | (uintptr_t) &i2 | (uintptr_t) &j2) & 63) != 0)
     101  	    abort ();
     102  	}
     103      #pragma omp for collapse(2) lastprivate(l5, i3, j3) linear (n3:17) schedule (static, 3) allocate (n3, l5, i3, j3)
     104      for (i3 = 3; i3 < 5; i3++)
     105        for (j3 = 17; j3 < 23; j3 += 2)
     106  	{
     107  	  n3 += 17;
     108  	  l5 = i3 * 31 + j3;
     109  	  if ((fl & 2) && (((uintptr_t) &l5 | (uintptr_t) &n3
     110  			    | (uintptr_t) &i3 | (uintptr_t) &j3) & 63) != 0)
     111  	    abort ();
     112  	}
     113      #pragma omp for collapse(2) lastprivate(l6, i4, j4) linear (n4:17) schedule (dynamic) allocate (h: n4, l6, i4, j4)
     114      for (i4 = 3; i4 < 5; i4++)
     115        for (j4 = 17; j4 < 22; j4 += 2)
     116  	{
     117  	  n4 += 17;
     118  	  l6 = i4 * 31 + j4;
     119  	  if ((fl & 1) && (((uintptr_t) &l6 | (uintptr_t) &n4
     120  			    | (uintptr_t) &i4 | (uintptr_t) &j4) & 63) != 0)
     121  	    abort ();
     122  	}
     123      #pragma omp for lastprivate (i5) allocate (i5)
     124      for (i5 = 1; i5 < 17; i5 += 3)
     125        {
     126  	if ((fl & 2) && (((uintptr_t) &i5) & 63) != 0)
     127  	  abort ();
     128        }
     129      #pragma omp for reduction(+:p[2:px], q[:3], r2) allocate(h: p, q, r2)
     130      for (i = 0; i < 32; i++)
     131        {
     132  	p[2] += i;
     133  	p[3] += 2 * i;
     134  	q[0] += 3 * i;
     135  	q[2] += 4 * i;
     136  	r2[0] += 5 * i;
     137  	r2[3] += 6 * i;
     138  	/* Can't really rely on alignment of &p[0], the implementation could
     139  	   allocate the whole array or do what GCC does and allocate only part
     140  	   of it.  */
     141  	if ((fl & 1) && (((uintptr_t) &q[0] | (uintptr_t) &r2[0]) & 63) != 0)
     142  	  abort ();
     143        }
     144      #pragma omp task private(y) firstprivate(x) allocate(x, y)
     145      {
     146        int *volatile p1 = &x;
     147        int *volatile p2 = &y;
     148        if (x != 42)
     149  	abort ();
     150        p1[0]++;
     151        p2[0] = 21;
     152        if (x != 43 || y != 21)
     153  	abort ();
     154        if ((fl & 2) && (((uintptr_t) p1 | (uintptr_t) p2) & 63) != 0)
     155  	abort ();
     156      }
     157      #pragma omp task private(y) firstprivate(x) allocate(h: x, y)
     158      {
     159        int *volatile p1 = &x;
     160        int *volatile p2 = &y;
     161        if (x != 42)
     162  	abort ();
     163        p1[0]++;
     164        p2[0] = 21;
     165        if (x != 43 || y != 21)
     166  	abort ();
     167        if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p2) & 63) != 0)
     168  	abort ();
     169      }
     170      #pragma omp task private(y) firstprivate(s) allocate(s, y)
     171      {
     172        int *volatile p1 = &s.a;
     173        int *volatile p2 = &s.b;
     174        int *volatile p3 = &y;
     175        if (s.a != 27 || s.b != 29)
     176  	abort ();
     177        p1[0]++;
     178        p2[0]++;
     179        p3[0] = 21;
     180        if (s.a != 28 || s.b != 30 || y != 21)
     181  	abort ();
     182        if ((fl & 2) && (((uintptr_t) p1 | (uintptr_t) p3) & 63) != 0)
     183  	abort ();
     184      }
     185      #pragma omp task private(y) firstprivate(s) allocate(h: s, y)
     186      {
     187        int *volatile p1 = &s.a;
     188        int *volatile p2 = &s.b;
     189        int *volatile p3 = &y;
     190        if (s.a != 27 || s.b != 29)
     191  	abort ();
     192        p1[0]++;
     193        p2[0]++;
     194        p3[0] = 21;
     195        if (s.a != 28 || s.b != 30 || y != 21)
     196  	abort ();
     197        if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p3) & 63) != 0)
     198  	abort ();
     199      }
     200    }
     201    if (r != 64 * 63 / 2 || l != 63 || n != 8 + 16 * 64)
     202      abort ();
     203    if (l2[0] != 63 || l2[1] != 63 + 1 || l2[2] != 63 + 2 || l2[3] != 63 + 3 || l3 != 36)
     204      abort ();
     205    if (i2 != 5 || j2 != 23 || n2 != 9 + 6 * 17 || l4 != 4 * 31 + 21)
     206      abort ();
     207    if (i3 != 5 || j3 != 23 || n3 != 10 + 6 * 17 || l5 != 4 * 31 + 21)
     208      abort ();
     209    if (i4 != 5 || j4 != 23 || n4 != 11 + 6 * 17 || l6 != 4 * 31 + 21)
     210      abort ();
     211    if (i5 != 19)
     212      abort ();
     213    if (p[2] != (32 * 31) / 2 || p[3] != 2 * (32 * 31) / 2
     214        || q[0] != 3 * (32 * 31) / 2 || q[2] != 4 * (32 * 31) / 2
     215        || r2[0] != 5 * (32 * 31) / 2 || r2[3] != 6 * (32 * 31) / 2)
     216      abort ();
     217    r = 0;
     218    x = xo;
     219    #pragma omp parallel shared (x, y, r, n5) firstprivate (h)
     220    {
     221      #pragma omp masked
     222      n5 = omp_get_num_threads ();
     223      #pragma omp scope private (y) firstprivate (x) reduction(+:r) \
     224  		      allocate (h: x, y, r)
     225      {
     226        int *volatile p1 = &x;
     227        int *volatile p2 = &y;
     228        int *volatile p3 = &r;
     229        if (x != 42)
     230  	abort ();
     231        #pragma omp barrier
     232        *p2 = 1;
     233        p1[0]++;
     234        p3[0]++;
     235        #pragma omp barrier
     236        if (x != 43 || y != 1 || r != 1)
     237  	abort ();
     238        if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p2
     239  			| (uintptr_t) p3) & 63) != 0)
     240  	abort ();
     241      }
     242    }
     243    if (x != 42 || r != n5)
     244      abort ();
     245  }
     246  
     247  void
     248  bar (int x, omp_allocator_handle_t h)
     249  {
     250    int y = 0, r = 0, i, i1, l, l2[4], l3, n = 8;
     251    int i2, j2, n2 = 9, l4;
     252    int i3, j3, n3 = 10, l5;
     253    int i4, j4, n4 = 11, l6;
     254    int i5;
     255    struct S s = { 27, 29 };
     256    int xo = x;
     257    #pragma omp parallel private (y) firstprivate (x) allocate (x, y)
     258    {
     259      if (x != 42)
     260        abort ();
     261      #pragma omp barrier
     262      y = 1;
     263      x++;
     264      #pragma omp barrier
     265      if (x != 43 || y != 1)
     266        abort ();
     267    }
     268    x = xo;
     269    #pragma omp teams
     270    #pragma omp parallel private (y) firstprivate (x) allocate (h: x, y)
     271    {
     272      if (x != 42)
     273        abort ();
     274      #pragma omp barrier
     275      y = 1;
     276      x++;
     277      #pragma omp barrier
     278      if (x != 43 || y != 1)
     279        abort ();
     280    }
     281    x = xo;
     282    #pragma omp parallel for private (y) firstprivate (x) allocate (h: x, y, r, l, n) reduction(+: r) lastprivate (l) linear (n: 16)
     283    for (i = 0; i < 64; i++)
     284      {
     285        if (x != 42)
     286  	abort ();
     287        y = 1;
     288        l = i;
     289        n += y + 15;
     290        r += i;
     291      }
     292    x = xo;
     293    #pragma omp parallel
     294    {
     295      #pragma omp for lastprivate (l2) private (i1) allocate (h: l2, l3, i1) lastprivate (conditional: l3)
     296      for (i1 = 0; i1 < 64; i1++)
     297        {
     298  	l2[0] = i1;
     299  	l2[1] = i1 + 1;
     300  	l2[2] = i1 + 2;
     301  	l2[3] = i1 + 3;
     302  	if (i1 < 37)
     303  	  l3 = i1;
     304        }
     305      #pragma omp for collapse(2) lastprivate(l4, i2, j2) linear (n2:17) allocate (h: n2, l4, i2, j2)
     306      for (i2 = 3; i2 < 5; i2++)
     307        for (j2 = 17; j2 < 22; j2 += 2)
     308  	{
     309  	  n2 += 17;
     310  	  l4 = i2 * 31 + j2;
     311  	}
     312      #pragma omp for collapse(2) lastprivate(l5, i3, j3) linear (n3:17) schedule (static, 3) allocate (n3, l5, i3, j3)
     313      for (i3 = 3; i3 < 5; i3++)
     314        for (j3 = 17; j3 < 23; j3 += 2)
     315  	{
     316  	  n3 += 17;
     317  	  l5 = i3 * 31 + j3;
     318  	}
     319      #pragma omp for collapse(2) lastprivate(l6, i4, j4) linear (n4:17) schedule (dynamic) allocate (h: n4, l6, i4, j4)
     320      for (i4 = 3; i4 < 5; i4++)
     321        for (j4 = 17; j4 < 22; j4 += 2)
     322  	{
     323  	  n4 += 17;
     324  	  l6 = i4 * 31 + j4;
     325  	}
     326      #pragma omp for lastprivate (i5) allocate (i5)
     327      for (i5 = 1; i5 < 17; i5 += 3)
     328        ;
     329      #pragma omp task private(y) firstprivate(x) allocate(x, y)
     330      {
     331        if (x != 42)
     332  	abort ();
     333        x++;
     334        y = 21;
     335        if (x != 43 || y != 21)
     336  	abort ();
     337      }
     338      #pragma omp task private(y) firstprivate(x) allocate(h: x, y)
     339      {
     340        if (x != 42)
     341  	abort ();
     342        x++;
     343        y = 21;
     344        if (x != 43 || y != 21)
     345  	abort ();
     346      }
     347      #pragma omp task private(y) firstprivate(s) allocate(s, y)
     348      {
     349        if (s.a != 27 || s.b != 29)
     350  	abort ();
     351        s.a++;
     352        s.b++;
     353        y = 21;
     354        if (s.a != 28 || s.b != 30 || y != 21)
     355  	abort ();
     356      }
     357      #pragma omp task private(y) firstprivate(s) allocate(h: s, y)
     358      {
     359        if (s.a != 27 || s.b != 29)
     360  	abort ();
     361        s.a++;
     362        s.b++;
     363        y = 21;
     364        if (s.a != 28 || s.b != 30 || y != 21)
     365  	abort ();
     366      }
     367    }
     368    if (r != 64 * 63 / 2 || l != 63 || n != 8 + 16 * 64)
     369      abort ();
     370    if (l2[0] != 63 || l2[1] != 63 + 1 || l2[2] != 63 + 2 || l2[3] != 63 + 3 || l3 != 36)
     371      abort ();
     372    if (i2 != 5 || j2 != 23 || n2 != 9 + 6 * 17 || l4 != 4 * 31 + 21)
     373      abort ();
     374    if (i3 != 5 || j3 != 23 || n3 != 10 + 6 * 17 || l5 != 4 * 31 + 21)
     375      abort ();
     376    if (i4 != 5 || j4 != 23 || n4 != 11 + 6 * 17 || l6 != 4 * 31 + 21)
     377      abort ();
     378    if (i5 != 19)
     379      abort ();
     380  }
     381  
     382  int
     383  main ()
     384  {
     385    omp_alloctrait_t traits[3]
     386      = { { omp_atk_alignment, 64 },
     387  	{ omp_atk_fallback, omp_atv_null_fb } };
     388    omp_allocator_handle_t a
     389      = omp_init_allocator (omp_default_mem_space, 2, traits);
     390    int p[4], q[3];
     391    if (a == omp_null_allocator)
     392      abort ();
     393    omp_set_default_allocator (omp_default_mem_alloc);
     394    foo (42, p, q, 2, omp_null_allocator, 0);
     395    foo (42, p, q, 2, omp_default_mem_alloc, 0);
     396    foo (42, p, q, 2, a, 1);
     397    omp_set_default_allocator (a);
     398    foo (42, p, q, 2, omp_null_allocator, 3);
     399    foo (42, p, q, 2, omp_default_mem_alloc, 2);
     400    bar (42, a);
     401    omp_destroy_allocator (a);
     402    return 0;
     403  }