sgen_qsort (void * base, size_t nel, size_t width, int (*<T4c5>) (const void *, const void *) compar)
{
  unsigned int width.0;
  int width.1;
  int D.17203;
  sizetype D.17204;
  bitsizetype D.17205;
  bitsizetype D.17206;
  unsigned char[0:D.17204] * pivot_tmp.2;
  unsigned int width.3;
  int width.4;
  int D.17210;
  sizetype D.17211;
  bitsizetype D.17212;
  bitsizetype D.17213;
  unsigned char[0:D.17211] * swap_tmp.5;
  unsigned char[0:D.17211] * D.17215;
  unsigned char[0:D.17204] * D.17216;
  void * saved_stack.6;
  unsigned char pivot_tmp[0:D.17204] [value-expr: *pivot_tmp.2];
  unsigned char swap_tmp[0:D.17211] [value-expr: *swap_tmp.5];

  saved_stack.6 = __builtin_stack_save ();
  try
    {
      width.0 = width;
      width.1 = (int) width.0;
      D.17203 = width.1 + -1;
      D.17204 = (sizetype) D.17203;
      D.17205 = (bitsizetype) width.0;
      D.17206 = D.17205 * 8;
      D.17205 = (bitsizetype) width.0;
      D.17206 = D.17205 * 8;
      pivot_tmp.2 = __builtin_alloca_with_align (width.0, 8);
      width.3 = width;
      width.4 = (int) width.3;
      D.17210 = width.4 + -1;
      D.17211 = (sizetype) D.17210;
      D.17212 = (bitsizetype) width.3;
      D.17213 = D.17212 * 8;
      D.17212 = (bitsizetype) width.3;
      D.17213 = D.17212 * 8;
      swap_tmp.5 = __builtin_alloca_with_align (width.3, 8);
      D.17215 = swap_tmp.5;
      D.17216 = pivot_tmp.2;
      qsort_rec (base, nel, width, compar, D.17216, D.17215);
    }
  finally
    {
      __builtin_stack_restore (saved_stack.6);
    }
}


qsort_rec (void * base, size_t nel, size_t width, int (*<T4c5>) (const void *, const void *) compar, unsigned char * pivot_tmp, unsigned char * swap_tmp)
{
  unsigned int D.17222;
  unsigned int D.17223;
  unsigned int D.17224;
  unsigned int D.17225;
  void * D.17226;
  size_t pivot_idx;

  if (nel <= 1) goto <D.17218>; else goto <D.17219>;
  <D.17218>:
  return;
  <D.17219>:
  pivot_idx = partition (base, nel, width, compar, pivot_tmp, swap_tmp);
  qsort_rec (base, pivot_idx, width, compar, pivot_tmp, swap_tmp);
  if (pivot_idx < nel) goto <D.17220>; else goto <D.17221>;
  <D.17220>:
  D.17222 = nel - pivot_idx;
  D.17223 = D.17222 + 4294967295;
  D.17224 = pivot_idx + 1;
  D.17225 = D.17224 * width;
  D.17226 = base + D.17225;
  qsort_rec (D.17226, D.17223, width, compar, pivot_tmp, swap_tmp);
  <D.17221>:
}


partition (void * base, size_t nel, size_t width, int (*<T4c5>) (const void *, const void *) compar, unsigned char * pivot_tmp, unsigned char * swap_tmp)
{
  unsigned int D.17228;
  unsigned char * D.17229;
  unsigned int D.17232;
  unsigned char * D.17233;
  unsigned int D.17234;
  unsigned char * D.17235;
  unsigned int D.17236;
  const void * D.17237;
  int D.17238;
  unsigned int D.17243;
  unsigned char * D.17244;
  unsigned int D.17245;
  unsigned char * D.17246;
  unsigned int D.17247;
  unsigned int D.17250;
  unsigned char * D.17251;
  unsigned int D.17252;
  unsigned char * D.17253;
  size_t D.17254;
  size_t pivot_idx;
  size_t s;
  size_t i;

  pivot_idx = nel >> 1;
  D.17228 = pivot_idx * width;
  D.17229 = base + D.17228;
  memcpy (pivot_tmp, D.17229, width);
  {
    size_t __i;
    size_t __j;

    __i = pivot_idx;
    __j = nel + 4294967295;
    if (__i != __j) goto <D.17230>; else goto <D.17231>;
    <D.17230>:
    D.17232 = __i * width;
    D.17233 = base + D.17232;
    memcpy (swap_tmp, D.17233, width);
    D.17234 = __j * width;
    D.17235 = base + D.17234;
    D.17232 = __i * width;
    D.17233 = base + D.17232;
    memcpy (D.17233, D.17235, width);
    D.17234 = __j * width;
    D.17235 = base + D.17234;
    memcpy (D.17235, swap_tmp, width);
    <D.17231>:
  }
  s = 0;
  i = 0;
  goto <D.17175>;
  <D.17174>:
  D.17236 = i * width;
  D.17237 = base + D.17236;
  D.17238 = compar (D.17237, pivot_tmp);
  if (D.17238 <= 0) goto <D.17239>; else goto <D.17240>;
  <D.17239>:
  {
    size_t __i;
    size_t __j;

    __i = i;
    __j = s;
    if (__i != __j) goto <D.17241>; else goto <D.17242>;
    <D.17241>:
    D.17243 = __i * width;
    D.17244 = base + D.17243;
    memcpy (swap_tmp, D.17244, width);
    D.17245 = __j * width;
    D.17246 = base + D.17245;
    D.17243 = __i * width;
    D.17244 = base + D.17243;
    memcpy (D.17244, D.17246, width);
    D.17245 = __j * width;
    D.17246 = base + D.17245;
    memcpy (D.17246, swap_tmp, width);
    <D.17242>:
  }
  s = s + 1;
  <D.17240>:
  i = i + 1;
  <D.17175>:
  D.17247 = nel + 4294967295;
  if (D.17247 > i) goto <D.17174>; else goto <D.17176>;
  <D.17176>:
  {
    size_t __i;
    size_t __j;

    __i = s;
    __j = nel + 4294967295;
    if (__i != __j) goto <D.17248>; else goto <D.17249>;
    <D.17248>:
    D.17250 = __i * width;
    D.17251 = base + D.17250;
    memcpy (swap_tmp, D.17251, width);
    D.17252 = __j * width;
    D.17253 = base + D.17252;
    D.17250 = __i * width;
    D.17251 = base + D.17250;
    memcpy (D.17251, D.17253, width);
    D.17252 = __j * width;
    D.17253 = base + D.17252;
    memcpy (D.17253, swap_tmp, width);
    <D.17249>:
  }
  D.17254 = s;
  return D.17254;
}


memcpy (void * restrict __dest, const void * restrict __src, size_t __len)
{
  void * D.17256;
  unsigned int D.17257;

  D.17257 = __builtin_object_size (__dest, 0);
  D.17256 = __builtin___memcpy_chk (__dest, __src, __len, D.17257);
  return D.17256;
}


