(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.oacc-c-c++-common/
structured-dynamic-lifetimes-2.c
       1  /* Test nested dynamic/structured data mappings.  */
       2  
       3  /* { dg-skip-if "" { *-*-* } { "-DACC_MEM_SHARED=1" } } */
       4  
       5  #include <openacc.h>
       6  #include <assert.h>
       7  #include <stdlib.h>
       8  
       9  #define SIZE 1024
      10  
      11  void
      12  f1 (void)
      13  {
      14    char *block1 = (char *) malloc (SIZE);
      15  
      16  #pragma acc data copy(block1[0:SIZE])
      17    {
      18  #ifdef OPENACC_API
      19      acc_copyin (block1, SIZE);
      20      acc_copyout (block1, SIZE);
      21  #else
      22  #pragma acc enter data copyin(block1[0:SIZE])
      23  #pragma acc exit data copyout(block1[0:SIZE])
      24  #endif
      25    }
      26  
      27    assert (!acc_is_present (block1, SIZE));
      28  
      29    free (block1);
      30  }
      31  
      32  void
      33  f2 (void)
      34  {
      35    char *block1 = (char *) malloc (SIZE);
      36  
      37  #ifdef OPENACC_API
      38    acc_copyin (block1, SIZE);
      39  #else
      40  #pragma acc enter data copyin(block1[0:SIZE])
      41  #endif
      42  
      43  #pragma acc data copy(block1[0:SIZE])
      44    {
      45    }
      46  
      47  #ifdef OPENACC_API
      48    acc_copyout (block1, SIZE);
      49  #else
      50  #pragma acc exit data copyout(block1[0:SIZE])
      51  #endif
      52  
      53    assert (!acc_is_present (block1, SIZE));
      54  
      55    free (block1);
      56  }
      57  
      58  void
      59  f3 (void)
      60  {
      61    char *block1 = (char *) malloc (SIZE);
      62  
      63  #pragma acc data copy(block1[0:SIZE])
      64    {
      65  #ifdef OPENACC_API
      66      acc_copyin (block1, SIZE);
      67      acc_copyin (block1, SIZE);
      68      acc_copyout (block1, SIZE);
      69      acc_copyout (block1, SIZE);
      70  #else
      71  #pragma acc enter data copyin(block1[0:SIZE])
      72  #pragma acc enter data copyin(block1[0:SIZE])
      73  #pragma acc exit data copyout(block1[0:SIZE])
      74  #pragma acc exit data copyout(block1[0:SIZE])
      75  #endif
      76    }
      77  
      78    assert (!acc_is_present (block1, SIZE));
      79  
      80    free (block1);
      81  }
      82  
      83  void
      84  f4 (void)
      85  {
      86    char *block1 = (char *) malloc (SIZE);
      87  
      88  #pragma acc data copy(block1[0:SIZE])
      89    {
      90  #ifdef OPENACC_API
      91      acc_copyin (block1, SIZE);
      92  #else
      93  #pragma acc enter data copyin(block1[0:SIZE])
      94  #endif
      95  
      96  #pragma acc data copy(block1[0:SIZE])
      97      {
      98  #ifdef OPENACC_API
      99        acc_copyin (block1, SIZE);
     100        acc_copyout (block1, SIZE);
     101  #else
     102  #pragma acc enter data copyin(block1[0:SIZE])
     103  #pragma acc exit data copyout(block1[0:SIZE])
     104  #endif
     105      }
     106  
     107  #ifdef OPENACC_API
     108    acc_copyout (block1, SIZE);
     109  #else
     110  #pragma acc exit data copyout(block1[0:SIZE])
     111  #endif
     112    }
     113  
     114    assert (!acc_is_present (block1, SIZE));
     115  
     116    free (block1);
     117  }
     118  
     119  void
     120  f5 (void)
     121  {
     122    char *block1 = (char *) malloc (SIZE);
     123  
     124  #ifdef OPENACC_API
     125    acc_copyin (block1, SIZE);
     126  #else
     127  #pragma acc enter data copyin(block1[0:SIZE])
     128  #endif
     129  
     130  #pragma acc data copy(block1[0:SIZE])
     131    {
     132  #ifdef OPENACC_API
     133      acc_copyin (block1, SIZE);
     134  #else
     135  #pragma acc enter data copyin(block1[0:SIZE])
     136  #endif
     137  #pragma acc data copy(block1[0:SIZE])
     138      {
     139      }
     140  #ifdef OPENACC_API
     141      acc_copyout (block1, SIZE);
     142  #else
     143  #pragma acc exit data copyout(block1[0:SIZE])
     144  #endif
     145    }
     146  #ifdef OPENACC_API
     147    acc_copyout (block1, SIZE);
     148  #else
     149  #pragma acc exit data copyout(block1[0:SIZE])
     150  #endif
     151  
     152    assert (!acc_is_present (block1, SIZE));
     153  
     154    free (block1);
     155  }
     156  
     157  int
     158  main (int argc, char *argv[])
     159  {
     160    f1 ();
     161    f2 ();
     162    f3 ();
     163    f4 ();
     164    f5 ();
     165    return 0;
     166  }