/* { dg-do compile } */
/* { dg-require-effective-target fgraphite } */
/* { dg-require-effective-target pthread } */
/* { dg-options "-floop-parallelize-all -fsave-optimization-record -ftree-parallelize-loops=2 -ftree-slp-vectorize" } */

#include <stdint.h>
#include <stdlib.h>

signed char qq;
int rm, mu, l9;
long long unsigned int ip;

void
fi (void)
{
}

void
il (long long unsigned int c5)
{
  int *na = &mu;

  while (l9 < 1)
    {
      if (qq < 1)
        {
          short int ds = 0;

          if ((ip - *na - ip / c5 != 0) && (*na / ((c5 + c5) && !!ip) != 0))
            __builtin_trap ();

          rm = -1 / (!!rm && !!c5);

          while (qq < 1)
            {
              ++*na;
              ++ip;
              if (*na < (int) ip)
                while (ds < 2)
                  {
                    ++qq;
                    ++ds;
                  }
            }
        }

      ++l9;
    }

  for (;;)
    {
    }
}

void
uu (short int wk)
{
  int64_t tl = ip;

  while (ip < 2)
    {
      signed char vn;

      for (vn = 1; vn != 0; ++vn)
        {
          int rh;

          if (qq < 1)
            {
              while (mu < 1)
                ip = 0;

              while (rm != 0)
                ++rm;
            }

          for (rh = 0; rh < 3; ++rh)
            {
              int ab;

              for (ab = 0; ab < 5; ++ab)
                {
                  tl -= qq;
                  wk += rh - tl;
                  ip += (ab < wk) + wk;
                }
            }
        }
    }
}

void
im (uint8_t kt)
{
  int wu = 0;

  for (;;)
    {
      ++rm;
      if (rm < 1)
        {
          short int ms = 0;

          while (kt < 1)
            {
              ms += rm < 0;

              if (wu != 0)
                for (;;)
                  {
                  }

              while (ms < 4)
                {
                  while (wu < 1)
                    wu += 2;

                  ++ms;
                }
            }

          if (ms == 0 || wu == 0)
            break;
        }
    }

  while (wu < 1)
    while (qq < 1)
      ++qq;
}
