1  /* Verify that we diagnose "gang reduction on an orphan loop" for automatically
       2     assigned gang level of parallelism.  */
       3  
       4  /* { dg-do compile } */
       5  /* { dg-additional-options "-fopt-info-optimized-omp" } */
       6  /* { dg-additional-options "-Wopenacc-parallelism" } */
       7  
       8  #pragma acc routine gang
       9  /* { dg-bogus "warning: region is worker partitioned but does not contain worker partitioned code" "TODO default 'gang' 'vector'" { xfail *-*-* } .+3 }
      10     TODO It's the compiler's own decision to not use 'worker' parallelism here, so it doesn't make sense to bother the user about it.  */
      11  int
      12  f1 ()
      13  {
      14    int sum = 0, i;
      15  
      16    /* { dg-error "gang reduction on an orphan loop" "" { target *-*-* } .+1 } */
      17  #pragma acc loop reduction (+:sum) /* { dg-optimized "assigned OpenACC gang vector loop parallelism" } */
      18    for (i = 0; i < 100; i++)
      19      sum++;
      20  
      21    return sum;
      22  }
      23  
      24  #pragma acc routine gang
      25  int
      26  f2 ()
      27  {
      28    int sum = 0, i, j;
      29  
      30    /* { dg-error "gang reduction on an orphan loop" "" { target *-*-* } .+1 } */
      31  #pragma acc loop reduction (+:sum) /* { dg-optimized "assigned OpenACC gang worker loop parallelism" } */
      32    for (i = 0; i < 100; i++)
      33  #pragma acc loop reduction (+:sum) /* { dg-optimized "assigned OpenACC vector loop parallelism" } */
      34      for (j = 0; j < 100; j++)
      35        sum++;
      36  
      37    return sum;
      38  }
      39  
      40  #pragma acc routine gang
      41  int
      42  f3 ()
      43  {
      44    int sum = 0, i, j, k;
      45  
      46    /* { dg-error "gang reduction on an orphan loop" "" { target *-*-* } .+1 } */
      47  #pragma acc loop reduction (+:sum) /* { dg-optimized "assigned OpenACC gang loop parallelism" } */
      48    for (i = 0; i < 100; i++)
      49  #pragma acc loop reduction (+:sum) /* { dg-optimized "assigned OpenACC worker loop parallelism" } */
      50      for (j = 0; j < 100; j++)
      51  #pragma acc loop reduction (+:sum) /* { dg-optimized "assigned OpenACC vector loop parallelism" } */
      52        for (k = 0; k < 100; k++)
      53  	sum++;
      54  
      55    return sum;
      56  }
      57  
      58  int
      59  main ()
      60  {
      61    int sum = 0, i, j, k;
      62  
      63  #pragma acc parallel copy (sum)
      64    {
      65  #pragma acc loop reduction (+:sum) /* { dg-optimized "assigned OpenACC gang vector loop parallelism" } */
      66    for (i = 0; i < 100; i++)
      67      sum++;
      68    }
      69  
      70  #pragma acc parallel copy (sum)
      71    {
      72  #pragma acc loop reduction (+:sum) /* { dg-optimized "assigned OpenACC gang worker loop parallelism" } */
      73    for (i = 0; i < 100; i++)
      74  #pragma acc loop reduction (+:sum) /* { dg-optimized "assigned OpenACC vector loop parallelism" } */
      75      for (j = 0; j < 100; j++)
      76        sum++;
      77    }
      78  
      79  #pragma acc parallel copy (sum)
      80    {
      81  #pragma acc loop reduction (+:sum) /* { dg-optimized "assigned OpenACC gang loop parallelism" } */
      82    for (i = 0; i < 100; i++)
      83  #pragma acc loop reduction (+:sum) /* { dg-optimized "assigned OpenACC worker loop parallelism" } */
      84      for (j = 0; j < 100; j++)
      85  #pragma acc loop reduction (+:sum) /* { dg-optimized "assigned OpenACC vector loop parallelism" } */
      86        for (k = 0; k < 100; k++)
      87  	sum++;
      88    }
      89  
      90    return sum;
      91  }