void merge_sortv_ui(unsigned int *restrict out, const unsigned int *restrict A,
                    const unsigned int An, const unsigned stride,
                    unsigned int *restrict work) {
  unsigned int *buf[2];
  buf[0] = out, buf[1] = work;
  do {
    unsigned int i = 0, n = An, base = -n, odd = 0, c = 0, b = 1;
    for (;;) {
      unsigned int *restrict p;
      if ((c & 1) == 0) {
        base += n, n += (odd & 1), c |= 1, b ^= 1;
        while (n > 3)
          odd <<= 1, odd |= (n & 1), n >>= 1, c <<= 1, b ^= 1;
      } else
        base -= n - (odd & 1), n <<= 1, n -= (odd & 1), odd >>= 1, c >>= 1;
      if (c == 0)
        break;
      p = buf[b] + base;
      if (n == 2) {
        unsigned int v[2];
        v[0] = *A, ((A) = (unsigned int *)((char *)(A) + (stride))), v[1] = *A,
        ((A) = (unsigned int *)((char *)(A) + (stride)));
        if (v[1] < v[0])
          p[0] = v[1], p[1] = v[0];
        else
          p[0] = v[0], p[1] = v[1];
        i += 2;
      } else if (n == 3) {
        unsigned int v[3];
        v[0] = *A, ((A) = (unsigned int *)((char *)(A) + (stride))), v[1] = *A,
        ((A) = (unsigned int *)((char *)(A) + (stride))), v[2] = *A,
        ((A) = (unsigned int *)((char *)(A) + (stride)));
        do
          if (v[1] < v[0]) {
            if (v[2] < v[1])
              p[0] = v[2], p[1] = v[1], p[2] = v[0];
            else {
              if (v[2] < v[0])
                p[0] = v[1], p[1] = v[2], p[2] = v[0];
              else
                p[0] = v[1], p[1] = v[0], p[2] = v[2];
            }
          } else {
            if (v[2] < v[0])
              p[0] = v[2], p[1] = v[0], p[2] = v[1];
            else {
              if (v[2] < v[1])
                p[0] = v[0], p[1] = v[2], p[2] = v[1];
              else
                p[0] = v[0], p[1] = v[1], p[2] = v[2];
            }
          }
        while (0);
        i += 3;
      } else {
        const unsigned int na = n >> 1, nb = (n + 1) >> 1;
        const unsigned int *restrict ap = buf[b ^ 1] + base, *const ae =
                                                                 ap + na;
        unsigned int *restrict bp = p + na, *const be = bp + nb;
        for (;;) {
          if ((*bp) < (*ap)) {
            *p++ = *bp++;
            if (bp != be)
              continue;
            do
              *p++ = *ap++;
            while (ap != ae);
            break;
          } else {
            *p++ = *ap++;
            if (ap == ae)
              break;
          }
        }
      }
    }
  } while (0);
}


