1  /* { dg-do run } */
       2  
       3  #include <omp.h>
       4  
       5  extern void abort (void);
       6  
       7  #define LLONG_MAX __LONG_LONG_MAX__
       8  #define ULLONG_MAX (LLONG_MAX * 2ULL + 1)
       9  #define INT_MAX __INT_MAX__
      10  
      11  int arr[6 * 5];
      12  
      13  void
      14  set (int loopidx, int idx)
      15  {
      16  #pragma omp atomic
      17    arr[loopidx * 5 + idx]++;
      18  }
      19  
      20  #define check(var, val, loopidx, idx) \
      21    if (var == (val)) set (loopidx, idx); else
      22  #define test(loopidx, count) \
      23    for (idx = 0; idx < 5; idx++) \
      24      if (arr[loopidx * 5 + idx] != idx < count) \
      25        abort (); \
      26      else \
      27        arr[loopidx * 5 + idx] = 0
      28  
      29  int
      30  test1 (void)
      31  {
      32    int e = 0, idx;
      33  
      34  #pragma omp parallel reduction(+:e)
      35    {
      36      long long i;
      37      unsigned long long j;
      38      #pragma omp for schedule(dynamic,1) nowait
      39      for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
      40        {
      41  	check (i, LLONG_MAX - 30001, 0, 0)
      42  	check (i, LLONG_MAX - 20001, 0, 1)
      43  	check (i, LLONG_MAX - 10001, 0, 2)
      44  	e = 1;
      45        }
      46      #pragma omp for schedule(dynamic,1) nowait
      47      for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
      48        {
      49  	check (i, -LLONG_MAX + 30000, 1, 0)
      50  	check (i, -LLONG_MAX + 20000, 1, 1)
      51  	check (i, -LLONG_MAX + 10000, 1, 2)
      52  	e = 1;
      53        }
      54      #pragma omp for schedule(dynamic,1) nowait
      55      for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
      56        {
      57  	check (j, 20, 2, 0)
      58  	e = 1;
      59        }
      60      #pragma omp for schedule(dynamic,1) nowait
      61      for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
      62        {
      63  	check (j, ULLONG_MAX - 3, 3, 0)
      64  	e = 1;
      65        }
      66      #pragma omp for schedule(dynamic,1) nowait
      67      for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
      68        {
      69  	check (j, LLONG_MAX - 20000ULL, 4, 0)
      70  	check (j, LLONG_MAX - 10000ULL, 4, 1)
      71  	check (j, LLONG_MAX, 4, 2)
      72  	check (j, LLONG_MAX + 10000ULL, 4, 3)
      73  	e = 1;
      74        }
      75      #pragma omp for schedule(dynamic,1) nowait
      76      for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
      77        {
      78  	check (i, -3LL * INT_MAX - 20000LL, 5, 0)
      79  	check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
      80  	check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
      81  	check (i, -20000LL + 600LL, 5, 3)
      82  	check (i, INT_MAX - 20000LL + 800LL, 5, 4)
      83  	e = 1;
      84        }
      85    }
      86    if (e)
      87      abort ();
      88    test (0, 3);
      89    test (1, 3);
      90    test (2, 1);
      91    test (3, 1);
      92    test (4, 4);
      93    test (5, 5);
      94    return 0;
      95  }
      96  
      97  int
      98  test2 (void)
      99  {
     100    int e = 0, idx;
     101  
     102  #pragma omp parallel reduction(+:e)
     103    {
     104      long long i;
     105      unsigned long long j;
     106      #pragma omp for schedule(guided,1) nowait
     107      for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
     108        {
     109  	check (i, LLONG_MAX - 30001, 0, 0)
     110  	check (i, LLONG_MAX - 20001, 0, 1)
     111  	check (i, LLONG_MAX - 10001, 0, 2)
     112  	e = 1;
     113        }
     114      #pragma omp for schedule(guided,1) nowait
     115      for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
     116        {
     117  	check (i, -LLONG_MAX + 30000, 1, 0)
     118  	check (i, -LLONG_MAX + 20000, 1, 1)
     119  	check (i, -LLONG_MAX + 10000, 1, 2)
     120  	e = 1;
     121        }
     122      #pragma omp for schedule(guided,1) nowait
     123      for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
     124        {
     125  	check (j, 20, 2, 0)
     126  	e = 1;
     127        }
     128      #pragma omp for schedule(guided,1) nowait
     129      for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
     130        {
     131  	check (j, ULLONG_MAX - 3, 3, 0)
     132  	e = 1;
     133        }
     134      #pragma omp for schedule(guided,1) nowait
     135      for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
     136        {
     137  	check (j, LLONG_MAX - 20000ULL, 4, 0)
     138  	check (j, LLONG_MAX - 10000ULL, 4, 1)
     139  	check (j, LLONG_MAX, 4, 2)
     140  	check (j, LLONG_MAX + 10000ULL, 4, 3)
     141  	e = 1;
     142        }
     143      #pragma omp for schedule(guided,1) nowait
     144      for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
     145        {
     146  	check (i, -3LL * INT_MAX - 20000LL, 5, 0)
     147  	check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
     148  	check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
     149  	check (i, -20000LL + 600LL, 5, 3)
     150  	check (i, INT_MAX - 20000LL + 800LL, 5, 4)
     151  	e = 1;
     152        }
     153    }
     154    if (e)
     155      abort ();
     156    test (0, 3);
     157    test (1, 3);
     158    test (2, 1);
     159    test (3, 1);
     160    test (4, 4);
     161    test (5, 5);
     162    return 0;
     163  }
     164  
     165  int
     166  test3 (void)
     167  {
     168    int e = 0, idx;
     169  
     170  #pragma omp parallel reduction(+:e)
     171    {
     172      long long i;
     173      unsigned long long j;
     174      #pragma omp for schedule(static) nowait
     175      for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
     176        {
     177  	check (i, LLONG_MAX - 30001, 0, 0)
     178  	check (i, LLONG_MAX - 20001, 0, 1)
     179  	check (i, LLONG_MAX - 10001, 0, 2)
     180  	e = 1;
     181        }
     182      #pragma omp for schedule(static) nowait
     183      for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
     184        {
     185  	check (i, -LLONG_MAX + 30000, 1, 0)
     186  	check (i, -LLONG_MAX + 20000, 1, 1)
     187  	check (i, -LLONG_MAX + 10000, 1, 2)
     188  	e = 1;
     189        }
     190      #pragma omp for schedule(static) nowait
     191      for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
     192        {
     193  	check (j, 20, 2, 0)
     194  	e = 1;
     195        }
     196      #pragma omp for schedule(static) nowait
     197      for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
     198        {
     199  	check (j, ULLONG_MAX - 3, 3, 0)
     200  	e = 1;
     201        }
     202      #pragma omp for schedule(static) nowait
     203      for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
     204        {
     205  	check (j, LLONG_MAX - 20000ULL, 4, 0)
     206  	check (j, LLONG_MAX - 10000ULL, 4, 1)
     207  	check (j, LLONG_MAX, 4, 2)
     208  	check (j, LLONG_MAX + 10000ULL, 4, 3)
     209  	e = 1;
     210        }
     211      #pragma omp for schedule(static) nowait
     212      for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
     213        {
     214  	check (i, -3LL * INT_MAX - 20000LL, 5, 0)
     215  	check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
     216  	check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
     217  	check (i, -20000LL + 600LL, 5, 3)
     218  	check (i, INT_MAX - 20000LL + 800LL, 5, 4)
     219  	e = 1;
     220        }
     221    }
     222    if (e)
     223      abort ();
     224    test (0, 3);
     225    test (1, 3);
     226    test (2, 1);
     227    test (3, 1);
     228    test (4, 4);
     229    test (5, 5);
     230    return 0;
     231  }
     232  
     233  int
     234  test4 (void)
     235  {
     236    int e = 0, idx;
     237  
     238  #pragma omp parallel reduction(+:e)
     239    {
     240      long long i;
     241      unsigned long long j;
     242      #pragma omp for schedule(static,1) nowait
     243      for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
     244        {
     245  	check (i, LLONG_MAX - 30001, 0, 0)
     246  	check (i, LLONG_MAX - 20001, 0, 1)
     247  	check (i, LLONG_MAX - 10001, 0, 2)
     248  	e = 1;
     249        }
     250      #pragma omp for schedule(static,1) nowait
     251      for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
     252        {
     253  	check (i, -LLONG_MAX + 30000, 1, 0)
     254  	check (i, -LLONG_MAX + 20000, 1, 1)
     255  	check (i, -LLONG_MAX + 10000, 1, 2)
     256  	e = 1;
     257        }
     258      #pragma omp for schedule(static,1) nowait
     259      for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
     260        {
     261  	check (j, 20, 2, 0)
     262  	e = 1;
     263        }
     264      #pragma omp for schedule(static,1) nowait
     265      for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
     266        {
     267  	check (j, ULLONG_MAX - 3, 3, 0)
     268  	e = 1;
     269        }
     270      #pragma omp for schedule(static,1) nowait
     271      for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
     272        {
     273  	check (j, LLONG_MAX - 20000ULL, 4, 0)
     274  	check (j, LLONG_MAX - 10000ULL, 4, 1)
     275  	check (j, LLONG_MAX, 4, 2)
     276  	check (j, LLONG_MAX + 10000ULL, 4, 3)
     277  	e = 1;
     278        }
     279      #pragma omp for schedule(static,1) nowait
     280      for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
     281        {
     282  	check (i, -3LL * INT_MAX - 20000LL, 5, 0)
     283  	check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
     284  	check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
     285  	check (i, -20000LL + 600LL, 5, 3)
     286  	check (i, INT_MAX - 20000LL + 800LL, 5, 4)
     287  	e = 1;
     288        }
     289    }
     290    if (e)
     291      abort ();
     292    test (0, 3);
     293    test (1, 3);
     294    test (2, 1);
     295    test (3, 1);
     296    test (4, 4);
     297    test (5, 5);
     298    return 0;
     299  }
     300  
     301  int
     302  test5 (void)
     303  {
     304    int e = 0, idx;
     305  
     306  #pragma omp parallel reduction(+:e)
     307    {
     308      long long i;
     309      unsigned long long j;
     310      #pragma omp for schedule(runtime) nowait
     311      for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000)
     312        {
     313  	check (i, LLONG_MAX - 30001, 0, 0)
     314  	check (i, LLONG_MAX - 20001, 0, 1)
     315  	check (i, LLONG_MAX - 10001, 0, 2)
     316  	e = 1;
     317        }
     318      #pragma omp for schedule(runtime) nowait
     319      for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000)
     320        {
     321  	check (i, -LLONG_MAX + 30000, 1, 0)
     322  	check (i, -LLONG_MAX + 20000, 1, 1)
     323  	check (i, -LLONG_MAX + 10000, 1, 2)
     324  	e = 1;
     325        }
     326      #pragma omp for schedule(runtime) nowait
     327      for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL)
     328        {
     329  	check (j, 20, 2, 0)
     330  	e = 1;
     331        }
     332      #pragma omp for schedule(runtime) nowait
     333      for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL)
     334        {
     335  	check (j, ULLONG_MAX - 3, 3, 0)
     336  	e = 1;
     337        }
     338      #pragma omp for schedule(runtime) nowait
     339      for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL)
     340        {
     341  	check (j, LLONG_MAX - 20000ULL, 4, 0)
     342  	check (j, LLONG_MAX - 10000ULL, 4, 1)
     343  	check (j, LLONG_MAX, 4, 2)
     344  	check (j, LLONG_MAX + 10000ULL, 4, 3)
     345  	e = 1;
     346        }
     347      #pragma omp for schedule(runtime) nowait
     348      for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL)
     349        {
     350  	check (i, -3LL * INT_MAX - 20000LL, 5, 0)
     351  	check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
     352  	check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
     353  	check (i, -20000LL + 600LL, 5, 3)
     354  	check (i, INT_MAX - 20000LL + 800LL, 5, 4)
     355  	e = 1;
     356        }
     357    }
     358    if (e)
     359      abort ();
     360    test (0, 3);
     361    test (1, 3);
     362    test (2, 1);
     363    test (3, 1);
     364    test (4, 4);
     365    test (5, 5);
     366    return 0;
     367  }
     368  
     369  int
     370  main (void)
     371  {
     372    if (2 * sizeof (int) != sizeof (long long))
     373      return 0;
     374    test1 ();
     375    test2 ();
     376    test3 ();
     377    test4 ();
     378    omp_set_schedule (omp_sched_static, 0);
     379    test5 ();
     380    omp_set_schedule (omp_sched_static, 3);
     381    test5 ();
     382    omp_set_schedule (omp_sched_dynamic, 5);
     383    test5 ();
     384    omp_set_schedule (omp_sched_guided, 2);
     385    test5 ();
     386    return 0;
     387  }