1  /* Exercise nested function decomposition, gcc/tree-nested.c.  */
       2  
       3  /* { dg-additional-options "-fopt-info-all-omp" } */
       4  
       5  /* { dg-additional-options "--param=openacc-privatization=noisy" } */
       6  
       7  /* It's only with Tcl 8.5 (released in 2007) that "the variable 'varName'
       8     passed to 'incr' may be unset, and in that case, it will be set to [...]",
       9     so to maintain compatibility with earlier Tcl releases, we manually
      10     initialize counter variables:
      11     { dg-line l_dummy[variable c_loop 0] }
      12     { dg-message dummy {} { target iN-VAl-Id } l_dummy } to avoid
      13     "WARNING: dg-line var l_dummy defined, but not used".  */
      14  
      15  int
      16  main (void)
      17  {
      18    int j = 0, k = 6, l = 7, m = 8;
      19    void simple (void)
      20    {
      21      int i;
      22  #pragma acc parallel
      23      {
      24  #pragma acc loop /* { dg-line l_loop[incr c_loop] } */
      25        /* { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} {} { target *-*-* } l_loop$c_loop } */
      26        /* { dg-optimized {assigned OpenACC gang vector loop parallelism} {} { target *-*-* } l_loop$c_loop } */
      27        for (i = 0; i < m; i+= k)
      28  	j = (m + i - j) * l;
      29      }
      30    }
      31    void collapse (void)
      32    {
      33      int x, y, z;
      34  #pragma acc parallel
      35      {
      36  #pragma acc loop collapse (3) /* { dg-line l_loop[incr c_loop] } */
      37        /* { dg-note {variable 'z' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} {} { target *-*-* } l_loop$c_loop } */
      38        /* { dg-note {variable 'y' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} {} { target *-*-* } l_loop$c_loop } */
      39        /* { dg-note {variable 'x' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} {} { target *-*-* } l_loop$c_loop } */
      40        /* { dg-optimized {assigned OpenACC gang vector loop parallelism} {} { target *-*-* } l_loop$c_loop } */
      41        for (x = 0; x < k; x++)
      42  	for (y = -5; y < l; y++)
      43  	  for (z = 0; z < m; z++)
      44  	    j += x + y + z;
      45      }
      46    }
      47    void reduction (void)
      48    {
      49      int x, y, z;
      50  #pragma acc parallel reduction (+:j)
      51      {
      52  #pragma acc loop reduction (+:j) collapse (3) /* { dg-line l_loop[incr c_loop] } */
      53        /* { dg-note {variable 'z' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} {} { target *-*-* } l_loop$c_loop } */
      54        /* { dg-note {variable 'y' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} {} { target *-*-* } l_loop$c_loop } */
      55        /* { dg-note {variable 'x' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} {} { target *-*-* } l_loop$c_loop } */
      56        /* { dg-optimized {assigned OpenACC gang vector loop parallelism} {} { target *-*-* } l_loop$c_loop } */
      57        for (x = 0; x < k; x++)
      58  	for (y = -5; y < l; y++)
      59  	  for (z = 0; z < m; z++)
      60  	    j += x + y + z;
      61      }
      62    }
      63    simple();
      64    collapse();
      65    reduction();
      66    return 0;
      67  }