#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
void quicksort3way_i_(const int *a, size_t indx[], const size_t n,
                      const size_t crit_size) {
  size_t i, j, p, q, k;
  if (n <= crit_size) {
    for (i = 1; i < n; ++i) {
      size_t it = indx[i];
      for (j = i; j > 0 && (a[it] < a[indx[j - 1]]); --j) {
        indx[j] = indx[j - 1];
      }
      indx[j] = it;
    }
    return;
  }
  int pvt = a[indx[n - 1]];
  for (i = 0; (a[indx[i]] < pvt); ++i)
    ;
  for (j = n - 2; (pvt < a[indx[j]]) && j > 0; --j)
    ;
  p = 0;
  q = n - 1;
  if (i < j) {
    {
      size_t t = indx[i];
      indx[i] = indx[j];
      indx[j] = t;
    };
    if ((a[indx[i]] == pvt)) {
      {
        size_t t = indx[p];
        indx[p] = indx[i];
        indx[i] = t;
      };
    }
    if ((a[indx[j]] == pvt)) {
      q--;
      {
        size_t t = indx[q];
        indx[q] = indx[j];
        indx[j] = t;
      };
    }
    for (;;) {
      while (++i, (a[indx[i]] < pvt))
        ;
      while (--j, (pvt < a[indx[j]])) {
        if (j == 0)
          break;
      }
      if (i >= j)
        break;
      {
        size_t t = indx[i];
        indx[i] = indx[j];
        indx[j] = t;
      };
      if ((a[indx[i]] == pvt)) {
        if (p)
          p++;
        {
          size_t t = indx[p];
          indx[p] = indx[i];
          indx[i] = t;
        };
      }
      if ((a[indx[j]] == pvt)) {
        q--;
        {
          size_t t = indx[q];
          indx[q] = indx[j];
          indx[j] = t;
        };
      }
    }
  }
  {
    size_t t = indx[i];
    indx[i] = indx[n - 1];
    indx[n - 1] = t;
  };
  j = i - 1;
  i++;
  for (k = 0; k < p; k++, j--) {
    {
      size_t t = indx[k];
      indx[k] = indx[j];
      indx[j] = t;
    };
  }
  for (k = n - 2; k > q; k--, i++) {
    {
      size_t t = indx[i];
      indx[i] = indx[k];
      indx[k] = t;
    };
  }
  quicksort3way_i_(a, indx, j + 1, crit_size);
  quicksort3way_i_(a, indx + i, n - i, crit_size);
}


