#include <omp.h>
#include <stdlib.h>
#include <string.h>

int
test1 ()
{
  short int buf[64], *p;
  int i;
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
  for (p = &buf[10]; &buf[54] > p; p++)
    *p = 5;
  for (i = 0; i < 64; i++)
    if (buf[i] != 5 * (i >= 10 && i < 54))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
  for (p = &buf[3]; &buf[63] >= p; p += 2)
    p[-2] = 6;
  for (i = 0; i < 64; i++)
    if (buf[i] != 6 * ((i & 1) && i <= 61))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
  for (p = &buf[16]; &buf[51] > p; p = 4 + p)
    p[2] = 7;
  for (i = 0; i < 64; i++)
    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
  for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
    p[2] = -7;
  for (i = 0; i < 64; i++)
    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
  for (p = &buf[53]; &buf[9] < p; --p)
    *p = 5;
  for (i = 0; i < 64; i++)
    if (buf[i] != 5 * (i >= 10 && i < 54))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
  for (p = &buf[63]; &buf[3] <= p; p -= 2)
    p[-2] = 6;
  for (i = 0; i < 64; i++)
    if (buf[i] != 6 * ((i & 1) && i <= 61))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
  for (p = &buf[48]; &buf[15] < p; p = -4 + p)
    p[2] = 7;
  for (i = 0; i < 64; i++)
    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for
  for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
    p[2] = -7;
  for (i = 0; i < 64; i++)
    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
      abort ();
  return 0;
}

int
test2 ()
{
  int buf[64], *p;
  int i;
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
  for (p = &buf[10]; &buf[54] > p; p++)
    *p = 5;
  for (i = 0; i < 64; i++)
    if (buf[i] != 5 * (i >= 10 && i < 54))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
  for (p = &buf[3]; &buf[63] >= p; p += 2)
    p[-2] = 6;
  for (i = 0; i < 64; i++)
    if (buf[i] != 6 * ((i & 1) && i <= 61))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
  for (p = &buf[16]; &buf[51] > p; p = 4 + p)
    p[2] = 7;
  for (i = 0; i < 64; i++)
    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
  for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
    p[2] = -7;
  for (i = 0; i < 64; i++)
    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
  for (p = &buf[53]; &buf[9] < p; --p)
    *p = 5;
  for (i = 0; i < 64; i++)
    if (buf[i] != 5 * (i >= 10 && i < 54))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
  for (p = &buf[63]; &buf[3] <= p; p -= 2)
    p[-2] = 6;
  for (i = 0; i < 64; i++)
    if (buf[i] != 6 * ((i & 1) && i <= 61))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
  for (p = &buf[48]; &buf[15] < p; p = -4 + p)
    p[2] = 7;
  for (i = 0; i < 64; i++)
    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (static, 3)
  for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
    p[2] = -7;
  for (i = 0; i < 64; i++)
    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
      abort ();
  return 0;
}

int
test3 ()
{
  int buf[64], *p;
  int i;
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
  for (p = &buf[10]; &buf[54] > p; p++)
    *p = 5;
  for (i = 0; i < 64; i++)
    if (buf[i] != 5 * (i >= 10 && i < 54))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
  for (p = &buf[3]; &buf[63] >= p; p += 2)
    p[-2] = 6;
  for (i = 0; i < 64; i++)
    if (buf[i] != 6 * ((i & 1) && i <= 61))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
  for (p = &buf[16]; &buf[51] > p; p = 4 + p)
    p[2] = 7;
  for (i = 0; i < 64; i++)
    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
  for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
    p[2] = -7;
  for (i = 0; i < 64; i++)
    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
  for (p = &buf[53]; &buf[9] < p; --p)
    *p = 5;
  for (i = 0; i < 64; i++)
    if (buf[i] != 5 * (i >= 10 && i < 54))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
  for (p = &buf[63]; &buf[3] <= p; p -= 2)
    p[-2] = 6;
  for (i = 0; i < 64; i++)
    if (buf[i] != 6 * ((i & 1) && i <= 61))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
  for (p = &buf[48]; &buf[15] < p; p = -4 + p)
    p[2] = 7;
  for (i = 0; i < 64; i++)
    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (dynamic, 3)
  for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
    p[2] = -7;
  for (i = 0; i < 64; i++)
    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
      abort ();
  return 0;
}

int
test4 ()
{
  int buf[64], *p;
  int i;
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
  for (p = &buf[10]; &buf[54] > p; p++)
    *p = 5;
  for (i = 0; i < 64; i++)
    if (buf[i] != 5 * (i >= 10 && i < 54))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
  for (p = &buf[3]; &buf[63] >= p; p += 2)
    p[-2] = 6;
  for (i = 0; i < 64; i++)
    if (buf[i] != 6 * ((i & 1) && i <= 61))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
  for (p = &buf[16]; &buf[51] > p; p = 4 + p)
    p[2] = 7;
  for (i = 0; i < 64; i++)
    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
  for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
    p[2] = -7;
  for (i = 0; i < 64; i++)
    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
  for (p = &buf[53]; &buf[9] < p; --p)
    *p = 5;
  for (i = 0; i < 64; i++)
    if (buf[i] != 5 * (i >= 10 && i < 54))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
  for (p = &buf[63]; &buf[3] <= p; p -= 2)
    p[-2] = 6;
  for (i = 0; i < 64; i++)
    if (buf[i] != 6 * ((i & 1) && i <= 61))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
  for (p = &buf[48]; &buf[15] < p; p = -4 + p)
    p[2] = 7;
  for (i = 0; i < 64; i++)
    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
      abort ();
  memset (buf, '\0', sizeof (buf));
#pragma omp parallel for schedule (runtime)
  for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
    p[2] = -7;
  for (i = 0; i < 64; i++)
    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
      abort ();
  return 0;
}

int
main ()
{
  test1 ();
  test2 ();
  test3 ();
  omp_set_schedule (omp_sched_static, 0);
  test4 ();
  omp_set_schedule (omp_sched_static, 3);
  test4 ();
  omp_set_schedule (omp_sched_dynamic, 5);
  test4 ();
  omp_set_schedule (omp_sched_guided, 2);
  test4 ();
  return 0;
}
