sgen_qsort (void * base, size_t nel, size_t width, int (*<T4b4>) (const void *, const void *) compar)
{
  unsigned int width.0;
  int width.1;
  int D.17183;
  sizetype D.17184;
  bitsizetype D.17185;
  bitsizetype D.17186;
  unsigned char[0:D.17184] * pivot_tmp.2;
  unsigned int width.3;
  int width.4;
  int D.17190;
  sizetype D.17191;
  bitsizetype D.17192;
  bitsizetype D.17193;
  unsigned char[0:D.17191] * swap_tmp.5;
  unsigned char[0:D.17184] * D.17195;
  unsigned char[0:D.17191] * D.17196;
  void * saved_stack.6;
  unsigned char pivot_tmp[0:D.17184] [value-expr: *pivot_tmp.2];
  unsigned char swap_tmp[0:D.17191] [value-expr: *swap_tmp.5];

  saved_stack.6 = __builtin_stack_save ();
  try
    {
      width.0 = width;
      width.1 = (int) width.0;
      D.17183 = width.1 + -1;
      D.17184 = (sizetype) D.17183;
      D.17185 = (bitsizetype) width.0;
      D.17186 = D.17185 * 8;
      D.17185 = (bitsizetype) width.0;
      D.17186 = D.17185 * 8;
      pivot_tmp.2 = __builtin_alloca_with_align (width.0, 8);
      width.3 = width;
      width.4 = (int) width.3;
      D.17190 = width.4 + -1;
      D.17191 = (sizetype) D.17190;
      D.17192 = (bitsizetype) width.3;
      D.17193 = D.17192 * 8;
      D.17192 = (bitsizetype) width.3;
      D.17193 = D.17192 * 8;
      swap_tmp.5 = __builtin_alloca_with_align (width.3, 8);
      D.17195 = pivot_tmp.2;
      D.17196 = swap_tmp.5;
      qsort_rec (base, nel, width, compar, D.17195, D.17196);
    }
  finally
    {
      __builtin_stack_restore (saved_stack.6);
    }
}


qsort_rec (void * base, size_t nel, size_t width, int (*<T4b4>) (const void *, const void *) compar, unsigned char * pivot_tmp, unsigned char * swap_tmp)
{
  unsigned int D.17202;
  unsigned int D.17203;
  void * D.17204;
  unsigned int D.17205;
  unsigned int D.17206;
  size_t pivot_idx;

  if (nel <= 1) goto <D.17198>; else goto <D.17199>;
  <D.17198>:
  return;
  <D.17199>:
  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.17200>; else goto <D.17201>;
  <D.17200>:
  D.17202 = pivot_idx + 1;
  D.17203 = D.17202 * width;
  D.17204 = base + D.17203;
  D.17205 = nel - pivot_idx;
  D.17206 = D.17205 + 4294967295;
  qsort_rec (D.17204, D.17206, width, compar, pivot_tmp, swap_tmp);
  <D.17201>:
}


partition (void * base, size_t nel, size_t width, int (*<T4b4>) (const void *, const void *) compar, unsigned char * pivot_tmp, unsigned char * swap_tmp)
{
  unsigned int D.17208;
  unsigned char * D.17209;
  unsigned int D.17212;
  unsigned char * D.17213;
  unsigned int D.17214;
  unsigned char * D.17215;
  unsigned int D.17216;
  const void * D.17217;
  int D.17218;
  unsigned int D.17223;
  unsigned char * D.17224;
  unsigned int D.17225;
  unsigned char * D.17226;
  unsigned int D.17227;
  unsigned int D.17230;
  unsigned char * D.17231;
  unsigned int D.17232;
  unsigned char * D.17233;
  size_t D.17234;
  size_t pivot_idx;
  size_t s;
  size_t i;

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

    __i = pivot_idx;
    __j = nel + 4294967295;
    if (__i != __j) goto <D.17210>; else goto <D.17211>;
    <D.17210>:
    D.17212 = __i * width;
    D.17213 = base + D.17212;
    memcpy (swap_tmp, D.17213, width);
    D.17212 = __i * width;
    D.17213 = base + D.17212;
    D.17214 = __j * width;
    D.17215 = base + D.17214;
    memcpy (D.17213, D.17215, width);
    D.17214 = __j * width;
    D.17215 = base + D.17214;
    memcpy (D.17215, swap_tmp, width);
    <D.17211>:
  }
  s = 0;
  i = 0;
  goto <D.17155>;
  <D.17154>:
  D.17216 = i * width;
  D.17217 = base + D.17216;
  D.17218 = compar (D.17217, pivot_tmp);
  if (D.17218 <= 0) goto <D.17219>; else goto <D.17220>;
  <D.17219>:
  {
    size_t __i;
    size_t __j;

    __i = i;
    __j = s;
    if (__i != __j) goto <D.17221>; else goto <D.17222>;
    <D.17221>:
    D.17223 = __i * width;
    D.17224 = base + D.17223;
    memcpy (swap_tmp, D.17224, width);
    D.17223 = __i * width;
    D.17224 = base + D.17223;
    D.17225 = __j * width;
    D.17226 = base + D.17225;
    memcpy (D.17224, D.17226, width);
    D.17225 = __j * width;
    D.17226 = base + D.17225;
    memcpy (D.17226, swap_tmp, width);
    <D.17222>:
  }
  s = s + 1;
  <D.17220>:
  i = i + 1;
  <D.17155>:
  D.17227 = nel + 4294967295;
  if (D.17227 > i) goto <D.17154>; else goto <D.17156>;
  <D.17156>:
  {
    size_t __i;
    size_t __j;

    __i = s;
    __j = nel + 4294967295;
    if (__i != __j) goto <D.17228>; else goto <D.17229>;
    <D.17228>:
    D.17230 = __i * width;
    D.17231 = base + D.17230;
    memcpy (swap_tmp, D.17231, width);
    D.17230 = __i * width;
    D.17231 = base + D.17230;
    D.17232 = __j * width;
    D.17233 = base + D.17232;
    memcpy (D.17231, D.17233, width);
    D.17232 = __j * width;
    D.17233 = base + D.17232;
    memcpy (D.17233, swap_tmp, width);
    <D.17229>:
  }
  D.17234 = s;
  return D.17234;
}


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

  D.17237 = __builtin_object_size (__dest, 0);
  D.17236 = __builtin___memcpy_chk (__dest, __src, __len, D.17237);
  return D.17236;
}