x86 assembly (clang, -O0):
<merge_sortv_ui>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x38(%rbp)
xor    %eax,%eax
sub    -0x38(%rbp),%eax
mov    %eax,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
movl   $0x1,-0x48(%rbp)
mov    -0x44(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    11ce <merge_sortv_ui+0xce>
mov    -0x38(%rbp),%eax
add    -0x3c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x40(%rbp),%eax
and    $0x1,%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x44(%rbp),%eax
or     $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x48(%rbp),%eax
xor    $0x1,%eax
mov    %eax,-0x48(%rbp)
cmpl   $0x3,-0x38(%rbp)
jbe    11c9 <merge_sortv_ui+0xc9>
mov    -0x40(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x40(%rbp)
mov    -0x38(%rbp),%eax
and    $0x1,%eax
or     -0x40(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x38(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x44(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x48(%rbp),%eax
xor    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    118a <merge_sortv_ui+0x8a>
jmp    120a <merge_sortv_ui+0x10a>
mov    -0x38(%rbp),%ecx
mov    -0x40(%rbp),%eax
and    $0x1,%eax
sub    %eax,%ecx
mov    -0x3c(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x38(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x40(%rbp),%ecx
and    $0x1,%ecx
mov    -0x38(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x38(%rbp)
mov    -0x40(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x40(%rbp)
mov    -0x44(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x44(%rbp)
cmpl   $0x0,-0x44(%rbp)
jne    1219 <merge_sortv_ui+0x119>
jmp    156d <merge_sortv_ui+0x46d>
mov    -0x48(%rbp),%eax
mov    -0x30(%rbp,%rax,8),%rax
mov    -0x3c(%rbp),%ecx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
cmpl   $0x2,-0x38(%rbp)
jne    12ac <merge_sortv_ui+0x1ac>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x58(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x54(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x58(%rbp),%eax
jae    128b <merge_sortv_ui+0x18b>
mov    -0x54(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x58(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x4(%rax)
jmp    129e <merge_sortv_ui+0x19e>
mov    -0x58(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x54(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x34(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x34(%rbp)
jmp    1568 <merge_sortv_ui+0x468>
cmpl   $0x3,-0x38(%rbp)
jne    1420 <merge_sortv_ui+0x320>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x64(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x60(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x60(%rbp),%eax
cmp    -0x64(%rbp),%eax
jae    138a <merge_sortv_ui+0x28a>
mov    -0x5c(%rbp),%eax
cmp    -0x60(%rbp),%eax
jae    1335 <merge_sortv_ui+0x235>
mov    -0x5c(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x60(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x64(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x8(%rax)
jmp    1385 <merge_sortv_ui+0x285>
mov    -0x5c(%rbp),%eax
cmp    -0x64(%rbp),%eax
jae    1363 <merge_sortv_ui+0x263>
mov    -0x60(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x5c(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x64(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x8(%rax)
jmp    1380 <merge_sortv_ui+0x280>
mov    -0x60(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x64(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x5c(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x8(%rax)
jmp    1385 <merge_sortv_ui+0x285>
jmp    140d <merge_sortv_ui+0x30d>
mov    -0x5c(%rbp),%eax
cmp    -0x64(%rbp),%eax
jae    13b8 <merge_sortv_ui+0x2b8>
mov    -0x5c(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x64(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x60(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x8(%rax)
jmp    1408 <merge_sortv_ui+0x308>
mov    -0x5c(%rbp),%eax
cmp    -0x60(%rbp),%eax
jae    13e6 <merge_sortv_ui+0x2e6>
mov    -0x64(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x5c(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x60(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x8(%rax)
jmp    1403 <merge_sortv_ui+0x303>
mov    -0x64(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x60(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x5c(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,0x8(%rax)
jmp    1408 <merge_sortv_ui+0x308>
jmp    140d <merge_sortv_ui+0x30d>
jmp    1412 <merge_sortv_ui+0x312>
mov    -0x34(%rbp),%eax
add    $0x3,%eax
mov    %eax,-0x34(%rbp)
jmp    1563 <merge_sortv_ui+0x463>
mov    -0x38(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x68(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %eax,-0x6c(%rbp)
mov    -0x48(%rbp),%eax
xor    $0x1,%eax
mov    %eax,%eax
mov    -0x30(%rbp,%rax,8),%rax
mov    -0x3c(%rbp),%ecx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x78(%rbp)
mov    -0x78(%rbp),%rax
mov    -0x68(%rbp),%ecx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x80(%rbp)
mov    -0x50(%rbp),%rax
mov    -0x68(%rbp),%ecx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x88(%rbp)
mov    -0x88(%rbp),%rax
mov    -0x6c(%rbp),%ecx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x90(%rbp)
mov    -0x88(%rbp),%rax
mov    (%rax),%eax
mov    -0x78(%rbp),%rcx
cmp    (%rcx),%eax
jae    151f <merge_sortv_ui+0x41f>
mov    -0x88(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x88(%rbp)
mov    (%rax),%ecx
mov    -0x50(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x50(%rbp)
mov    %ecx,(%rax)
mov    -0x88(%rbp),%rax
cmp    -0x90(%rbp),%rax
je     14e5 <merge_sortv_ui+0x3e5>
jmp    148f <merge_sortv_ui+0x38f>
jmp    14ea <merge_sortv_ui+0x3ea>
mov    -0x78(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x78(%rbp)
mov    (%rax),%ecx
mov    -0x50(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x50(%rbp)
mov    %ecx,(%rax)
mov    -0x78(%rbp),%rax
cmp    -0x80(%rbp),%rax
jne    14ea <merge_sortv_ui+0x3ea>
jmp    155e <merge_sortv_ui+0x45e>
mov    -0x78(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x78(%rbp)
mov    (%rax),%ecx
mov    -0x50(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x50(%rbp)
mov    %ecx,(%rax)
mov    -0x78(%rbp),%rax
cmp    -0x80(%rbp),%rax
jne    1554 <merge_sortv_ui+0x454>
jmp    155e <merge_sortv_ui+0x45e>
jmp    1559 <merge_sortv_ui+0x459>
jmp    148f <merge_sortv_ui+0x38f>
jmp    1563 <merge_sortv_ui+0x463>
jmp    1568 <merge_sortv_ui+0x468>
jmp    1154 <merge_sortv_ui+0x54>
jmp    1572 <merge_sortv_ui+0x472>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<merge_sortv_ui>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rsi,-0x20(%rsp)
mov    %rdi,-0x18(%rsp)
mov    %r8,-0x10(%rsp)
mov    %edx,%edi
neg    %edi
mov    %ecx,%eax
mov    %rax,-0x30(%rsp)
xor    %r13d,%r13d
mov    $0x1,%r11d
xor    %r10d,%r10d
jmp    1170 <merge_sortv_ui+0x70>
mov    -0x20(%rsp),%rsi
mov    (%rsi),%ebp
mov    -0x30(%rsp),%rbx
mov    (%rsi,%rbx,1),%ecx
cmp    %ebp,%ecx
mov    %ebp,%eax
cmovb  %ecx,%eax
cmovb  %ebp,%ecx
mov    %eax,(%r9)
mov    $0x1,%eax
add    %rbx,%rsi
add    %rbx,%rsi
mov    %rsi,-0x20(%rsp)
mov    %ecx,(%r9,%rax,4)
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
test   $0x1,%r13b
jne    11b0 <merge_sortv_ui+0xb0>
add    %edx,%edi
mov    %r10d,%eax
and    $0x1,%eax
add    %edx,%eax
or     $0x1,%r13d
xor    $0x1,%r11d
cmp    $0x4,%eax
jb     11e0 <merge_sortv_ui+0xe0>
nopl   (%rax)
mov    %eax,%ecx
mov    %eax,%edx
and    $0x1,%edx
lea    (%rdx,%r10,2),%r10d
shr    %eax
add    %r13d,%r13d
xor    $0x1,%r11d
cmp    $0x7,%ecx
ja     1190 <merge_sortv_ui+0x90>
jmp    11c6 <merge_sortv_ui+0xc6>
nopl   0x0(%rax,%rax,1)
mov    %r10d,%eax
and    $0x1,%eax
add    %eax,%edi
sub    %edx,%edi
add    %edx,%edx
sub    %eax,%edx
shr    %r10d
shr    %r13d
mov    %edx,%eax
mov    %eax,%edx
test   %r13d,%r13d
jne    11e2 <merge_sortv_ui+0xe2>
jmp    14b7 <merge_sortv_ui+0x3b7>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %eax,%edx
mov    %r11d,%eax
mov    %edi,%r15d
lea    0x0(,%r15,4),%r9
add    -0x18(%rsp,%rax,8),%r9
cmp    $0x3,%edx
je     142b <merge_sortv_ui+0x32b>
cmp    $0x2,%edx
je     1132 <merge_sortv_ui+0x32>
mov    %edi,-0x34(%rsp)
mov    %edx,%r12d
shr    %r12d
mov    %rdx,-0x28(%rsp)
lea    0x1(%rdx),%eax
shr    %eax
mov    %r11d,%ecx
xor    $0x1,%ecx
mov    -0x18(%rsp,%rcx,8),%rdx
lea    (%rdx,%r15,4),%rcx
lea    (%rcx,%r12,4),%rbx
lea    (%r9,%r12,4),%rbp
lea    0x0(,%rax,4),%r8
add    %rbp,%r8
lea    -0x4(,%r12,4),%r14
ff
cs nopw 0x0(%rax,%rax,1)
nop
mov    %r9,%rax
mov    0x0(%rbp),%esi
mov    (%rcx),%edi
cmp    %edi,%esi
jae    126d <merge_sortv_ui+0x16d>
add    $0x4,%rbp
lea    0x4(%rax),%r9
mov    %esi,(%rax)
cmp    %r8,%rbp
jne    1250 <merge_sortv_ui+0x150>
jmp    12a0 <merge_sortv_ui+0x1a0>
add    $0x4,%rcx
mov    %edi,(%rax)
add    $0x4,%rax
add    $0xfffffffffffffffc,%r14
mov    %rax,%r9
cmp    %rbx,%rcx
jne    1250 <merge_sortv_ui+0x150>
mov    -0x34(%rsp),%edi
mov    -0x28(%rsp),%rdx
jmp    1170 <merge_sortv_ui+0x70>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
lea    (%rdx,%r12,4),%rdx
lea    (%rdx,%r15,4),%r15
sub    %rcx,%r15
add    $0xfffffffffffffffc,%r15
cmp    $0x1c,%r15
jb     12d5 <merge_sortv_ui+0x1d5>
mov    %r15,%rdx
and    $0xfffffffffffffffc,%rdx
lea    (%rcx,%rdx,1),%rsi
add    $0x4,%rsi
cmp    %rsi,%r9
jae    1300 <merge_sortv_ui+0x200>
add    %rdx,%rax
add    $0x8,%rax
cmp    %rax,%rcx
jae    1300 <merge_sortv_ui+0x200>
mov    -0x34(%rsp),%edi
mov    -0x28(%rsp),%rdx
xchg   %ax,%ax
mov    (%rcx),%eax
add    $0x4,%rcx
mov    %eax,(%r9)
add    $0x4,%r9
cmp    %rbx,%rcx
jne    12e0 <merge_sortv_ui+0x1e0>
jmp    1170 <merge_sortv_ui+0x70>
nopw   0x0(%rax,%rax,1)
shr    $0x2,%r15
add    $0x1,%r15
mov    %r15,%r12
and    $0xfffffffffffffff8,%r12
lea    -0x8(%r12),%rax
mov    %rax,%r8
shr    $0x3,%r8
add    $0x1,%r8
cmp    $0x18,%rax
jae    132c <merge_sortv_ui+0x22c>
xor    %edi,%edi
jmp    13b0 <merge_sortv_ui+0x2b0>
mov    %r14,%rbp
shr    $0x2,%rbp
add    $0x1,%rbp
and    $0xfffffffffffffff8,%rbp
add    $0xfffffffffffffff8,%rbp
shr    $0x3,%rbp
add    $0x1,%rbp
and    $0xfffffffffffffffc,%rbp
xor    %edi,%edi
nopl   (%rax)
movups (%rcx,%rdi,4),%xmm0
movups 0x10(%rcx,%rdi,4),%xmm1
movups %xmm0,(%r9,%rdi,4)
movups %xmm1,0x10(%r9,%rdi,4)
movups 0x20(%rcx,%rdi,4),%xmm0
movups 0x30(%rcx,%rdi,4),%xmm1
movups %xmm0,0x20(%r9,%rdi,4)
movups %xmm1,0x30(%r9,%rdi,4)
movups 0x40(%rcx,%rdi,4),%xmm0
movups 0x50(%rcx,%rdi,4),%xmm1
movups %xmm0,0x40(%r9,%rdi,4)
movups %xmm1,0x50(%r9,%rdi,4)
movups 0x60(%rcx,%rdi,4),%xmm0
movups 0x70(%rcx,%rdi,4),%xmm1
movups %xmm0,0x60(%r9,%rdi,4)
movups %xmm1,0x70(%r9,%rdi,4)
add    $0x20,%rdi
add    $0xfffffffffffffffc,%rbp
jne    1350 <merge_sortv_ui+0x250>
test   $0x3,%r8b
je     140c <merge_sortv_ui+0x30c>
shr    $0x2,%r14b
add    $0x1,%r14b
and    $0x18,%r14b
add    $0xf8,%r14b
shr    $0x3,%r14b
add    $0x1,%r14b
movzbl %r14b,%eax
and    $0x3,%eax
shl    $0x5,%rax
lea    (%rcx,%rdi,4),%rbp
lea    (%r9,%rdi,4),%rdi
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movups 0x0(%rbp,%rsi,1),%xmm0
movups 0x10(%rbp,%rsi,1),%xmm1
movups %xmm0,(%rdi,%rsi,1)
movups %xmm1,0x10(%rdi,%rsi,1)
add    $0x20,%rsi
cmp    %rsi,%rax
jne    13f0 <merge_sortv_ui+0x2f0>
cmp    %r12,%r15
mov    -0x34(%rsp),%edi
mov    -0x28(%rsp),%rdx
je     1170 <merge_sortv_ui+0x70>
lea    (%r9,%r12,4),%r9
lea    (%rcx,%r12,4),%rcx
jmp    12e0 <merge_sortv_ui+0x1e0>
mov    -0x20(%rsp),%rsi
mov    (%rsi),%ecx
mov    -0x30(%rsp),%rbx
mov    (%rsi,%rbx,1),%ebp
add    %rbx,%rsi
mov    (%rbx,%rsi,1),%r8d
cmp    %ecx,%ebp
jae    145b <merge_sortv_ui+0x35b>
cmp    %ebp,%r8d
jae    1473 <merge_sortv_ui+0x373>
mov    %r8d,(%r9)
mov    %ebp,0x4(%r9)
mov    $0x2,%eax
jmp    1153 <merge_sortv_ui+0x53>
cmp    %ecx,%r8d
jae    1486 <merge_sortv_ui+0x386>
mov    %r8d,(%r9)
mov    %ecx,0x4(%r9)
mov    $0x2,%eax
mov    %ebp,%ecx
jmp    1153 <merge_sortv_ui+0x53>
mov    %ebp,(%r9)
cmp    %ecx,%r8d
jae    149b <merge_sortv_ui+0x39b>
mov    %r8d,0x4(%r9)
mov    $0x2,%eax
jmp    14ad <merge_sortv_ui+0x3ad>
mov    %ecx,(%r9)
cmp    %ebp,%r8d
jae    14a1 <merge_sortv_ui+0x3a1>
mov    %r8d,0x4(%r9)
mov    $0x2,%eax
mov    %ebp,%ecx
jmp    14ad <merge_sortv_ui+0x3ad>
mov    %ecx,0x4(%r9)
jmp    14a5 <merge_sortv_ui+0x3a5>
mov    %ebp,0x4(%r9)
mov    $0x2,%eax
mov    %r8d,%ecx
mov    -0x30(%rsp),%rbx
jmp    1153 <merge_sortv_ui+0x53>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @merge_sortv_ui(i32* noalias %0, i32* noalias nocapture %1, i32 %2, i32 %3, i32* noalias %4) {
%6 = alloca [2 x i32*]
%7 = bitcast [2 x i32*]* %6 to i8*
%8 = getelementptr inbounds [2 x i32*], [2 x i32*]* %6, i64 0, i64 0
store i32* %0, i32** %8
%9 = getelementptr inbounds [2 x i32*], [2 x i32*]* %6, i64 0, i64 1
store i32* %4, i32** %9
%10 = sub i32 0, %2
%11 = zext i32 %3 to i64
br label %12
12: ; preds = %261, %5
%13 = phi i32 [ %66, %261 ], [ 1, %5 ]
%14 = phi i32 [ %65, %261 ], [ 0, %5 ]
%15 = phi i32 [ %64, %261 ], [ 0, %5 ]
%16 = phi i32 [ %63, %261 ], [ %10, %5 ]
%17 = phi i32 [ %62, %261 ], [ %2, %5 ]
%18 = phi i32* [ %267, %261 ], [ %1, %5 ]
br label %19
19: ; preds = %246, %12
%20 = phi i32 [ %13, %12 ], [ %66, %246 ]
%21 = phi i32 [ %14, %12 ], [ %65, %246 ]
%22 = phi i32 [ %15, %12 ], [ %64, %246 ]
%23 = phi i32 [ %16, %12 ], [ %63, %246 ]
%24 = phi i32 [ %17, %12 ], [ %62, %246 ]
%25 = and i32 %21, 1
%26 = icmp eq i32 %25, 0
br i1 %26, label %27, label %46
27: ; preds = %19
%28 = add i32 %24, %23
%29 = and i32 %22, 1
%30 = add i32 %24, %29
%31 = or i32 %21, 1
%32 = xor i32 %20, 1
%33 = icmp ugt i32 %30, 3
br i1 %33, label %34, label %61
34: ; preds = %27, %34
%35 = phi i32 [ %44, %34 ], [ %32, %27 ]
%36 = phi i32 [ %42, %34 ], [ %30, %27 ]
%37 = phi i32 [ %41, %34 ], [ %22, %27 ]
%38 = phi i32 [ %43, %34 ], [ %31, %27 ]
%39 = shl i32 %37, 1
%40 = and i32 %36, 1
%41 = or i32 %40, %39
%42 = lshr i32 %36, 1
%43 = shl i32 %38, 1
%44 = xor i32 %35, 1
%45 = icmp ugt i32 %36, 7
br i1 %45, label %34, label %54
46: ; preds = %19
%47 = and i32 %22, 1
%48 = add i32 %23, %47
%49 = sub i32 %48, %24
%50 = shl i32 %24, 1
%51 = sub i32 %50, %47
%52 = lshr i32 %22, 1
%53 = lshr i32 %21, 1
br label %54
54: ; preds = %34, %46
%55 = phi i32 [ %20, %46 ], [ %44, %34 ]
%56 = phi i32 [ %53, %46 ], [ %43, %34 ]
%57 = phi i32 [ %52, %46 ], [ %41, %34 ]
%58 = phi i32 [ %49, %46 ], [ %28, %34 ]
%59 = phi i32 [ %51, %46 ], [ %42, %34 ]
%60 = icmp eq i32 %56, 0
br i1 %60, label %269, label %61
61: ; preds = %27, %54
%62 = phi i32 [ %59, %54 ], [ %30, %27 ]
%63 = phi i32 [ %58, %54 ], [ %28, %27 ]
%64 = phi i32 [ %57, %54 ], [ %22, %27 ]
%65 = phi i32 [ %56, %54 ], [ %31, %27 ]
%66 = phi i32 [ %55, %54 ], [ %32, %27 ]
%67 = zext i32 %66 to i64
%68 = getelementptr inbounds [2 x i32*], [2 x i32*]* %6, i64 0, i64 %67
%69 = load i32*, i32** %68
%70 = zext i32 %63 to i64
%71 = getelementptr inbounds i32, i32* %69, i64 %70
switch i32 %62, label %109 [
i32 2, label %72
i32 3, label %81
]
72: ; preds = %61
%73 = load i32, i32* %18
%74 = bitcast i32* %18 to i8*
%75 = getelementptr inbounds i8, i8* %74, i64 %11
%76 = bitcast i8* %75 to i32*
%77 = load i32, i32* %76
%78 = icmp ult i32 %77, %73
%79 = select i1 %78, i32 %77, i32 %73
%80 = select i1 %78, i32 %73, i32 %77
store i32 %79, i32* %71
br label %261
81: ; preds = %61
%82 = load i32, i32* %18
%83 = bitcast i32* %18 to i8*
%84 = getelementptr inbounds i8, i8* %83, i64 %11
%85 = bitcast i8* %84 to i32*
%86 = load i32, i32* %85
%87 = getelementptr inbounds i8, i8* %84, i64 %11
%88 = bitcast i8* %87 to i32*
%89 = load i32, i32* %88
%90 = icmp ult i32 %86, %82
br i1 %90, label %91, label %100
91: ; preds = %81
%92 = icmp ult i32 %89, %86
br i1 %92, label %93, label %95
93: ; preds = %91
store i32 %89, i32* %71
%94 = getelementptr inbounds i32, i32* %71, i64 1
store i32 %86, i32* %94
br label %261
95: ; preds = %91
%96 = icmp ult i32 %89, %82
store i32 %86, i32* %71
%97 = getelementptr inbounds i32, i32* %71, i64 1
br i1 %96, label %98, label %99
98: ; preds = %95
store i32 %89, i32* %97
br label %261
99: ; preds = %95
store i32 %82, i32* %97
br label %261
100: ; preds = %81
%101 = icmp ult i32 %89, %82
br i1 %101, label %102, label %104
102: ; preds = %100
store i32 %89, i32* %71
%103 = getelementptr inbounds i32, i32* %71, i64 1
store i32 %82, i32* %103
br label %261
104: ; preds = %100
%105 = icmp ult i32 %89, %86
store i32 %82, i32* %71
%106 = getelementptr inbounds i32, i32* %71, i64 1
br i1 %105, label %107, label %108
107: ; preds = %104
store i32 %89, i32* %106
br label %261
108: ; preds = %104
store i32 %86, i32* %106
br label %261
109: ; preds = %61
%110 = lshr i32 %62, 1
%111 = add i32 %62, 1
%112 = lshr i32 %111, 1
%113 = xor i32 %66, 1
%114 = zext i32 %113 to i64
%115 = getelementptr inbounds [2 x i32*], [2 x i32*]* %6, i64 0, i64 %114
%116 = load i32*, i32** %115
%117 = ptrtoint i32* %116 to i64
%118 = getelementptr inbounds i32, i32* %116, i64 %70
%119 = zext i32 %110 to i64
%120 = getelementptr inbounds i32, i32* %118, i64 %119
%121 = getelementptr inbounds i32, i32* %71, i64 %119
%122 = zext i32 %112 to i64
%123 = getelementptr inbounds i32, i32* %121, i64 %122
br label %124
124: ; preds = %257, %109
%125 = phi i32* [ %259, %257 ], [ %71, %109 ]
%126 = phi i32* [ %258, %257 ], [ %118, %109 ]
%127 = phi i32* [ %130, %257 ], [ %121, %109 ]
br label %128
128: ; preds = %124, %134
%129 = phi i32* [ %136, %134 ], [ %125, %124 ]
%130 = phi i32* [ %135, %134 ], [ %127, %124 ]
%131 = load i32, i32* %130
%132 = load i32, i32* %126
%133 = icmp ult i32 %131, %132
br i1 %133, label %134, label %257
134: ; preds = %128
%135 = getelementptr inbounds i32, i32* %130, i64 1
%136 = getelementptr inbounds i32, i32* %129, i64 1
store i32 %131, i32* %129
%137 = icmp eq i32* %135, %123
br i1 %137, label %138, label %128
138: ; preds = %134
%139 = ptrtoint i32* %126 to i64
%140 = add i64 %117, -4
%141 = shl nuw nsw i64 %119, 2
%142 = add i64 %140, %141
%143 = shl nuw nsw i64 %70, 2
%144 = add i64 %142, %143
%145 = sub i64 %144, %139
%146 = lshr i64 %145, 2
%147 = add nuw nsw i64 %146, 1
%148 = icmp ult i64 %145, 28
br i1 %148, label %247, label %149
149: ; preds = %138
%150 = ptrtoint i32* %126 to i64
%151 = getelementptr i32, i32* %129, i64 2
%152 = add i64 %117, -4
%153 = shl nuw nsw i64 %119, 2
%154 = add i64 %152, %153
%155 = shl nuw nsw i64 %70, 2
%156 = add i64 %154, %155
%157 = sub i64 %156, %150
%158 = lshr i64 %157, 2
%159 = getelementptr i32, i32* %151, i64 %158
%160 = getelementptr i32, i32* %126, i64 1
%161 = getelementptr i32, i32* %160, i64 %158
%162 = icmp ult i32* %136, %161
%163 = icmp ult i32* %126, %159
%164 = and i1 %162, %163
br i1 %164, label %247, label %165
165: ; preds = %149
%166 = and i64 %147, 9223372036854775800
%167 = getelementptr i32, i32* %136, i64 %166
%168 = getelementptr i32, i32* %126, i64 %166
%169 = add nsw i64 %166, -8
%170 = lshr exact i64 %169, 3
%171 = add nuw nsw i64 %170, 1
%172 = and i64 %171, 3
%173 = icmp ult i64 %169, 24
br i1 %173, label %225, label %174
174: ; preds = %165
%175 = and i64 %171, 4611686018427387900
br label %176
176: ; preds = %176, %174
%177 = phi i64 [ 0, %174 ], [ %222, %176 ]
%178 = phi i64 [ 0, %174 ], [ %223, %176 ]
%179 = getelementptr i32, i32* %136, i64 %177
%180 = getelementptr i32, i32* %126, i64 %177
%181 = bitcast i32* %180 to <4 x i32>*
%182 = load <4 x i32>, <4 x i32>* %181
%183 = getelementptr i32, i32* %180, i64 4
%184 = bitcast i32* %183 to <4 x i32>*
%185 = load <4 x i32>, <4 x i32>* %184
%186 = bitcast i32* %179 to <4 x i32>*
store <4 x i32> %182, <4 x i32>* %186
%187 = getelementptr i32, i32* %179, i64 4
%188 = bitcast i32* %187 to <4 x i32>*
store <4 x i32> %185, <4 x i32>* %188
%189 = or i64 %177, 8
%190 = getelementptr i32, i32* %136, i64 %189
%191 = getelementptr i32, i32* %126, i64 %189
%192 = bitcast i32* %191 to <4 x i32>*
%193 = load <4 x i32>, <4 x i32>* %192
%194 = getelementptr i32, i32* %191, i64 4
%195 = bitcast i32* %194 to <4 x i32>*
%196 = load <4 x i32>, <4 x i32>* %195
%197 = bitcast i32* %190 to <4 x i32>*
store <4 x i32> %193, <4 x i32>* %197
%198 = getelementptr i32, i32* %190, i64 4
%199 = bitcast i32* %198 to <4 x i32>*
store <4 x i32> %196, <4 x i32>* %199
%200 = or i64 %177, 16
%201 = getelementptr i32, i32* %136, i64 %200
%202 = getelementptr i32, i32* %126, i64 %200
%203 = bitcast i32* %202 to <4 x i32>*
%204 = load <4 x i32>, <4 x i32>* %203
%205 = getelementptr i32, i32* %202, i64 4
%206 = bitcast i32* %205 to <4 x i32>*
%207 = load <4 x i32>, <4 x i32>* %206
%208 = bitcast i32* %201 to <4 x i32>*
store <4 x i32> %204, <4 x i32>* %208
%209 = getelementptr i32, i32* %201, i64 4
%210 = bitcast i32* %209 to <4 x i32>*
store <4 x i32> %207, <4 x i32>* %210
%211 = or i64 %177, 24
%212 = getelementptr i32, i32* %136, i64 %211
%213 = getelementptr i32, i32* %126, i64 %211
%214 = bitcast i32* %213 to <4 x i32>*
%215 = load <4 x i32>, <4 x i32>* %214
%216 = getelementptr i32, i32* %213, i64 4
%217 = bitcast i32* %216 to <4 x i32>*
%218 = load <4 x i32>, <4 x i32>* %217
%219 = bitcast i32* %212 to <4 x i32>*
store <4 x i32> %215, <4 x i32>* %219
%220 = getelementptr i32, i32* %212, i64 4
%221 = bitcast i32* %220 to <4 x i32>*
store <4 x i32> %218, <4 x i32>* %221
%222 = add nuw i64 %177, 32
%223 = add i64 %178, 4
%224 = icmp eq i64 %223, %175
br i1 %224, label %225, label %176
225: ; preds = %176, %165
%226 = phi i64 [ 0, %165 ], [ %222, %176 ]
%227 = icmp eq i64 %172, 0
br i1 %227, label %244, label %228
228: ; preds = %225, %228
%229 = phi i64 [ %241, %228 ], [ %226, %225 ]
%230 = phi i64 [ %242, %228 ], [ 0, %225 ]
%231 = getelementptr i32, i32* %136, i64 %229
%232 = getelementptr i32, i32* %126, i64 %229
%233 = bitcast i32* %232 to <4 x i32>*
%234 = load <4 x i32>, <4 x i32>* %233
%235 = getelementptr i32, i32* %232, i64 4
%236 = bitcast i32* %235 to <4 x i32>*
%237 = load <4 x i32>, <4 x i32>* %236
%238 = bitcast i32* %231 to <4 x i32>*
store <4 x i32> %234, <4 x i32>* %238
%239 = getelementptr i32, i32* %231, i64 4
%240 = bitcast i32* %239 to <4 x i32>*
store <4 x i32> %237, <4 x i32>* %240
%241 = add nuw i64 %229, 8
%242 = add i64 %230, 1
%243 = icmp eq i64 %242, %172
br i1 %243, label %244, label %228
244: ; preds = %228, %225
%245 = icmp eq i64 %147, %166
br i1 %245, label %246, label %247
246: ; preds = %257, %250, %244
br label %19
247: ; preds = %149, %138, %244
%248 = phi i32* [ %136, %149 ], [ %136, %138 ], [ %167, %244 ]
%249 = phi i32* [ %126, %149 ], [ %126, %138 ], [ %168, %244 ]
br label %250
250: ; preds = %247, %250
%251 = phi i32* [ %255, %250 ], [ %248, %247 ]
%252 = phi i32* [ %253, %250 ], [ %249, %247 ]
%253 = getelementptr inbounds i32, i32* %252, i64 1
%254 = load i32, i32* %252
%255 = getelementptr inbounds i32, i32* %251, i64 1
store i32 %254, i32* %251
%256 = icmp eq i32* %253, %120
br i1 %256, label %246, label %250
257: ; preds = %128
%258 = getelementptr inbounds i32, i32* %126, i64 1
%259 = getelementptr inbounds i32, i32* %129, i64 1
store i32 %132, i32* %129
%260 = icmp eq i32* %258, %120
br i1 %260, label %246, label %124
261: ; preds = %72, %102, %108, %107, %93, %99, %98
%262 = phi i64 [ 2, %98 ], [ 2, %99 ], [ 2, %93 ], [ 2, %107 ], [ 2, %108 ], [ 2, %102 ], [ 1, %72 ]
%263 = phi i32 [ %82, %98 ], [ %89, %99 ], [ %82, %93 ], [ %86, %107 ], [ %89, %108 ], [ %86, %102 ], [ %80, %72 ]
%264 = phi i8* [ %84, %98 ], [ %84, %99 ], [ %84, %93 ], [ %84, %107 ], [ %84, %108 ], [ %84, %102 ], [ %74, %72 ]
%265 = getelementptr inbounds i8, i8* %264, i64 %11
%266 = getelementptr inbounds i8, i8* %265, i64 %11
%267 = bitcast i8* %266 to i32*
%268 = getelementptr inbounds i32, i32* %71, i64 %262
store i32 %263, i32* %268
br label %12
269: ; preds = %54
ret void
}