x86 assembly (clang, -O0):
<quicksort3way_i_>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     120b <quicksort3way_i_+0xfb>
movq   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    1206 <quicksort3way_i_+0xf6>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x30(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x30(%rbp)
mov    %al,-0xa1(%rbp)
jbe    11a5 <quicksort3way_i_+0x95>
mov    -0x8(%rbp),%rax
mov    -0x50(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
mov    -0x10(%rbp),%rdx
mov    -0x30(%rbp),%rsi
sub    $0x1,%rsi
mov    (%rdx,%rsi,8),%rdx
cmp    (%rcx,%rdx,4),%eax
setl   %al
mov    %al,-0xa1(%rbp)
mov    -0xa1(%rbp),%al
test   $0x1,%al
jne    11b8 <quicksort3way_i_+0xa8>
jmp    11e5 <quicksort3way_i_+0xd5>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    $0x1,%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
jmp    1167 <quicksort3way_i_+0x57>
mov    -0x50(%rbp),%rdx
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1141 <quicksort3way_i_+0x31>
jmp    16f4 <quicksort3way_i_+0x5e4>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rdx
sub    $0x1,%rdx
mov    (%rcx,%rdx,8),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x54(%rbp)
movq   $0x0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x28(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x54(%rbp),%eax
jge    125f <quicksort3way_i_+0x14f>
jmp    124e <quicksort3way_i_+0x13e>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    122d <quicksort3way_i_+0x11d>
mov    -0x18(%rbp),%rax
sub    $0x2,%rax
mov    %rax,-0x30(%rbp)
mov    -0x54(%rbp),%ecx
mov    -0x8(%rbp),%rdx
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rsi
mov    (%rax,%rsi,8),%rsi
xor    %eax,%eax
cmp    (%rdx,%rsi,4),%ecx
mov    %al,-0xa2(%rbp)
jge    129d <quicksort3way_i_+0x18d>
cmpq   $0x0,-0x30(%rbp)
seta   %al
mov    %al,-0xa2(%rbp)
mov    -0xa2(%rbp),%al
test   $0x1,%al
jne    12b0 <quicksort3way_i_+0x1a0>
jmp    12c6 <quicksort3way_i_+0x1b6>
jmp    12b5 <quicksort3way_i_+0x1a5>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
jmp    126b <quicksort3way_i_+0x15b>
movq   $0x0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x30(%rbp),%rax
jae    1573 <quicksort3way_i_+0x463>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x60(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x60(%rbp),%rdx
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x28(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x54(%rbp),%eax
jne    1374 <quicksort3way_i_+0x264>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x68(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x68(%rbp),%rdx
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x30(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x54(%rbp),%eax
jne    13d4 <quicksort3way_i_+0x2c4>
mov    -0x40(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x70(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x70(%rbp),%rdx
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
jmp    13d9 <quicksort3way_i_+0x2c9>
jmp    13de <quicksort3way_i_+0x2ce>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x28(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x54(%rbp),%eax
jge    140b <quicksort3way_i_+0x2fb>
jmp    13de <quicksort3way_i_+0x2ce>
jmp    1410 <quicksort3way_i_+0x300>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
mov    -0x54(%rbp),%eax
mov    -0x8(%rbp),%rcx
mov    -0x10(%rbp),%rdx
mov    -0x30(%rbp),%rsi
mov    (%rdx,%rsi,8),%rdx
cmp    (%rcx,%rdx,4),%eax
jge    144d <quicksort3way_i_+0x33d>
cmpq   $0x0,-0x30(%rbp)
jne    1448 <quicksort3way_i_+0x338>
jmp    144d <quicksort3way_i_+0x33d>
jmp    1410 <quicksort3way_i_+0x300>
mov    -0x28(%rbp),%rax
cmp    -0x30(%rbp),%rax
jb     1460 <quicksort3way_i_+0x350>
jmp    156e <quicksort3way_i_+0x45e>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x78(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x78(%rbp),%rdx
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x28(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x54(%rbp),%eax
jne    1503 <quicksort3way_i_+0x3f3>
cmpq   $0x0,-0x38(%rbp)
je     14cb <quicksort3way_i_+0x3bb>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x80(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x80(%rbp),%rdx
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x30(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x54(%rbp),%eax
jne    1569 <quicksort3way_i_+0x459>
mov    -0x40(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x88(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x88(%rbp),%rdx
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
jmp    13d9 <quicksort3way_i_+0x2c9>
jmp    1573 <quicksort3way_i_+0x463>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x90(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    $0x1,%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x90(%rbp),%rdx
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    $0x1,%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
movq   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x38(%rbp),%rax
jae    1642 <quicksort3way_i_+0x532>
mov    -0x10(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x98(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x98(%rbp),%rdx
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
jmp    15d9 <quicksort3way_i_+0x4c9>
mov    -0x18(%rbp),%rax
sub    $0x2,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x40(%rbp),%rax
jbe    16b7 <quicksort3way_i_+0x5a7>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0xa0(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0xa0(%rbp),%rdx
mov    -0x10(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x48(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    164e <quicksort3way_i_+0x53e>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x30(%rbp),%rdx
add    $0x1,%rdx
mov    -0x20(%rbp),%rcx
call   1030 <quicksort3way_i_@plt>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x28(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rsi
mov    -0x18(%rbp),%rdx
sub    -0x28(%rbp),%rdx
mov    -0x20(%rbp),%rcx
call   1030 <quicksort3way_i_@plt>
add    $0xb0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<quicksort3way_i_>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rdx,%r14
mov    %rsi,%rbp
mov    %rdi,%r15
mov    %rcx,(%rsp)
cmp    %rcx,%rdx
ja     116f <quicksort3way_i_+0x5f>
cmp    $0x2,%r14
jb     136a <quicksort3way_i_+0x25a>
mov    $0x1,%eax
jmp    133e <quicksort3way_i_+0x22e>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %r15,%rdi
mov    %rbp,%rsi
mov    (%rsp),%rbx
mov    %rbx,%rcx
call   1030 <quicksort3way_i_@plt>
lea    0x0(%rbp,%r13,8),%rbp
sub    %r13,%r14
cmp    %rbx,%r14
jbe    112d <quicksort3way_i_+0x1d>
lea    -0x1(%r14),%r8
mov    -0x8(%rbp,%r14,8),%r9
mov    (%r15,%r9,4),%esi
mov    $0xffffffffffffffff,%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    0x8(%rbp,%rdx,8),%rdi
mov    (%r15,%rdi,4),%r11d
add    $0x1,%rdx
cmp    %esi,%r11d
jl     1190 <quicksort3way_i_+0x80>
lea    -0x2(%r14),%r10
lea    0x1(%rdx),%r13
mov    %r8,%rbx
nopl   (%rax)
mov    -0x8(%rbp,%rbx,8),%rcx
lea    -0x1(%rbx),%r12
cmp    (%r15,%rcx,4),%esi
jge    11c8 <quicksort3way_i_+0xb8>
cmp    $0x1,%rbx
mov    %r12,%rbx
jne    11b0 <quicksort3way_i_+0xa0>
cmp    %r12,%rdx
jae    12a9 <quicksort3way_i_+0x199>
mov    %rcx,0x0(%rbp,%rdx,8)
mov    %rdi,0x0(%rbp,%r12,8)
mov    0x0(%rbp,%rdx,8),%rax
cmp    %esi,(%r15,%rax,4)
jne    11fc <quicksort3way_i_+0xec>
mov    0x0(%rbp),%rcx
mov    %rax,0x0(%rbp)
mov    %rcx,0x0(%rbp,%rdx,8)
mov    0x0(%rbp,%r12,8),%rdi
mov    (%r15,%rdi,4),%r11d
cmp    %esi,%r11d
jne    1220 <quicksort3way_i_+0x110>
mov    -0x10(%rbp,%r14,8),%rax
mov    %rdi,-0x10(%rbp,%r14,8)
mov    %rax,0x0(%rbp,%r12,8)
mov    %r10,%r8
jmp    1220 <quicksort3way_i_+0x110>
cmp    %esi,%ecx
je     128a <quicksort3way_i_+0x17a>
nopl   0x0(%rax)
mov    0x8(%rbp,%rdx,8),%rdi
add    $0x1,%rdx
mov    (%r15,%rdi,4),%ecx
cmp    %esi,%ecx
jl     1220 <quicksort3way_i_+0x110>
mov    %r12,%rax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    -0x1(%rax),%r12
mov    -0x8(%rbp,%rax,8),%rbx
cmp    (%r15,%rbx,4),%esi
jge    1258 <quicksort3way_i_+0x148>
cmp    $0x1,%rax
mov    %r12,%rax
jne    1240 <quicksort3way_i_+0x130>
cmp    %r12,%rdx
jae    12a0 <quicksort3way_i_+0x190>
mov    %rbx,0x0(%rbp,%rdx,8)
mov    %rdi,0x0(%rbp,%r12,8)
mov    0x0(%rbp,%rdx,8),%rax
cmp    %esi,(%r15,%rax,4)
jne    1215 <quicksort3way_i_+0x105>
mov    0x0(%rbp),%rcx
mov    %rax,0x0(%rbp)
mov    %rcx,0x0(%rbp,%rdx,8)
mov    0x0(%rbp,%r12,8),%rdi
mov    (%r15,%rdi,4),%ecx
jmp    1215 <quicksort3way_i_+0x105>
mov    -0x8(%rbp,%r8,8),%rax
mov    %rdi,-0x8(%rbp,%r8,8)
add    $0xffffffffffffffff,%r8
mov    %rax,0x0(%rbp,%r12,8)
jmp    1220 <quicksort3way_i_+0x110>
nop
mov    -0x8(%rbp,%r14,8),%r9
lea    0x1(%rdx),%r13
mov    %r9,0x0(%rbp,%rdx,8)
mov    %rdi,-0x8(%rbp,%r14,8)
cmp    %r8,%r10
jbe    1150 <quicksort3way_i_+0x40>
mov    %r14d,%ecx
sub    %r8d,%ecx
lea    -0x3(%r14),%rax
test   $0x1,%cl
je     12e6 <quicksort3way_i_+0x1d6>
mov    0x0(%rbp,%r13,8),%rcx
mov    -0x10(%rbp,%r14,8),%rsi
mov    %rsi,0x0(%rbp,%r13,8)
mov    %rcx,-0x10(%rbp,%r14,8)
add    $0x1,%r13
mov    %rax,%r10
cmp    %r8,%rax
je     1150 <quicksort3way_i_+0x40>
nop
mov    0x0(%rbp,%r13,8),%rax
mov    0x0(%rbp,%r10,8),%rcx
mov    %rcx,0x0(%rbp,%r13,8)
mov    %rax,0x0(%rbp,%r10,8)
mov    0x8(%rbp,%r13,8),%rax
mov    -0x8(%rbp,%r10,8),%rcx
mov    %rcx,0x8(%rbp,%r13,8)
mov    %rax,-0x8(%rbp,%r10,8)
add    $0xfffffffffffffffe,%r10
add    $0x2,%r13
cmp    %r8,%r10
ja     12f0 <quicksort3way_i_+0x1e0>
jmp    1150 <quicksort3way_i_+0x40>
nopw   0x0(%rax,%rax,1)
mov    %rcx,0x0(%rbp,%rdx,8)
add    $0x1,%rax
cmp    %r14,%rax
je     136a <quicksort3way_i_+0x25a>
mov    0x0(%rbp,%rax,8),%rcx
mov    (%r15,%rcx,4),%esi
mov    %rax,%rdx
nopw   0x0(%rax,%rax,1)
mov    -0x8(%rbp,%rdx,8),%rdi
cmp    (%r15,%rdi,4),%esi
jge    1330 <quicksort3way_i_+0x220>
mov    %rdi,0x0(%rbp,%rdx,8)
add    $0xffffffffffffffff,%rdx
jne    1350 <quicksort3way_i_+0x240>
xor    %edx,%edx
jmp    1330 <quicksort3way_i_+0x220>
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @quicksort3way_i_(i32* %0, i64* %1, i64 %2, i64 %3) {
%5 = alloca i32*
%6 = alloca i64*
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
%12 = alloca i64
%13 = alloca i64
%14 = alloca i64
%15 = alloca i32
%16 = alloca i64
%17 = alloca i64
%18 = alloca i64
%19 = alloca i64
%20 = alloca i64
%21 = alloca i64
%22 = alloca i64
%23 = alloca i64
%24 = alloca i64
store i32* %0, i32** %5
store i64* %1, i64** %6
store i64 %2, i64* %7
store i64 %3, i64* %8
%25 = load i64, i64* %7
%26 = load i64, i64* %8
%27 = icmp ule i64 %25, %26
br i1 %27, label %28, label %79
28: ; preds = %4
store i64 1, i64* %9
br label %29
29: ; preds = %75, %28
%30 = load i64, i64* %9
%31 = load i64, i64* %7
%32 = icmp ult i64 %30, %31
br i1 %32, label %33, label %78
33: ; preds = %29
%34 = load i64*, i64** %6
%35 = load i64, i64* %9
%36 = getelementptr inbounds i64, i64* %34, i64 %35
%37 = load i64, i64* %36
store i64 %37, i64* %14
%38 = load i64, i64* %9
store i64 %38, i64* %10
br label %39
39: ; preds = %67, %33
%40 = load i64, i64* %10
%41 = icmp ugt i64 %40, 0
br i1 %41, label %42, label %56
42: ; preds = %39
%43 = load i32*, i32** %5
%44 = load i64, i64* %14
%45 = getelementptr inbounds i32, i32* %43, i64 %44
%46 = load i32, i32* %45
%47 = load i32*, i32** %5
%48 = load i64*, i64** %6
%49 = load i64, i64* %10
%50 = sub i64 %49, 1
%51 = getelementptr inbounds i64, i64* %48, i64 %50
%52 = load i64, i64* %51
%53 = getelementptr inbounds i32, i32* %47, i64 %52
%54 = load i32, i32* %53
%55 = icmp slt i32 %46, %54
br label %56
56: ; preds = %42, %39
%57 = phi i1 [ false, %39 ], [ %55, %42 ]
br i1 %57, label %58, label %70
58: ; preds = %56
%59 = load i64*, i64** %6
%60 = load i64, i64* %10
%61 = sub i64 %60, 1
%62 = getelementptr inbounds i64, i64* %59, i64 %61
%63 = load i64, i64* %62
%64 = load i64*, i64** %6
%65 = load i64, i64* %10
%66 = getelementptr inbounds i64, i64* %64, i64 %65
store i64 %63, i64* %66
br label %67
67: ; preds = %58
%68 = load i64, i64* %10
%69 = add i64 %68, -1
store i64 %69, i64* %10
br label %39
70: ; preds = %56
%71 = load i64, i64* %14
%72 = load i64*, i64** %6
%73 = load i64, i64* %10
%74 = getelementptr inbounds i64, i64* %72, i64 %73
store i64 %71, i64* %74
br label %75
75: ; preds = %70
%76 = load i64, i64* %9
%77 = add i64 %76, 1
store i64 %77, i64* %9
br label %29
78: ; preds = %29
br label %403
79: ; preds = %4
%80 = load i32*, i32** %5
%81 = load i64*, i64** %6
%82 = load i64, i64* %7
%83 = sub i64 %82, 1
%84 = getelementptr inbounds i64, i64* %81, i64 %83
%85 = load i64, i64* %84
%86 = getelementptr inbounds i32, i32* %80, i64 %85
%87 = load i32, i32* %86
store i32 %87, i32* %15
store i64 0, i64* %9
br label %88
88: ; preds = %99, %79
%89 = load i32*, i32** %5
%90 = load i64*, i64** %6
%91 = load i64, i64* %9
%92 = getelementptr inbounds i64, i64* %90, i64 %91
%93 = load i64, i64* %92
%94 = getelementptr inbounds i32, i32* %89, i64 %93
%95 = load i32, i32* %94
%96 = load i32, i32* %15
%97 = icmp slt i32 %95, %96
br i1 %97, label %98, label %102
98: ; preds = %88
br label %99
99: ; preds = %98
%100 = load i64, i64* %9
%101 = add i64 %100, 1
store i64 %101, i64* %9
br label %88
102: ; preds = %88
%103 = load i64, i64* %7
%104 = sub i64 %103, 2
store i64 %104, i64* %10
br label %105
105: ; preds = %121, %102
%106 = load i32, i32* %15
%107 = load i32*, i32** %5
%108 = load i64*, i64** %6
%109 = load i64, i64* %10
%110 = getelementptr inbounds i64, i64* %108, i64 %109
%111 = load i64, i64* %110
%112 = getelementptr inbounds i32, i32* %107, i64 %111
%113 = load i32, i32* %112
%114 = icmp slt i32 %106, %113
br i1 %114, label %115, label %118
115: ; preds = %105
%116 = load i64, i64* %10
%117 = icmp ugt i64 %116, 0
br label %118
118: ; preds = %115, %105
%119 = phi i1 [ false, %105 ], [ %117, %115 ]
br i1 %119, label %120, label %124
120: ; preds = %118
br label %121
121: ; preds = %120
%122 = load i64, i64* %10
%123 = add i64 %122, -1
store i64 %123, i64* %10
br label %105
124: ; preds = %118
store i64 0, i64* %11
%125 = load i64, i64* %7
%126 = sub i64 %125, 1
store i64 %126, i64* %12
%127 = load i64, i64* %9
%128 = load i64, i64* %10
%129 = icmp ult i64 %127, %128
br i1 %129, label %130, label %314
130: ; preds = %124
%131 = load i64*, i64** %6
%132 = load i64, i64* %9
%133 = getelementptr inbounds i64, i64* %131, i64 %132
%134 = load i64, i64* %133
store i64 %134, i64* %16
%135 = load i64*, i64** %6
%136 = load i64, i64* %10
%137 = getelementptr inbounds i64, i64* %135, i64 %136
%138 = load i64, i64* %137
%139 = load i64*, i64** %6
%140 = load i64, i64* %9
%141 = getelementptr inbounds i64, i64* %139, i64 %140
store i64 %138, i64* %141
%142 = load i64, i64* %16
%143 = load i64*, i64** %6
%144 = load i64, i64* %10
%145 = getelementptr inbounds i64, i64* %143, i64 %144
store i64 %142, i64* %145
%146 = load i32*, i32** %5
%147 = load i64*, i64** %6
%148 = load i64, i64* %9
%149 = getelementptr inbounds i64, i64* %147, i64 %148
%150 = load i64, i64* %149
%151 = getelementptr inbounds i32, i32* %146, i64 %150
%152 = load i32, i32* %151
%153 = load i32, i32* %15
%154 = icmp eq i32 %152, %153
br i1 %154, label %155, label %171
155: ; preds = %130
%156 = load i64*, i64** %6
%157 = load i64, i64* %11
%158 = getelementptr inbounds i64, i64* %156, i64 %157
%159 = load i64, i64* %158
store i64 %159, i64* %17
%160 = load i64*, i64** %6
%161 = load i64, i64* %9
%162 = getelementptr inbounds i64, i64* %160, i64 %161
%163 = load i64, i64* %162
%164 = load i64*, i64** %6
%165 = load i64, i64* %11
%166 = getelementptr inbounds i64, i64* %164, i64 %165
store i64 %163, i64* %166
%167 = load i64, i64* %17
%168 = load i64*, i64** %6
%169 = load i64, i64* %9
%170 = getelementptr inbounds i64, i64* %168, i64 %169
store i64 %167, i64* %170
br label %171
171: ; preds = %155, %130
%172 = load i32*, i32** %5
%173 = load i64*, i64** %6
%174 = load i64, i64* %10
%175 = getelementptr inbounds i64, i64* %173, i64 %174
%176 = load i64, i64* %175
%177 = getelementptr inbounds i32, i32* %172, i64 %176
%178 = load i32, i32* %177
%179 = load i32, i32* %15
%180 = icmp eq i32 %178, %179
br i1 %180, label %181, label %199
181: ; preds = %171
%182 = load i64, i64* %12
%183 = add i64 %182, -1
store i64 %183, i64* %12
%184 = load i64*, i64** %6
%185 = load i64, i64* %12
%186 = getelementptr inbounds i64, i64* %184, i64 %185
%187 = load i64, i64* %186
store i64 %187, i64* %18
%188 = load i64*, i64** %6
%189 = load i64, i64* %10
%190 = getelementptr inbounds i64, i64* %188, i64 %189
%191 = load i64, i64* %190
%192 = load i64*, i64** %6
%193 = load i64, i64* %12
%194 = getelementptr inbounds i64, i64* %192, i64 %193
store i64 %191, i64* %194
%195 = load i64, i64* %18
%196 = load i64*, i64** %6
%197 = load i64, i64* %10
%198 = getelementptr inbounds i64, i64* %196, i64 %197
store i64 %195, i64* %198
br label %199
199: ; preds = %181, %171
br label %200
200: ; preds = %312, %199
br label %201
201: ; preds = %213, %200
%202 = load i64, i64* %9
%203 = add i64 %202, 1
store i64 %203, i64* %9
%204 = load i32*, i32** %5
%205 = load i64*, i64** %6
%206 = load i64, i64* %9
%207 = getelementptr inbounds i64, i64* %205, i64 %206
%208 = load i64, i64* %207
%209 = getelementptr inbounds i32, i32* %204, i64 %208
%210 = load i32, i32* %209
%211 = load i32, i32* %15
%212 = icmp slt i32 %210, %211
br i1 %212, label %213, label %214
213: ; preds = %201
br label %201
214: ; preds = %201
br label %215
215: ; preds = %231, %214
%216 = load i64, i64* %10
%217 = add i64 %216, -1
store i64 %217, i64* %10
%218 = load i32, i32* %15
%219 = load i32*, i32** %5
%220 = load i64*, i64** %6
%221 = load i64, i64* %10
%222 = getelementptr inbounds i64, i64* %220, i64 %221
%223 = load i64, i64* %222
%224 = getelementptr inbounds i32, i32* %219, i64 %223
%225 = load i32, i32* %224
%226 = icmp slt i32 %218, %225
br i1 %226, label %227, label %232
227: ; preds = %215
%228 = load i64, i64* %10
%229 = icmp eq i64 %228, 0
br i1 %229, label %230, label %231
230: ; preds = %227
br label %232
231: ; preds = %227
br label %215
232: ; preds = %230, %215
%233 = load i64, i64* %9
%234 = load i64, i64* %10
%235 = icmp uge i64 %233, %234
br i1 %235, label %236, label %237
236: ; preds = %232
br label %313
237: ; preds = %232
%238 = load i64*, i64** %6
%239 = load i64, i64* %9
%240 = getelementptr inbounds i64, i64* %238, i64 %239
%241 = load i64, i64* %240
store i64 %241, i64* %19
%242 = load i64*, i64** %6
%243 = load i64, i64* %10
%244 = getelementptr inbounds i64, i64* %242, i64 %243
%245 = load i64, i64* %244
%246 = load i64*, i64** %6
%247 = load i64, i64* %9
%248 = getelementptr inbounds i64, i64* %246, i64 %247
store i64 %245, i64* %248
%249 = load i64, i64* %19
%250 = load i64*, i64** %6
%251 = load i64, i64* %10
%252 = getelementptr inbounds i64, i64* %250, i64 %251
store i64 %249, i64* %252
%253 = load i32*, i32** %5
%254 = load i64*, i64** %6
%255 = load i64, i64* %9
%256 = getelementptr inbounds i64, i64* %254, i64 %255
%257 = load i64, i64* %256
%258 = getelementptr inbounds i32, i32* %253, i64 %257
%259 = load i32, i32* %258
%260 = load i32, i32* %15
%261 = icmp eq i32 %259, %260
br i1 %261, label %262, label %284
262: ; preds = %237
%263 = load i64, i64* %11
%264 = icmp ne i64 %263, 0
br i1 %264, label %265, label %268
265: ; preds = %262
%266 = load i64, i64* %11
%267 = add i64 %266, 1
store i64 %267, i64* %11
br label %268
268: ; preds = %265, %262
%269 = load i64*, i64** %6
%270 = load i64, i64* %11
%271 = getelementptr inbounds i64, i64* %269, i64 %270
%272 = load i64, i64* %271
store i64 %272, i64* %20
%273 = load i64*, i64** %6
%274 = load i64, i64* %9
%275 = getelementptr inbounds i64, i64* %273, i64 %274
%276 = load i64, i64* %275
%277 = load i64*, i64** %6
%278 = load i64, i64* %11
%279 = getelementptr inbounds i64, i64* %277, i64 %278
store i64 %276, i64* %279
%280 = load i64, i64* %20
%281 = load i64*, i64** %6
%282 = load i64, i64* %9
%283 = getelementptr inbounds i64, i64* %281, i64 %282
store i64 %280, i64* %283
br label %284
284: ; preds = %268, %237
%285 = load i32*, i32** %5
%286 = load i64*, i64** %6
%287 = load i64, i64* %10
%288 = getelementptr inbounds i64, i64* %286, i64 %287
%289 = load i64, i64* %288
%290 = getelementptr inbounds i32, i32* %285, i64 %289
%291 = load i32, i32* %290
%292 = load i32, i32* %15
%293 = icmp eq i32 %291, %292
br i1 %293, label %294, label %312
294: ; preds = %284
%295 = load i64, i64* %12
%296 = add i64 %295, -1
store i64 %296, i64* %12
%297 = load i64*, i64** %6
%298 = load i64, i64* %12
%299 = getelementptr inbounds i64, i64* %297, i64 %298
%300 = load i64, i64* %299
store i64 %300, i64* %21
%301 = load i64*, i64** %6
%302 = load i64, i64* %10
%303 = getelementptr inbounds i64, i64* %301, i64 %302
%304 = load i64, i64* %303
%305 = load i64*, i64** %6
%306 = load i64, i64* %12
%307 = getelementptr inbounds i64, i64* %305, i64 %306
store i64 %304, i64* %307
%308 = load i64, i64* %21
%309 = load i64*, i64** %6
%310 = load i64, i64* %10
%311 = getelementptr inbounds i64, i64* %309, i64 %310
store i64 %308, i64* %311
br label %312
312: ; preds = %294, %284
br label %200
313: ; preds = %236
br label %314
314: ; preds = %313, %124
%315 = load i64*, i64** %6
%316 = load i64, i64* %9
%317 = getelementptr inbounds i64, i64* %315, i64 %316
%318 = load i64, i64* %317
store i64 %318, i64* %22
%319 = load i64*, i64** %6
%320 = load i64, i64* %7
%321 = sub i64 %320, 1
%322 = getelementptr inbounds i64, i64* %319, i64 %321
%323 = load i64, i64* %322
%324 = load i64*, i64** %6
%325 = load i64, i64* %9
%326 = getelementptr inbounds i64, i64* %324, i64 %325
store i64 %323, i64* %326
%327 = load i64, i64* %22
%328 = load i64*, i64** %6
%329 = load i64, i64* %7
%330 = sub i64 %329, 1
%331 = getelementptr inbounds i64, i64* %328, i64 %330
store i64 %327, i64* %331
%332 = load i64, i64* %9
%333 = sub i64 %332, 1
store i64 %333, i64* %10
%334 = load i64, i64* %9
%335 = add i64 %334, 1
store i64 %335, i64* %9
store i64 0, i64* %13
br label %336
336: ; preds = %356, %314
%337 = load i64, i64* %13
%338 = load i64, i64* %11
%339 = icmp ult i64 %337, %338
br i1 %339, label %340, label %361
340: ; preds = %336
%341 = load i64*, i64** %6
%342 = load i64, i64* %13
%343 = getelementptr inbounds i64, i64* %341, i64 %342
%344 = load i64, i64* %343
store i64 %344, i64* %23
%345 = load i64*, i64** %6
%346 = load i64, i64* %10
%347 = getelementptr inbounds i64, i64* %345, i64 %346
%348 = load i64, i64* %347
%349 = load i64*, i64** %6
%350 = load i64, i64* %13
%351 = getelementptr inbounds i64, i64* %349, i64 %350
store i64 %348, i64* %351
%352 = load i64, i64* %23
%353 = load i64*, i64** %6
%354 = load i64, i64* %10
%355 = getelementptr inbounds i64, i64* %353, i64 %354
store i64 %352, i64* %355
br label %356
356: ; preds = %340
%357 = load i64, i64* %13
%358 = add i64 %357, 1
store i64 %358, i64* %13
%359 = load i64, i64* %10
%360 = add i64 %359, -1
store i64 %360, i64* %10
br label %336
361: ; preds = %336
%362 = load i64, i64* %7
%363 = sub i64 %362, 2
store i64 %363, i64* %13
br label %364
364: ; preds = %384, %361
%365 = load i64, i64* %13
%366 = load i64, i64* %12
%367 = icmp ugt i64 %365, %366
br i1 %367, label %368, label %389
368: ; preds = %364
%369 = load i64*, i64** %6
%370 = load i64, i64* %9
%371 = getelementptr inbounds i64, i64* %369, i64 %370
%372 = load i64, i64* %371
store i64 %372, i64* %24
%373 = load i64*, i64** %6
%374 = load i64, i64* %13
%375 = getelementptr inbounds i64, i64* %373, i64 %374
%376 = load i64, i64* %375
%377 = load i64*, i64** %6
%378 = load i64, i64* %9
%379 = getelementptr inbounds i64, i64* %377, i64 %378
store i64 %376, i64* %379
%380 = load i64, i64* %24
%381 = load i64*, i64** %6
%382 = load i64, i64* %13
%383 = getelementptr inbounds i64, i64* %381, i64 %382
store i64 %380, i64* %383
br label %384
384: ; preds = %368
%385 = load i64, i64* %13
%386 = add i64 %385, -1
store i64 %386, i64* %13
%387 = load i64, i64* %9
%388 = add i64 %387, 1
store i64 %388, i64* %9
br label %364
389: ; preds = %364
%390 = load i32*, i32** %5
%391 = load i64*, i64** %6
%392 = load i64, i64* %10
%393 = add i64 %392, 1
%394 = load i64, i64* %8
%395 = load i32*, i32** %5
%396 = load i64*, i64** %6
%397 = load i64, i64* %9
%398 = getelementptr inbounds i64, i64* %396, i64 %397
%399 = load i64, i64* %7
%400 = load i64, i64* %9
%401 = sub i64 %399, %400
%402 = load i64, i64* %8
br label %403
403: ; preds = %389, %78
ret void
}

LLVM IR (-O2):
define void @quicksort3way_i_(i32* %0, i64* %1, i64 %2, i64 %3) {
%5 = icmp ugt i64 %2, %3
br i1 %5, label %32, label %6
6: ; preds = %175, %4
%7 = phi i64* [ %1, %4 ], [ %177, %175 ]
%8 = phi i64 [ %2, %4 ], [ %178, %175 ]
%9 = icmp ugt i64 %8, 1
br i1 %9, label %10, label %180
10: ; preds = %6, %27
%11 = phi i64 [ %30, %27 ], [ 1, %6 ]
%12 = getelementptr inbounds i64, i64* %7, i64 %11
%13 = load i64, i64* %12
%14 = getelementptr inbounds i32, i32* %0, i64 %13
%15 = load i32, i32* %14
br label %16
16: ; preds = %10, %24
%17 = phi i64 [ %11, %10 ], [ %18, %24 ]
%18 = add i64 %17, -1
%19 = getelementptr inbounds i64, i64* %7, i64 %18
%20 = load i64, i64* %19
%21 = getelementptr inbounds i32, i32* %0, i64 %20
%22 = load i32, i32* %21
%23 = icmp slt i32 %15, %22
br i1 %23, label %24, label %27
24: ; preds = %16
%25 = getelementptr inbounds i64, i64* %7, i64 %17
store i64 %20, i64* %25
%26 = icmp eq i64 %18, 0
br i1 %26, label %27, label %16
27: ; preds = %16, %24
%28 = phi i64 [ %17, %16 ], [ 0, %24 ]
%29 = getelementptr inbounds i64, i64* %7, i64 %28
store i64 %13, i64* %29
%30 = add nuw i64 %11, 1
%31 = icmp eq i64 %30, %8
br i1 %31, label %180, label %10
32: ; preds = %4, %175
%33 = phi i64 [ %178, %175 ], [ %2, %4 ]
%34 = phi i64* [ %177, %175 ], [ %1, %4 ]
%35 = add i64 %33, -1
%36 = getelementptr inbounds i64, i64* %34, i64 %35
%37 = load i64, i64* %36
%38 = getelementptr inbounds i32, i32* %0, i64 %37
%39 = load i32, i32* %38
br label %40
40: ; preds = %40, %32
%41 = phi i64 [ 0, %32 ], [ %47, %40 ]
%42 = getelementptr inbounds i64, i64* %34, i64 %41
%43 = load i64, i64* %42
%44 = getelementptr inbounds i32, i32* %0, i64 %43
%45 = load i32, i32* %44
%46 = icmp slt i32 %45, %39
%47 = add i64 %41, 1
br i1 %46, label %40, label %48
48: ; preds = %40
%49 = getelementptr inbounds i64, i64* %34, i64 %41
%50 = add i64 %33, -2
br label %51
51: ; preds = %51, %48
%52 = phi i64 [ %50, %48 ], [ %60, %51 ]
%53 = getelementptr inbounds i64, i64* %34, i64 %52
%54 = load i64, i64* %53
%55 = getelementptr inbounds i32, i32* %0, i64 %54
%56 = load i32, i32* %55
%57 = icmp slt i32 %39, %56
%58 = icmp ne i64 %52, 0
%59 = select i1 %57, i1 %58, i1 false
%60 = add i64 %52, -1
br i1 %59, label %51, label %61
61: ; preds = %51
%62 = getelementptr inbounds i64, i64* %34, i64 %52
%63 = icmp ult i64 %41, %52
br i1 %63, label %64, label %134
64: ; preds = %61
store i64 %54, i64* %49
store i64 %43, i64* %62
%65 = load i64, i64* %49
%66 = getelementptr inbounds i32, i32* %0, i64 %65
%67 = load i32, i32* %66
%68 = icmp eq i32 %67, %39
br i1 %68, label %69, label %74
69: ; preds = %64
%70 = load i64, i64* %34
store i64 %65, i64* %34
store i64 %70, i64* %49
%71 = load i64, i64* %62
%72 = getelementptr inbounds i32, i32* %0, i64 %71
%73 = load i32, i32* %72
br label %74
74: ; preds = %69, %64
%75 = phi i32 [ %73, %69 ], [ %45, %64 ]
%76 = phi i64 [ %71, %69 ], [ %43, %64 ]
%77 = icmp eq i32 %75, %39
br i1 %77, label %78, label %81
78: ; preds = %74
%79 = getelementptr inbounds i64, i64* %34, i64 %50
%80 = load i64, i64* %79
store i64 %76, i64* %79
store i64 %80, i64* %62
br label %81
81: ; preds = %78, %74
%82 = phi i64 [ %35, %74 ], [ %50, %78 ]
br label %83
83: ; preds = %81, %127
%84 = phi i64 [ %82, %81 ], [ %128, %127 ]
%85 = phi i64 [ %52, %81 ], [ %102, %127 ]
%86 = phi i64 [ %41, %81 ], [ %92, %127 ]
br label %87
87: ; preds = %83, %123
%88 = phi i64 [ %102, %123 ], [ %85, %83 ]
%89 = phi i64 [ %92, %123 ], [ %86, %83 ]
br label %90
90: ; preds = %90, %87
%91 = phi i64 [ %89, %87 ], [ %92, %90 ]
%92 = add i64 %91, 1
%93 = getelementptr inbounds i64, i64* %34, i64 %92
%94 = load i64, i64* %93
%95 = getelementptr inbounds i32, i32* %0, i64 %94
%96 = load i32, i32* %95
%97 = icmp slt i32 %96, %39
br i1 %97, label %90, label %98
98: ; preds = %90
%99 = getelementptr inbounds i64, i64* %34, i64 %92
br label %100
100: ; preds = %98, %100
%101 = phi i64 [ %102, %100 ], [ %88, %98 ]
%102 = add i64 %101, -1
%103 = getelementptr inbounds i64, i64* %34, i64 %102
%104 = load i64, i64* %103
%105 = getelementptr inbounds i32, i32* %0, i64 %104
%106 = load i32, i32* %105
%107 = icmp sge i32 %39, %106
%108 = icmp eq i64 %102, 0
%109 = select i1 %107, i1 true, i1 %108
br i1 %109, label %110, label %100
110: ; preds = %100
%111 = getelementptr inbounds i64, i64* %34, i64 %102
%112 = icmp ult i64 %92, %102
br i1 %112, label %113, label %131
113: ; preds = %110
store i64 %104, i64* %99
store i64 %94, i64* %111
%114 = load i64, i64* %99
%115 = getelementptr inbounds i32, i32* %0, i64 %114
%116 = load i32, i32* %115
%117 = icmp eq i32 %116, %39
br i1 %117, label %118, label %123
118: ; preds = %113
%119 = load i64, i64* %34
store i64 %114, i64* %34
store i64 %119, i64* %99
%120 = load i64, i64* %111
%121 = getelementptr inbounds i32, i32* %0, i64 %120
%122 = load i32, i32* %121
br label %123
123: ; preds = %118, %113
%124 = phi i32 [ %122, %118 ], [ %96, %113 ]
%125 = phi i64 [ %120, %118 ], [ %94, %113 ]
%126 = icmp eq i32 %124, %39
br i1 %126, label %127, label %87
127: ; preds = %123
%128 = add i64 %84, -1
%129 = getelementptr inbounds i64, i64* %34, i64 %128
%130 = load i64, i64* %129
store i64 %125, i64* %129
store i64 %130, i64* %111
br label %83
131: ; preds = %110
%132 = load i64, i64* %36
%133 = add i64 %91, 2
br label %134
134: ; preds = %131, %61
%135 = phi i64 [ %133, %131 ], [ %47, %61 ]
%136 = phi i64 [ %132, %131 ], [ %37, %61 ]
%137 = phi i64 [ %94, %131 ], [ %43, %61 ]
%138 = phi i64 [ %84, %131 ], [ %35, %61 ]
%139 = phi i64 [ %92, %131 ], [ %41, %61 ]
%140 = getelementptr inbounds i64, i64* %34, i64 %139
store i64 %136, i64* %140
store i64 %137, i64* %36
%141 = icmp ugt i64 %50, %138
br i1 %141, label %142, label %175
142: ; preds = %134
%143 = sub i64 %33, %138
%144 = add i64 %33, -3
%145 = and i64 %143, 1
%146 = icmp eq i64 %145, 0
br i1 %146, label %154, label %147
147: ; preds = %142
%148 = getelementptr inbounds i64, i64* %34, i64 %135
%149 = load i64, i64* %148
%150 = getelementptr inbounds i64, i64* %34, i64 %50
%151 = load i64, i64* %150
store i64 %151, i64* %148
store i64 %149, i64* %150
%152 = add i64 %33, -3
%153 = add i64 %135, 1
br label %154
154: ; preds = %147, %142
%155 = phi i64 [ %135, %142 ], [ %153, %147 ]
%156 = phi i64 [ %50, %142 ], [ %152, %147 ]
%157 = phi i64 [ undef, %142 ], [ %153, %147 ]
%158 = icmp eq i64 %144, %138
br i1 %158, label %175, label %159
159: ; preds = %154, %159
%160 = phi i64 [ %173, %159 ], [ %155, %154 ]
%161 = phi i64 [ %172, %159 ], [ %156, %154 ]
%162 = getelementptr inbounds i64, i64* %34, i64 %160
%163 = load i64, i64* %162
%164 = getelementptr inbounds i64, i64* %34, i64 %161
%165 = load i64, i64* %164
store i64 %165, i64* %162
store i64 %163, i64* %164
%166 = add i64 %161, -1
%167 = add i64 %160, 1
%168 = getelementptr inbounds i64, i64* %34, i64 %167
%169 = load i64, i64* %168
%170 = getelementptr inbounds i64, i64* %34, i64 %166
%171 = load i64, i64* %170
store i64 %171, i64* %168
store i64 %169, i64* %170
%172 = add i64 %161, -2
%173 = add i64 %160, 2
%174 = icmp ugt i64 %172, %138
br i1 %174, label %159, label %175
175: ; preds = %154, %159, %134
%176 = phi i64 [ %135, %134 ], [ %157, %154 ], [ %173, %159 ]
tail call void @quicksort3way_i_(i32* %0, i64* %34, i64 %139, i64 %3)
%177 = getelementptr inbounds i64, i64* %34, i64 %176
%178 = sub i64 %33, %176
%179 = icmp ugt i64 %178, %3
br i1 %179, label %32, label %6
180: ; preds = %27, %6
ret void
}