(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c/
pr33880.c
       1  /* PR middle-end/33880 */
       2  /* { dg-do run } */
       3  
       4  extern void abort (void);
       5  
       6  void
       7  test1 (void)
       8  {
       9    int i = 0, j = 0;
      10    void bar (void)
      11    {
      12      i++;
      13      j++;
      14    }
      15    bar ();
      16    #pragma omp parallel for num_threads(4)
      17      for (i = 0; i < 100; i++)
      18        #pragma omp atomic
      19  	j += 1;
      20    if (j != 101)
      21      abort ();
      22    #pragma omp parallel for lastprivate(i) num_threads(2)
      23      for (i = 0; i < 100; i++)
      24        #pragma omp atomic
      25  	j += 1;
      26    if (i != 100)
      27      abort ();
      28    i = 3;
      29    bar ();
      30    if (j != 202)
      31      abort ();
      32    if (i != 4)
      33      abort ();
      34  }
      35  
      36  void
      37  test2 (void)
      38  {
      39    int i = -1, j = 99, k, l = 9, m = 0;
      40    void bar (void)
      41    {
      42      i++;
      43      j++;
      44      l++;
      45      m++;
      46    }
      47    bar ();
      48    #pragma omp parallel for num_threads(4)
      49      for (k = i; k < j; k += l)
      50        #pragma omp atomic
      51  	m += 1;
      52    bar ();
      53    if (i != 1 || j != 101 || l != 11 || m != 12)
      54      abort ();
      55  }
      56  
      57  void
      58  test3 (void)
      59  {
      60    int i, j, k, l, m;
      61    void bar (void)
      62    {
      63    #pragma omp parallel for num_threads(4)
      64      for (i = j; i < k; i += l)
      65        #pragma omp atomic
      66          m += 1;
      67    }
      68    void baz (void)
      69    {
      70    #pragma omp parallel for num_threads(2) lastprivate(i)
      71      for (i = j; i < k * 2; i += l / 2)
      72        #pragma omp atomic
      73          m += 1;
      74    }
      75    i = 7;
      76    j = 0;
      77    k = 100;
      78    l = 2;
      79    m = 0;
      80    bar ();
      81    if (j != 0 || k != 100 || l != 2 || m != 50)
      82      abort ();
      83    baz ();
      84    if (i != 200 || j != 0 || k != 100 || l != 2 || m != 250)
      85      abort ();
      86  }
      87  
      88  void
      89  test4 (void)
      90  {
      91    int i, j, k, l, m = 0;
      92    int foo (void)
      93    {
      94      return j;
      95    }
      96    int bar (void)
      97    {
      98      return k;
      99    }
     100    int baz (void)
     101    {
     102      return l;
     103    }
     104    j = 0;
     105    k = 1000;
     106    l = 2;
     107    #pragma omp parallel for num_threads(8) lastprivate(i)
     108    for (i = foo (); i < bar (); i += baz ())
     109      #pragma omp atomic
     110        m += 1;
     111    if (i != 1000 || m != 500 || j != 0 || k != 1000 || l != 2)
     112      abort ();
     113  }
     114  
     115  int
     116  main (void)
     117  {
     118    test1 ();
     119    test2 ();
     120    test3 ();
     121    test4 ();
     122    return 0;
     123  }