(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c/
cancel-for-2.c
       1  /* { dg-do run } */
       2  /* { dg-set-target-env-var OMP_CANCELLATION "true" } */
       3  
       4  #include <stdlib.h>
       5  #include <omp.h>
       6  
       7  __attribute__((noinline, noclone)) int
       8  foo (int *x)
       9  {
      10    int v = 0, w = 0;
      11    #pragma omp parallel num_threads (32) shared (v, w)
      12    {
      13      int i;
      14      #pragma omp for
      15      for (i = 0; i < 1000; ++i)
      16        {
      17  	#pragma omp cancel for if (x[0])
      18  	abort ();
      19        }
      20      #pragma omp for
      21      for (i = 0; i < 1000; ++i)
      22        {
      23  	#pragma omp cancel for if (cancel: x[1])
      24  	#pragma omp atomic
      25  	v++;
      26        }
      27      #pragma omp for
      28      for (i = 0; i < 1000; ++i)
      29        {
      30  	#pragma omp cancel for if (x[2])
      31  	#pragma omp atomic
      32  	w += 8;
      33        }
      34      #pragma omp for
      35      for (i = 0; i < 1000; ++i)
      36        {
      37  	#pragma omp cancel for if ( cancel : x[3])
      38  	#pragma omp atomic
      39  	v += 2;
      40        }
      41    }
      42    if (v != 3000 || w != 0)
      43      abort ();
      44    #pragma omp parallel num_threads (32) shared (v, w)
      45    {
      46      int i;
      47      /* None of these cancel directives should actually cancel anything,
      48         but the compiler shouldn't know that and thus should use cancellable
      49         barriers at the end of all the workshares.  */
      50      #pragma omp cancel parallel if (omp_get_thread_num () == 1 && x[4])
      51      #pragma omp for
      52      for (i = 0; i < 1000; ++i)
      53        {
      54  	#pragma omp cancel for if (x[0])
      55  	abort ();
      56        }
      57      #pragma omp cancel parallel if (cancel:omp_get_thread_num () == 2 && x[4])
      58      #pragma omp for
      59      for (i = 0; i < 1000; ++i)
      60        {
      61  	#pragma omp cancel for if (x[1])
      62  	#pragma omp atomic
      63  	v++;
      64        }
      65      #pragma omp cancel parallel if (omp_get_thread_num () == 3 && x[4])
      66      #pragma omp for
      67      for (i = 0; i < 1000; ++i)
      68        {
      69  	#pragma omp cancel for if (x[2])
      70  	#pragma omp atomic
      71  	w += 8;
      72        }
      73      #pragma omp cancel parallel if (omp_get_thread_num () == 4 && x[4])
      74      #pragma omp for
      75      for (i = 0; i < 1000; ++i)
      76        {
      77  	#pragma omp cancel for if (x[3])
      78  	#pragma omp atomic
      79  	v += 2;
      80        }
      81      #pragma omp cancel parallel if (omp_get_thread_num () == 5 && x[4])
      82    }
      83    if (v != 6000 || w != 0)
      84      abort ();
      85    return 0;
      86  }
      87  
      88  int
      89  main ()
      90  {
      91    int x[] = { 1, 0, 1, 0, 0 };
      92    if (omp_get_cancellation ())
      93      foo (x);
      94    return 0;
      95  }