#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 */
typedef int /*<<< orphan*/ uint8_t;
typedef int uint64_t;
typedef int /*<<< orphan*/ uint32_t;

/* Variables and functions */
int _ProtoBufField(int /*<<< orphan*/ *, int /*<<< orphan*/ *,
                   int /*<<< orphan*/ *, size_t *, size_t *);
int /*<<< orphan*/ _ProtoBufSetFixed(int /*<<< orphan*/ *, size_t, int,
                                     size_t *, int);
int /*<<< orphan*/ _ProtoBufSetLenDelim(int /*<<< orphan*/ *, size_t,
                                        void const *, size_t, size_t *);
int /*<<< orphan*/ _ProtoBufSetVarInt(int /*<<< orphan*/ *, size_t, int,
                                      size_t *);
int /*<<< orphan*/ assert(int);
scalar_t__ calloc(int, size_t);
int /*<<< orphan*/ free(int /*<<< orphan*/ *);
int /*<<< orphan*/ *malloc(size_t);
int /*<<< orphan*/ memset(int /*<<< orphan*/ *, int /*<<< orphan*/, size_t);
scalar_t__ realloc(size_t *, size_t);
void _ProtoBufUnknown(uint8_t **unknown, uint64_t key, uint64_t i,
                      const void *data, size_t dataLen) {
  size_t bufLen = 10 + ((key & 0x07) == 2 ? dataLen : 0);
  uint8_t _buf[(bufLen <= 0x1000) ? bufLen : 0],
      *buf = (bufLen <= 0x1000) ? _buf : malloc(bufLen);
  size_t off = 0, o = 0, l;
  uint64_t k;
  assert(buf != NULL);
  _ProtoBufSetVarInt(buf, bufLen, key, &off);
  switch (key & 0x07) {
  case 0:
    _ProtoBufSetVarInt(buf, bufLen, i, &off);
    break;
  case 1:
    _ProtoBufSetFixed(buf, bufLen, i, &off, sizeof(uint64_t));
    break;
  case 2:
    _ProtoBufSetLenDelim(buf, bufLen, data, dataLen, &off);
    break;
  case 5:
    _ProtoBufSetFixed(buf, bufLen, i, &off, sizeof(uint32_t));
    break;
  default:
    break;
  }
  if (off < bufLen)
    bufLen = off;
  if (!*unknown)
    do {
      size_t _array_cap = (bufLen);
      assert(_array_cap >= 0);
      (*unknown) =
          (void *)((size_t *)calloc(1, _array_cap * sizeof(*(*unknown)) +
                                           sizeof(size_t) * 2) +
                   2);
      assert((*unknown) != NULL);
      (((size_t *)(*unknown))[-2]) = _array_cap;
      (((size_t *)(*unknown))[-1]) = 0;
    } while (0);
  off = 0;
  while (off < (((size_t *)(*unknown))[-1])) {
    l = (((size_t *)(*unknown))[-1]);
    o = off;
    k = _ProtoBufField(NULL, NULL, *unknown, &l, &off);
    if (k == key)
      do {
        size_t _array_i = (o), _array_len = (off - o);
        assert((*unknown) != NULL);
        assert(_array_i >= 0 && _array_i < (((size_t *)(*unknown))[-1]));
        assert(_array_len >= 0 &&
               _array_i + _array_len <= (((size_t *)(*unknown))[-1]));
        (((size_t *)(*unknown))[-1]) -= _array_len;
        while (_array_i < (((size_t *)(*unknown))[-1]))
          (*unknown)[_array_i] = (*unknown)[_array_i + _array_len], _array_i++;
        memset((*unknown) + _array_i, 0, _array_len * sizeof(*(*unknown)));
      } while (0);
    if (k >= key)
      break;
  }
  do {
    assert((*unknown) != NULL);
    size_t _array_idx = (o), _array_cnt = (bufLen),
           _array_i = (((size_t *)(*unknown))[-1]) + _array_cnt, _array_j = 0;
    assert(_array_idx >= 0 && _array_idx <= (((size_t *)(*unknown))[-1]));
    assert((buf) != NULL || _array_cnt == 0);
    assert(_array_cnt >= 0);
    if (_array_i > (((size_t *)(*unknown))[-2]))
      do {
        size_t _array_cap = (_array_i * 3 / 2);
        assert((*unknown) != NULL);
        assert(_array_cap >= (((size_t *)(*unknown))[-1]));
        (*unknown) =
            (void *)((size_t *)realloc((size_t *)(*unknown) - 2,
                                       _array_cap * sizeof(*(*unknown)) +
                                           sizeof(size_t) * 2) +
                     2);
        assert((*unknown) != NULL);
        if (_array_cap > (((size_t *)(*unknown))[-2]))
          memset((*unknown) + (((size_t *)(*unknown))[-2]), 0,
                 (_array_cap - (((size_t *)(*unknown))[-2])) *
                     sizeof(*(*unknown)));
        (((size_t *)(*unknown))[-2]) = _array_cap;
      } while (0);
    while (_array_i-- > _array_idx + _array_cnt)
      (*unknown)[_array_i] = (*unknown)[_array_i - _array_cnt];
    while (_array_j < _array_cnt)
      (*unknown)[_array_idx + _array_j] = (buf)[_array_j], _array_j++;
    (((size_t *)(*unknown))[-1]) += _array_cnt;
  } while (0);
  if (buf != _buf)
    free(buf);
}


x86 assembly (clang, -O0):
<_ProtoBufUnknown>:
push   %rbp
mov    %rsp,%rbp
sub    $0xd0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    -0xc(%rbp),%eax
and    $0x7,%eax
cmp    $0x2,%eax
jne    11dc <_ProtoBufUnknown+0x3c>
mov    -0x20(%rbp),%rax
mov    %rax,-0xa8(%rbp)
jmp    11ea <_ProtoBufUnknown+0x4a>
xor    %eax,%eax
mov    %rax,-0xa8(%rbp)
jmp    11ea <_ProtoBufUnknown+0x4a>
mov    -0xa8(%rbp),%rax
add    $0xa,%rax
mov    %rax,-0x28(%rbp)
cmpq   $0x1000,-0x28(%rbp)
ja     1217 <_ProtoBufUnknown+0x77>
mov    -0x28(%rbp),%rax
mov    %rax,-0xb0(%rbp)
jmp    1225 <_ProtoBufUnknown+0x85>
xor    %eax,%eax
mov    %rax,-0xb0(%rbp)
jmp    1225 <_ProtoBufUnknown+0x85>
mov    -0xb0(%rbp),%rax
mov    %rsp,%rcx
mov    %rcx,-0x30(%rbp)
lea    0xf(,%rax,4),%rdx
and    $0xfffffffffffffff0,%rdx
mov    %rsp,%rcx
sub    %rdx,%rcx
mov    %rcx,-0xb8(%rbp)
mov    %rcx,%rsp
mov    %rax,-0x38(%rbp)
cmpq   $0x1000,-0x28(%rbp)
ja     1274 <_ProtoBufUnknown+0xd4>
mov    -0xb8(%rbp),%rax
mov    %rax,-0xc0(%rbp)
jmp    1284 <_ProtoBufUnknown+0xe4>
mov    -0x28(%rbp),%rdi
call   10a0 <malloc@plt>
mov    %rax,-0xc0(%rbp)
mov    -0xc0(%rbp),%rax
mov    %rax,-0x40(%rbp)
movq   $0x0,-0x48(%rbp)
movq   $0x0,-0x50(%rbp)
mov    -0x40(%rbp),%rax
test   %rax,%rax
setne  %al
movzbl %al,%edi
call   1080 <assert@plt>
mov    -0x40(%rbp),%rdi
mov    -0x28(%rbp),%rsi
mov    -0xc(%rbp),%edx
lea    -0x48(%rbp),%rcx
call   1040 <_ProtoBufSetVarInt@plt>
mov    -0xc(%rbp),%eax
and    $0x7,%eax
mov    %rax,-0xc8(%rbp)
sub    $0x5,%eax
ja     1367 <_ProtoBufUnknown+0x1c7>
mov    -0xc8(%rbp),%rax
lea    0xd17(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x40(%rbp),%rdi
mov    -0x28(%rbp),%rsi
mov    -0x10(%rbp),%edx
lea    -0x48(%rbp),%rcx
call   1040 <_ProtoBufSetVarInt@plt>
jmp    136c <_ProtoBufUnknown+0x1cc>
mov    -0x40(%rbp),%rdi
mov    -0x28(%rbp),%rsi
mov    -0x10(%rbp),%edx
lea    -0x48(%rbp),%rcx
mov    $0x4,%r8d
call   1090 <_ProtoBufSetFixed@plt>
jmp    136c <_ProtoBufUnknown+0x1cc>
mov    -0x40(%rbp),%rdi
mov    -0x28(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    -0x20(%rbp),%rcx
lea    -0x48(%rbp),%r8
call   10b0 <_ProtoBufSetLenDelim@plt>
jmp    136c <_ProtoBufUnknown+0x1cc>
mov    -0x40(%rbp),%rdi
mov    -0x28(%rbp),%rsi
mov    -0x10(%rbp),%edx
lea    -0x48(%rbp),%rcx
mov    $0x4,%r8d
call   1090 <_ProtoBufSetFixed@plt>
jmp    136c <_ProtoBufUnknown+0x1cc>
jmp    136c <_ProtoBufUnknown+0x1cc>
mov    -0x48(%rbp),%rax
cmp    -0x28(%rbp),%rax
jae    1382 <_ProtoBufUnknown+0x1e2>
mov    -0x48(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
cmpq   $0x0,(%rax)
jne    1410 <_ProtoBufUnknown+0x270>
jmp    1395 <_ProtoBufUnknown+0x1f5>
mov    -0x28(%rbp),%rax
mov    %rax,-0x68(%rbp)
cmpq   $0x0,-0x68(%rbp)
setae  %al
and    $0x1,%al
movzbl %al,%edi
call   1080 <assert@plt>
mov    -0x68(%rbp),%rsi
shl    $0x2,%rsi
add    $0x10,%rsi
mov    $0x1,%edi
call   1070 <calloc@plt>
mov    %rax,%rcx
add    $0x10,%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
cmpq   $0x0,(%rax)
setne  %al
and    $0x1,%al
movzbl %al,%edi
call   1080 <assert@plt>
mov    -0x68(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    %rcx,-0x10(%rax)
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
movq   $0x0,-0x8(%rax)
jmp    140b <_ProtoBufUnknown+0x26b>
jmp    1410 <_ProtoBufUnknown+0x270>
movq   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    -0x8(%rbp),%rcx
mov    (%rcx),%rcx
cmp    -0x8(%rcx),%rax
jae    15b3 <_ProtoBufUnknown+0x413>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    -0x8(%rax),%rax
mov    %rax,-0x58(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%rdx
xor    %eax,%eax
mov    %eax,%esi
lea    -0x58(%rbp),%rcx
lea    -0x48(%rbp),%r8
mov    %rsi,%rdi
call   1060 <_ProtoBufField@plt>
mov    %eax,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jne    159d <_ProtoBufUnknown+0x3fd>
jmp    1473 <_ProtoBufUnknown+0x2d3>
mov    -0x50(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x48(%rbp),%rax
sub    -0x50(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    -0x8(%rbp),%rax
cmpq   $0x0,(%rax)
setne  %al
and    $0x1,%al
movzbl %al,%edi
call   1080 <assert@plt>
xor    %eax,%eax
cmpq   $0x0,-0x70(%rbp)
mov    %al,-0xc9(%rbp)
jb     14c7 <_ProtoBufUnknown+0x327>
mov    -0x70(%rbp),%rax
mov    -0x8(%rbp),%rcx
mov    (%rcx),%rcx
cmp    -0x8(%rcx),%rax
setb   %al
mov    %al,-0xc9(%rbp)
mov    -0xc9(%rbp),%al
and    $0x1,%al
movzbl %al,%edi
call   1080 <assert@plt>
xor    %eax,%eax
cmpq   $0x0,-0x78(%rbp)
mov    %al,-0xca(%rbp)
jb     1506 <_ProtoBufUnknown+0x366>
mov    -0x70(%rbp),%rax
add    -0x78(%rbp),%rax
mov    -0x8(%rbp),%rcx
mov    (%rcx),%rcx
cmp    -0x8(%rcx),%rax
setbe  %al
mov    %al,-0xca(%rbp)
mov    -0xca(%rbp),%al
and    $0x1,%al
movzbl %al,%edi
call   1080 <assert@plt>
mov    -0x78(%rbp),%rdx
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    -0x8(%rax),%rcx
sub    %rdx,%rcx
mov    %rcx,-0x8(%rax)
mov    -0x70(%rbp),%rax
mov    -0x8(%rbp),%rcx
mov    (%rcx),%rcx
cmp    -0x8(%rcx),%rax
jae    1572 <_ProtoBufUnknown+0x3d2>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    -0x70(%rbp),%rcx
add    -0x78(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    -0x70(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x70(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x70(%rbp)
jmp    152c <_ProtoBufUnknown+0x38c>
mov    -0x8(%rbp),%rax
mov    (%rax),%rdi
mov    -0x70(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rdi
mov    -0x78(%rbp),%rdx
shl    $0x2,%rdx
xor    %esi,%esi
call   1050 <memset@plt>
jmp    1598 <_ProtoBufUnknown+0x3f8>
jmp    159d <_ProtoBufUnknown+0x3fd>
mov    -0x5c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jl     15ae <_ProtoBufUnknown+0x40e>
jmp    15b3 <_ProtoBufUnknown+0x413>
jmp    1418 <_ProtoBufUnknown+0x278>
jmp    15b8 <_ProtoBufUnknown+0x418>
mov    -0x8(%rbp),%rax
cmpq   $0x0,(%rax)
setne  %al
and    $0x1,%al
movzbl %al,%edi
call   1080 <assert@plt>
mov    -0x50(%rbp),%rax
mov    %rax,-0x80(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x88(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    -0x8(%rax),%rax
add    -0x88(%rbp),%rax
mov    %rax,-0x90(%rbp)
movq   $0x0,-0x98(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x80(%rbp)
mov    %al,-0xcb(%rbp)
jb     162f <_ProtoBufUnknown+0x48f>
mov    -0x80(%rbp),%rax
mov    -0x8(%rbp),%rcx
mov    (%rcx),%rcx
cmp    -0x8(%rcx),%rax
setbe  %al
mov    %al,-0xcb(%rbp)
mov    -0xcb(%rbp),%al
and    $0x1,%al
movzbl %al,%edi
call   1080 <assert@plt>
mov    $0x1,%al
cmpq   $0x0,-0x40(%rbp)
mov    %al,-0xcc(%rbp)
jne    1663 <_ProtoBufUnknown+0x4c3>
cmpq   $0x0,-0x88(%rbp)
sete   %al
mov    %al,-0xcc(%rbp)
mov    -0xcc(%rbp),%al
and    $0x1,%al
movzbl %al,%edi
call   1080 <assert@plt>
cmpq   $0x0,-0x88(%rbp)
setae  %al
and    $0x1,%al
movzbl %al,%edi
call   1080 <assert@plt>
mov    -0x90(%rbp),%rax
mov    -0x8(%rbp),%rcx
mov    (%rcx),%rcx
cmp    -0x10(%rcx),%rax
jbe    1798 <_ProtoBufUnknown+0x5f8>
jmp    16a5 <_ProtoBufUnknown+0x505>
imul   $0x3,-0x90(%rbp),%rax
03
shr    $0x1,%rax
mov    %rax,-0xa0(%rbp)
mov    -0x8(%rbp),%rax
cmpq   $0x0,(%rax)
setne  %al
and    $0x1,%al
movzbl %al,%edi
call   1080 <assert@plt>
mov    -0xa0(%rbp),%rax
mov    -0x8(%rbp),%rcx
mov    (%rcx),%rcx
cmp    -0x8(%rcx),%rax
setae  %al
and    $0x1,%al
movzbl %al,%edi
call   1080 <assert@plt>
mov    -0x8(%rbp),%rax
mov    (%rax),%rdi
add    $0xfffffffffffffff0,%rdi
mov    -0xa0(%rbp),%rsi
shl    $0x2,%rsi
add    $0x10,%rsi
call   10c0 <realloc@plt>
mov    %rax,%rcx
add    $0x10,%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
cmpq   $0x0,(%rax)
setne  %al
and    $0x1,%al
movzbl %al,%edi
call   1080 <assert@plt>
mov    -0xa0(%rbp),%rax
mov    -0x8(%rbp),%rcx
mov    (%rcx),%rcx
cmp    -0x10(%rcx),%rax
jbe    177c <_ProtoBufUnknown+0x5dc>
mov    -0x8(%rbp),%rax
mov    (%rax),%rdi
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    -0x10(%rax),%rax
shl    $0x2,%rax
add    %rax,%rdi
mov    -0xa0(%rbp),%rdx
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
sub    -0x10(%rax),%rdx
shl    $0x2,%rdx
xor    %esi,%esi
call   1050 <memset@plt>
mov    -0xa0(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    %rcx,-0x10(%rax)
jmp    1793 <_ProtoBufUnknown+0x5f3>
jmp    1798 <_ProtoBufUnknown+0x5f8>
jmp    179d <_ProtoBufUnknown+0x5fd>
mov    -0x90(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x90(%rbp)
mov    -0x80(%rbp),%rcx
add    -0x88(%rbp),%rcx
cmp    %rcx,%rax
jbe    17f4 <_ProtoBufUnknown+0x654>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    -0x90(%rbp),%rcx
sub    -0x88(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    -0x90(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    179d <_ProtoBufUnknown+0x5fd>
jmp    17f9 <_ProtoBufUnknown+0x659>
mov    -0x98(%rbp),%rax
cmp    -0x88(%rbp),%rax
jae    1847 <_ProtoBufUnknown+0x6a7>
mov    -0x40(%rbp),%rax
mov    -0x98(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    -0x80(%rbp),%rcx
add    -0x98(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x98(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x98(%rbp)
jmp    17f9 <_ProtoBufUnknown+0x659>
mov    -0x88(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
add    -0x8(%rax),%rcx
mov    %rcx,-0x8(%rax)
jmp    1862 <_ProtoBufUnknown+0x6c2>
mov    -0xb8(%rbp),%rax
cmp    %rax,-0x40(%rbp)
je     187c <_ProtoBufUnknown+0x6dc>
mov    -0x40(%rbp),%rdi
call   1030 <free@plt>
mov    -0x30(%rbp),%rax
mov    %rax,%rsp
mov    %rbp,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<_ProtoBufUnknown>:
push   %rbp
mov    %rsp,%rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x48,%rsp
mov    %rcx,-0x60(%rbp)
mov    %edx,-0x38(%rbp)
mov    %esi,%ebx
mov    %rdi,%r15
mov    %esi,%r13d
and    $0x7,%r13d
mov    %r8,-0x48(%rbp)
lea    0xa(%r8),%rax
cmp    $0x2,%r13d
mov    $0xa,%r14d
cmove  %rax,%r14
xor    %eax,%eax
cmp    $0x1001,%r14
cmovb  %r14,%rax
lea    0xf(,%rax,4),%rax
and    $0xfffffffffffffff0,%rax
mov    %rsp,%r12
sub    %rax,%r12
mov    %r12,%rsp
mov    %r12,-0x68(%rbp)
cmp    $0x1001,%r14
jb     1214 <_ProtoBufUnknown+0x74>
mov    %r14,%rdi
call   10a0 <malloc@plt>
mov    %rax,%r12
movq   $0x0,-0x30(%rbp)
xor    %edi,%edi
test   %r12,%r12
setne  %dil
call   1080 <assert@plt>
lea    -0x30(%rbp),%rcx
mov    %r12,-0x40(%rbp)
mov    %r12,%rdi
mov    %r14,%r12
mov    %r14,%rsi
mov    %ebx,%edx
call   1040 <_ProtoBufSetVarInt@plt>
cmp    $0x5,%r13d
mov    %ebx,%r14d
ja     12a6 <_ProtoBufUnknown+0x106>
mov    %r13d,%eax
lea    0xdab(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
lea    -0x30(%rbp),%rcx
mov    -0x40(%rbp),%rdi
mov    %r12,%rsi
mov    -0x38(%rbp),%edx
mov    $0x4,%r8d
call   1090 <_ProtoBufSetFixed@plt>
jmp    12a6 <_ProtoBufUnknown+0x106>
lea    -0x30(%rbp),%rcx
mov    -0x40(%rbp),%rdi
mov    %r12,%rsi
mov    -0x38(%rbp),%edx
call   1040 <_ProtoBufSetVarInt@plt>
jmp    12a6 <_ProtoBufUnknown+0x106>
lea    -0x30(%rbp),%r8
mov    -0x40(%rbp),%rdi
mov    %r12,%rsi
mov    -0x60(%rbp),%rdx
mov    -0x48(%rbp),%rcx
call   10b0 <_ProtoBufSetLenDelim@plt>
mov    -0x30(%rbp),%rax
cmp    %r12,%rax
cmovb  %rax,%r12
mov    (%r15),%rdx
test   %rdx,%rdx
mov    %r12,-0x48(%rbp)
jne    12f9 <_ProtoBufUnknown+0x159>
mov    $0x1,%edi
call   1080 <assert@plt>
lea    0x10(,%r12,4),%rsi
mov    $0x1,%edi
call   1070 <calloc@plt>
add    $0x10,%rax
mov    %rax,(%r15)
mov    $0x1,%edi
call   1080 <assert@plt>
mov    (%r15),%rdx
mov    %r12,-0x10(%rdx)
movq   $0x0,-0x8(%rdx)
movq   $0x0,-0x30(%rbp)
mov    -0x8(%rdx),%rax
test   %rax,%rax
je     14f1 <_ProtoBufUnknown+0x351>
xor    %ecx,%ecx
lea    -0x58(%rbp),%r12
lea    -0x30(%rbp),%rbx
mov    %r14d,-0x50(%rbp)
nopl   0x0(%rax)
mov    %rcx,-0x38(%rbp)
mov    %rax,-0x58(%rbp)
xor    %edi,%edi
xor    %esi,%esi
mov    %r12,%rcx
mov    %rbx,%r8
call   1060 <_ProtoBufField@plt>
mov    %eax,%r13d
cmp    %r14d,%eax
jne    14d3 <_ProtoBufUnknown+0x333>
mov    -0x30(%rbp),%rbx
mov    %rbx,%r14
mov    -0x38(%rbp),%r12
sub    %r12,%r14
xor    %edi,%edi
cmpq   $0x0,(%r15)
setne  %dil
call   1080 <assert@plt>
mov    (%r15),%rax
xor    %edi,%edi
cmp    -0x8(%rax),%r12
setb   %dil
call   1080 <assert@plt>
mov    (%r15),%rax
xor    %edi,%edi
cmp    -0x8(%rax),%rbx
setbe  %dil
call   1080 <assert@plt>
mov    (%r15),%rax
mov    -0x8(%rax),%rdx
mov    %rdx,%r11
sub    %r14,%r11
mov    %r11,-0x8(%rax)
mov    %r12,%rcx
cmp    %r11,%r12
jae    14b5 <_ProtoBufUnknown+0x315>
mov    %r12,%r8
mov    %rdx,%r9
sub    %rbx,%r9
mov    %r12,%r10
cmp    $0x8,%r9
jb     1490 <_ProtoBufUnknown+0x2f0>
lea    (%rax,%r8,4),%rcx
lea    (%rax,%rdx,4),%rsi
cmp    %rsi,%rcx
jae    13df <_ProtoBufUnknown+0x23f>
lea    (%r8,%rdx,1),%rcx
sub    %rbx,%rcx
lea    (%rax,%rcx,4),%rcx
lea    (%rax,%rbx,4),%rsi
mov    %r8,%r10
cmp    %rcx,%rsi
jb     1490 <_ProtoBufUnknown+0x2f0>
mov    %r9,%r10
and    $0xfffffffffffffff8,%r10
lea    -0x8(%r10),%rcx
mov    %rcx,%r12
shr    $0x3,%r12
add    $0x1,%r12
test   %rcx,%rcx
je     1456 <_ProtoBufUnknown+0x2b6>
mov    %r12,%rdi
and    $0xfffffffffffffffe,%rdi
lea    (%rax,%r8,4),%rcx
add    $0x30,%rcx
lea    (%rax,%rbx,4),%r8
add    $0x30,%r8
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movups -0x30(%r8,%rsi,4),%xmm0
movups -0x20(%r8,%rsi,4),%xmm1
movups %xmm0,-0x30(%rcx,%rsi,4)
movups %xmm1,-0x20(%rcx,%rsi,4)
movups -0x10(%r8,%rsi,4),%xmm0
movups (%r8,%rsi,4),%xmm1
movups %xmm0,-0x10(%rcx,%rsi,4)
movups %xmm1,(%rcx,%rsi,4)
add    $0x10,%rsi
add    $0xfffffffffffffffe,%rdi
jne    1420 <_ProtoBufUnknown+0x280>
jmp    1458 <_ProtoBufUnknown+0x2b8>
xor    %esi,%esi
test   $0x1,%r12b
mov    -0x38(%rbp),%r8
je     147b <_ProtoBufUnknown+0x2db>
lea    (%r8,%rsi,1),%rcx
add    %rbx,%rsi
movups (%rax,%rsi,4),%xmm0
movups 0x10(%rax,%rsi,4),%xmm1
movups %xmm0,(%rax,%rcx,4)
movups %xmm1,0x10(%rax,%rcx,4)
cmp    %r10,%r9
je     14b2 <_ProtoBufUnknown+0x312>
add    %r8,%r10
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    %r10,%rbx
sub    %r8,%rbx
lea    (%rax,%r10,4),%rcx
nopw   0x0(%rax,%rax,1)
mov    (%rax,%rbx,4),%esi
mov    %esi,(%rcx)
add    $0x1,%rbx
add    $0x4,%rcx
cmp    %rbx,%rdx
jne    14a0 <_ProtoBufUnknown+0x300>
mov    %r11,%rcx
lea    (%rax,%rcx,4),%rdi
shl    $0x2,%r14
xor    %esi,%esi
mov    %r14,%rdx
call   1050 <memset@plt>
mov    -0x50(%rbp),%r14d
lea    -0x58(%rbp),%r12
lea    -0x30(%rbp),%rbx
cmp    %r14d,%r13d
jge    14f9 <_ProtoBufUnknown+0x359>
mov    -0x30(%rbp),%rcx
mov    (%r15),%rdx
mov    -0x8(%rdx),%rax
cmp    %rax,%rcx
jb     1320 <_ProtoBufUnknown+0x180>
mov    %r15,%rbx
jmp    14ff <_ProtoBufUnknown+0x35f>
mov    %r15,%rbx
xor    %r13d,%r13d
jmp    1503 <_ProtoBufUnknown+0x363>
mov    %r15,%rbx
mov    (%r15),%rdx
mov    -0x38(%rbp),%r13
cmpq   $0x0,-0x40(%rbp)
setne  %r15b
xor    %edi,%edi
test   %rdx,%rdx
setne  %dil
call   1080 <assert@plt>
mov    %rbx,%r12
mov    (%rbx),%rax
mov    -0x8(%rax),%rax
mov    -0x48(%rbp),%r14
lea    (%rax,%r14,1),%rbx
xor    %edi,%edi
mov    %rax,-0x50(%rbp)
sub    %r13,%rax
mov    %rax,-0x38(%rbp)
setae  %dil
call   1080 <assert@plt>
test   %r14,%r14
sete   %al
or     %r15b,%al
mov    %r12,%r15
movzbl %al,%edi
call   1080 <assert@plt>
mov    $0x1,%edi
call   1080 <assert@plt>
mov    (%r12),%r10
cmp    -0x10(%r10),%rbx
jbe    15db <_ProtoBufUnknown+0x43b>
lea    (%rbx,%rbx,2),%r14
shr    %r14
mov    $0x1,%edi
call   1080 <assert@plt>
mov    (%r15),%rax
xor    %edi,%edi
cmp    -0x8(%rax),%r14
setae  %dil
call   1080 <assert@plt>
mov    (%r15),%rdi
add    $0xfffffffffffffff0,%rdi
lea    0x10(,%r14,4),%rsi
call   10c0 <realloc@plt>
add    $0x10,%rax
mov    %rax,(%r15)
mov    $0x1,%edi
call   1080 <assert@plt>
mov    (%r15),%r10
mov    -0x10(%r10),%rax
mov    %r14,%rdx
sub    %rax,%rdx
jbe    15d3 <_ProtoBufUnknown+0x433>
lea    (%r10,%rax,4),%rdi
shl    $0x2,%rdx
xor    %esi,%esi
call   1050 <memset@plt>
mov    (%r15),%r10
mov    %r14,-0x10(%r10)
mov    -0x48(%rbp),%r14
mov    %r13,%r15
lea    (%r14,%r13,1),%r12
cmp    %r12,%rbx
mov    -0x40(%rbp),%rdi
jbe    1622 <_ProtoBufUnknown+0x482>
mov    -0x38(%rbp),%r13
cmp    $0x8,%r13
jae    16cc <_ProtoBufUnknown+0x52c>
lea    -0x4(%r10),%rax
lea    0x0(,%r14,4),%rdx
mov    %rax,%rcx
sub    %rdx,%rcx
nopl   0x0(%rax,%rax,1)
mov    (%rcx,%rbx,4),%edx
mov    %edx,(%rax,%rbx,4)
lea    -0x1(%rbx),%rdx
mov    %rdx,%rbx
cmp    %r12,%rdx
ja     1610 <_ProtoBufUnknown+0x470>
test   %r14,%r14
je     18e4 <_ProtoBufUnknown+0x744>
cmp    $0x8,%r14
jb     164f <_ProtoBufUnknown+0x4af>
lea    (%r10,%r15,4),%rax
lea    (%rdi,%r14,4),%rcx
cmp    %rcx,%rax
jae    17fc <_ProtoBufUnknown+0x65c>
lea    (%r10,%r12,4),%rax
cmp    %rax,%rdi
jae    17fc <_ProtoBufUnknown+0x65c>
xor    %eax,%eax
mov    %rax,%rdx
not    %rdx
add    %r14,%rdx
mov    %r14,%rcx
and    $0x3,%rcx
je     1680 <_ProtoBufUnknown+0x4e0>
lea    (%r10,%r15,4),%rsi
nopw   0x0(%rax,%rax,1)
mov    (%rdi,%rax,4),%ebx
mov    %ebx,(%rsi,%rax,4)
add    $0x1,%rax
add    $0xffffffffffffffff,%rcx
jne    1670 <_ProtoBufUnknown+0x4d0>
cmp    $0x3,%rdx
jb     18e4 <_ProtoBufUnknown+0x744>
lea    (%r10,%r15,4),%rcx
add    $0xc,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    (%rdi,%rax,4),%edx
mov    %edx,-0xc(%rcx,%rax,4)
mov    0x4(%rdi,%rax,4),%edx
mov    %edx,-0x8(%rcx,%rax,4)
mov    0x8(%rdi,%rax,4),%edx
mov    %edx,-0x4(%rcx,%rax,4)
mov    0xc(%rdi,%rax,4),%edx
mov    %edx,(%rcx,%rax,4)
add    $0x4,%rax
cmp    %rax,%r14
jne    16a0 <_ProtoBufUnknown+0x500>
jmp    18e4 <_ProtoBufUnknown+0x744>
mov    %r15,%rax
not    %rax
mov    -0x50(%rbp),%rsi
add    %rsi,%rax
lea    (%rsi,%r14,1),%r11
mov    $0x4,%ecx
mul    %rcx
lea    -0x4(%r10,%r11,4),%rcx
seto   %r9b
mov    %rcx,%rdx
sub    %rax,%rdx
cmp    %rcx,%rdx
ja     15f9 <_ProtoBufUnknown+0x459>
test   %r9b,%r9b
jne    15f9 <_ProtoBufUnknown+0x459>
lea    (%r10,%rsi,4),%rdx
add    $0xfffffffffffffffc,%rdx
mov    %rdx,%rcx
sub    %rax,%rcx
cmp    %rdx,%rcx
ja     15f9 <_ProtoBufUnknown+0x459>
test   %r9b,%r9b
jne    15f9 <_ProtoBufUnknown+0x459>
lea    (%r10,%r12,4),%rax
lea    (%r10,%rsi,4),%rcx
cmp    %rcx,%rax
jae    1747 <_ProtoBufUnknown+0x5a7>
mov    %r15,%r8
lea    (%r10,%rbx,4),%rax
lea    (%r10,%r15,4),%rcx
cmp    %rax,%rcx
jb     15f9 <_ProtoBufUnknown+0x459>
mov    %r13,%r8
and    $0xfffffffffffffff8,%r8
lea    -0x8(%r8),%rax
mov    %rax,%r9
shr    $0x3,%r9
add    $0x1,%r9
test   %rax,%rax
je     1902 <_ProtoBufUnknown+0x762>
mov    %r9,%rdx
and    $0xfffffffffffffffe,%rdx
lea    (%r10,%r11,4),%rsi
add    $0xfffffffffffffff0,%rsi
mov    -0x50(%rbp),%rax
lea    (%r10,%rax,4),%rcx
add    $0xfffffffffffffff0,%rcx
mov    $0xfffffffffffffffc,%rax
nopl   0x0(%rax,%rax,1)
movups (%rcx,%rax,4),%xmm0
movups 0x10(%rcx,%rax,4),%xmm1
movups %xmm1,0x10(%rsi,%rax,4)
movups %xmm0,(%rsi,%rax,4)
movups -0x20(%rcx,%rax,4),%xmm0
movups -0x10(%rcx,%rax,4),%xmm1
movups %xmm1,-0x10(%rsi,%rax,4)
movups %xmm0,-0x20(%rsi,%rax,4)
add    $0xfffffffffffffff0,%rax
add    $0xfffffffffffffffe,%rdx
jne    1790 <_ProtoBufUnknown+0x5f0>
add    $0x3,%rax
test   $0x1,%r9b
je     17eb <_ProtoBufUnknown+0x64b>
add    %rbx,%rax
mov    %rax,%rcx
sub    %r14,%rcx
movups -0x1c(%r10,%rcx,4),%xmm0
movups -0xc(%r10,%rcx,4),%xmm1
movups %xmm1,-0xc(%r10,%rax,4)
movups %xmm0,-0x1c(%r10,%rax,4)
cmp    %r8,%r13
je     1622 <_ProtoBufUnknown+0x482>
sub    %r8,%rbx
jmp    15f9 <_ProtoBufUnknown+0x459>
mov    %r14,%rax
and    $0xfffffffffffffff8,%rax
lea    -0x8(%rax),%rcx
mov    %rcx,%rsi
shr    $0x3,%rsi
add    $0x1,%rsi
mov    %esi,%r8d
and    $0x3,%r8d
cmp    $0x18,%rcx
jae    1823 <_ProtoBufUnknown+0x683>
xor    %edx,%edx
jmp    1898 <_ProtoBufUnknown+0x6f8>
movabs $0x3ffffffffffffffe,%rcx
ff ff 3f
add    $0xfffffffffffffffe,%rcx
and    %rcx,%rsi
lea    (%r10,%r15,4),%rbx
add    $0x70,%rbx
xor    %edx,%edx
xchg   %ax,%ax
movups (%rdi,%rdx,4),%xmm0
movups 0x10(%rdi,%rdx,4),%xmm1
movups %xmm0,-0x70(%rbx,%rdx,4)
movups %xmm1,-0x60(%rbx,%rdx,4)
movups 0x20(%rdi,%rdx,4),%xmm0
movups 0x30(%rdi,%rdx,4),%xmm1
movups %xmm0,-0x50(%rbx,%rdx,4)
movups %xmm1,-0x40(%rbx,%rdx,4)
movups 0x40(%rdi,%rdx,4),%xmm0
movups 0x50(%rdi,%rdx,4),%xmm1
movups %xmm0,-0x30(%rbx,%rdx,4)
movups %xmm1,-0x20(%rbx,%rdx,4)
movups 0x60(%rdi,%rdx,4),%xmm0
movups 0x70(%rdi,%rdx,4),%xmm1
movups %xmm0,-0x10(%rbx,%rdx,4)
movups %xmm1,(%rbx,%rdx,4)
add    $0x20,%rdx
add    $0xfffffffffffffffc,%rsi
jne    1840 <_ProtoBufUnknown+0x6a0>
test   %r8,%r8
je     18db <_ProtoBufUnknown+0x73b>
lea    (%r15,%rdx,1),%rcx
lea    (%r10,%rcx,4),%rcx
add    $0x10,%rcx
lea    (%rdi,%rdx,4),%rsi
add    $0x10,%rsi
shl    $0x5,%r8
xor    %edx,%edx
nopw   0x0(%rax,%rax,1)
movups -0x10(%rsi,%rdx,1),%xmm0
movups (%rsi,%rdx,1),%xmm1
movups %xmm0,-0x10(%rcx,%rdx,1)
movups %xmm1,(%rcx,%rdx,1)
add    $0x20,%rdx
cmp    %rdx,%r8
jne    18c0 <_ProtoBufUnknown+0x720>
cmp    %rax,%r14
jne    1651 <_ProtoBufUnknown+0x4b1>
add    %r14,-0x8(%r10)
cmp    -0x68(%rbp),%rdi
je     18f3 <_ProtoBufUnknown+0x753>
call   1030 <free@plt>
lea    -0x28(%rbp),%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    $0xffffffffffffffff,%rax
test   $0x1,%r9b
jne    17ca <_ProtoBufUnknown+0x62a>
jmp    17eb <_ProtoBufUnknown+0x64b>

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

LLVM IR (-O2):
define void @_ProtoBufUnknown(i32** %0, i32 %1, i32 %2, i8* %3, i64 %4) {
%6 = alloca i64
%7 = alloca i64
%8 = and i32 %1, 7
%9 = icmp eq i32 %8, 2
%10 = add i64 %4, 10
%11 = select i1 %9, i64 %10, i64 10
%12 = icmp ult i64 %11, 4097
%13 = select i1 %12, i64 %11, i64 0
%14 = alloca i32, i64 %13
br i1 %12, label %17, label %15
15: ; preds = %5
%16 = tail call i32* @malloc(i64 %11)
br label %17
17: ; preds = %5, %15
%18 = phi i32* [ %16, %15 ], [ %14, %5 ]
%19 = bitcast i64* %6 to i8*
store i64 0, i64* %6
%20 = bitcast i64* %7 to i8*
%21 = icmp ne i32* %18, null
%22 = zext i1 %21 to i32
%23 = call i32 @assert(i32 %22)
%24 = call i32 @_ProtoBufSetVarInt(i32* %18, i64 %11, i32 %1, i64* %6)
switch i32 %8, label %33 [
i32 0, label %25
i32 1, label %27
i32 2, label %29
i32 5, label %31
]
25: ; preds = %17
%26 = call i32 @_ProtoBufSetVarInt(i32* %18, i64 %11, i32 %2, i64* %6)
br label %33
27: ; preds = %17
%28 = call i32 @_ProtoBufSetFixed(i32* %18, i64 %11, i32 %2, i64* %6, i32 4)
br label %33
29: ; preds = %17
%30 = call i32 @_ProtoBufSetLenDelim(i32* %18, i64 %11, i8* %3, i64 %4, i64* %6)
br label %33
31: ; preds = %17
%32 = call i32 @_ProtoBufSetFixed(i32* %18, i64 %11, i32 %2, i64* %6, i32 4)
br label %33
33: ; preds = %17, %31, %29, %27, %25
%34 = load i64, i64* %6
%35 = icmp ult i64 %34, %11
%36 = select i1 %35, i64 %34, i64 %11
%37 = load i32*, i32** %0
%38 = icmp eq i32* %37, null
br i1 %38, label %41, label %39
39: ; preds = %33
%40 = bitcast i32* %37 to i64*
br label %54
41: ; preds = %33
%42 = call i32 @assert(i32 1)
%43 = shl i64 %36, 2
%44 = add i64 %43, 16
%45 = call i64 @calloc(i32 1, i64 %44)
%46 = inttoptr i64 %45 to i64*
%47 = getelementptr inbounds i64, i64* %46, i64 2
%48 = bitcast i32** %0 to i64**
store i64* %47, i64** %48
%49 = call i32 @assert(i32 1)
%50 = load i64*, i64** %48
%51 = getelementptr inbounds i64, i64* %50, i64 -2
store i64 %36, i64* %51
%52 = getelementptr inbounds i64, i64* %50, i64 -1
store i64 0, i64* %52
%53 = bitcast i64* %50 to i32*
br label %54
54: ; preds = %39, %41
%55 = phi i32* [ %53, %41 ], [ %37, %39 ]
%56 = phi i64* [ %50, %41 ], [ %40, %39 ]
%57 = bitcast i32** %0 to i64**
store i64 0, i64* %6
%58 = getelementptr inbounds i64, i64* %56, i64 -1
%59 = load i64, i64* %58
%60 = icmp eq i64 %59, 0
br i1 %60, label %197, label %68
61: ; preds = %191
%62 = load i64, i64* %6
%63 = load i64*, i64** %57
%64 = getelementptr inbounds i64, i64* %63, i64 -1
%65 = load i64, i64* %64
%66 = icmp ult i64 %62, %65
%67 = bitcast i64* %63 to i32*
br i1 %66, label %68, label %195
68: ; preds = %54, %61
%69 = phi i32* [ %67, %61 ], [ %55, %54 ]
%70 = phi i64 [ %65, %61 ], [ %59, %54 ]
%71 = phi i64 [ %62, %61 ], [ 0, %54 ]
store i64 %70, i64* %7
%72 = call i32 @_ProtoBufField(i32* null, i32* null, i32* %69, i64* %7, i64* %6)
%73 = icmp eq i32 %72, %1
br i1 %73, label %74, label %191
74: ; preds = %68
%75 = load i64, i64* %6
%76 = sub i64 %75, %71
%77 = load i32*, i32** %0
%78 = icmp ne i32* %77, null
%79 = zext i1 %78 to i32
%80 = call i32 @assert(i32 %79)
%81 = load i64*, i64** %57
%82 = getelementptr inbounds i64, i64* %81, i64 -1
%83 = load i64, i64* %82
%84 = icmp ult i64 %71, %83
%85 = zext i1 %84 to i32
%86 = call i32 @assert(i32 %85)
%87 = load i64*, i64** %57
%88 = getelementptr inbounds i64, i64* %87, i64 -1
%89 = load i64, i64* %88
%90 = icmp ule i64 %75, %89
%91 = zext i1 %90 to i32
%92 = call i32 @assert(i32 %91)
%93 = load i64*, i64** %57
%94 = bitcast i64* %93 to i8*
%95 = getelementptr inbounds i64, i64* %93, i64 -1
%96 = load i64, i64* %95
%97 = sub i64 %96, %76
store i64 %97, i64* %95
%98 = bitcast i64* %93 to i32*
%99 = icmp ult i64 %71, %97
br i1 %99, label %100, label %186
100: ; preds = %74
%101 = sub i64 %96, %75
%102 = icmp ult i64 %101, 8
br i1 %102, label %176, label %103
103: ; preds = %100
%104 = shl i64 %71, 2
%105 = getelementptr i8, i8* %94, i64 %104
%106 = add i64 %71, %96
%107 = shl i64 %75, 2
%108 = sub i64 %106, %75
%109 = shl i64 %108, 2
%110 = getelementptr i8, i8* %94, i64 %109
%111 = getelementptr i8, i8* %94, i64 %107
%112 = shl i64 %96, 2
%113 = getelementptr i8, i8* %94, i64 %112
%114 = icmp ult i8* %105, %113
%115 = icmp ult i8* %111, %110
%116 = and i1 %114, %115
br i1 %116, label %176, label %117
117: ; preds = %103
%118 = and i64 %101, -8
%119 = add i64 %71, %118
%120 = add i64 %118, -8
%121 = lshr exact i64 %120, 3
%122 = add nuw nsw i64 %121, 1
%123 = and i64 %122, 1
%124 = icmp eq i64 %120, 0
br i1 %124, label %158, label %125
125: ; preds = %117
%126 = and i64 %122, 4611686018427387902
br label %127
127: ; preds = %127, %125
%128 = phi i64 [ 0, %125 ], [ %155, %127 ]
%129 = phi i64 [ 0, %125 ], [ %156, %127 ]
%130 = add i64 %71, %128
%131 = add i64 %75, %128
%132 = getelementptr inbounds i32, i32* %98, i64 %131
%133 = bitcast i32* %132 to <4 x i32>*
%134 = load <4 x i32>, <4 x i32>* %133
%135 = getelementptr inbounds i32, i32* %132, i64 4
%136 = bitcast i32* %135 to <4 x i32>*
%137 = load <4 x i32>, <4 x i32>* %136
%138 = getelementptr inbounds i32, i32* %98, i64 %130
%139 = bitcast i32* %138 to <4 x i32>*
store <4 x i32> %134, <4 x i32>* %139
%140 = getelementptr inbounds i32, i32* %138, i64 4
%141 = bitcast i32* %140 to <4 x i32>*
store <4 x i32> %137, <4 x i32>* %141
%142 = or i64 %128, 8
%143 = add i64 %71, %142
%144 = add i64 %75, %142
%145 = getelementptr inbounds i32, i32* %98, i64 %144
%146 = bitcast i32* %145 to <4 x i32>*
%147 = load <4 x i32>, <4 x i32>* %146
%148 = getelementptr inbounds i32, i32* %145, i64 4
%149 = bitcast i32* %148 to <4 x i32>*
%150 = load <4 x i32>, <4 x i32>* %149
%151 = getelementptr inbounds i32, i32* %98, i64 %143
%152 = bitcast i32* %151 to <4 x i32>*
store <4 x i32> %147, <4 x i32>* %152
%153 = getelementptr inbounds i32, i32* %151, i64 4
%154 = bitcast i32* %153 to <4 x i32>*
store <4 x i32> %150, <4 x i32>* %154
%155 = add nuw i64 %128, 16
%156 = add i64 %129, 2
%157 = icmp eq i64 %156, %126
br i1 %157, label %158, label %127
158: ; preds = %127, %117
%159 = phi i64 [ 0, %117 ], [ %155, %127 ]
%160 = icmp eq i64 %123, 0
br i1 %160, label %174, label %161
161: ; preds = %158
%162 = add i64 %71, %159
%163 = add i64 %75, %159
%164 = getelementptr inbounds i32, i32* %98, i64 %163
%165 = bitcast i32* %164 to <4 x i32>*
%166 = load <4 x i32>, <4 x i32>* %165
%167 = getelementptr inbounds i32, i32* %164, i64 4
%168 = bitcast i32* %167 to <4 x i32>*
%169 = load <4 x i32>, <4 x i32>* %168
%170 = getelementptr inbounds i32, i32* %98, i64 %162
%171 = bitcast i32* %170 to <4 x i32>*
store <4 x i32> %166, <4 x i32>* %171
%172 = getelementptr inbounds i32, i32* %170, i64 4
%173 = bitcast i32* %172 to <4 x i32>*
store <4 x i32> %169, <4 x i32>* %173
br label %174
174: ; preds = %158, %161
%175 = icmp eq i64 %101, %118
br i1 %175, label %186, label %176
176: ; preds = %103, %100, %174
%177 = phi i64 [ %71, %103 ], [ %71, %100 ], [ %119, %174 ]
br label %178
178: ; preds = %176, %178
%179 = phi i64 [ %184, %178 ], [ %177, %176 ]
%180 = add i64 %179, %76
%181 = getelementptr inbounds i32, i32* %98, i64 %180
%182 = load i32, i32* %181
%183 = getelementptr inbounds i32, i32* %98, i64 %179
store i32 %182, i32* %183
%184 = add nuw i64 %179, 1
%185 = icmp eq i64 %184, %97
br i1 %185, label %186, label %178
186: ; preds = %178, %174, %74
%187 = phi i64 [ %71, %74 ], [ %97, %174 ], [ %97, %178 ]
%188 = getelementptr inbounds i32, i32* %98, i64 %187
%189 = shl i64 %76, 2
%190 = call i32 @memset(i32* %188, i32 0, i64 %189)
br label %191
191: ; preds = %186, %68
%192 = icmp slt i32 %72, %1
br i1 %192, label %61, label %193
193: ; preds = %191
%194 = load i32*, i32** %0
br label %197
195: ; preds = %61
%196 = bitcast i64* %63 to i32*
br label %197
197: ; preds = %195, %193, %54
%198 = phi i32* [ %55, %54 ], [ %194, %193 ], [ %196, %195 ]
%199 = phi i64 [ 0, %54 ], [ %71, %193 ], [ %71, %195 ]
%200 = icmp ne i32* %198, null
%201 = zext i1 %200 to i32
%202 = call i32 @assert(i32 %201)
%203 = load i64*, i64** %57
%204 = getelementptr inbounds i64, i64* %203, i64 -1
%205 = load i64, i64* %204
%206 = add i64 %205, %36
%207 = icmp uge i64 %205, %199
%208 = zext i1 %207 to i32
%209 = call i32 @assert(i32 %208)
%210 = icmp eq i64 %36, 0
%211 = select i1 %21, i1 true, i1 %210
%212 = zext i1 %211 to i32
%213 = call i32 @assert(i32 %212)
%214 = call i32 @assert(i32 1)
%215 = load i32*, i32** %0
%216 = getelementptr inbounds i32, i32* %215, i64 -4
%217 = bitcast i32* %216 to i64*
%218 = load i64, i64* %217
%219 = icmp ugt i64 %206, %218
%220 = bitcast i32* %215 to i64*
br i1 %219, label %221, label %256
221: ; preds = %197
%222 = mul i64 %206, 3
%223 = lshr i64 %222, 1
%224 = call i32 @assert(i32 1)
%225 = load i64*, i64** %57
%226 = getelementptr inbounds i64, i64* %225, i64 -1
%227 = load i64, i64* %226
%228 = icmp uge i64 %223, %227
%229 = zext i1 %228 to i32
%230 = call i32 @assert(i32 %229)
%231 = load i64*, i64** %57
%232 = getelementptr inbounds i64, i64* %231, i64 -2
%233 = shl i64 %223, 2
%234 = add i64 %233, 16
%235 = call i64 @realloc(i64* %232, i64 %234)
%236 = inttoptr i64 %235 to i64*
%237 = getelementptr inbounds i64, i64* %236, i64 2
store i64* %237, i64** %57
%238 = call i32 @assert(i32 1)
%239 = load i32*, i32** %0
%240 = getelementptr inbounds i32, i32* %239, i64 -4
%241 = bitcast i32* %240 to i64*
%242 = load i64, i64* %241
%243 = icmp ugt i64 %223, %242
%244 = bitcast i32* %239 to i64*
br i1 %243, label %245, label %252
245: ; preds = %221
%246 = getelementptr inbounds i32, i32* %239, i64 %242
%247 = sub i64 %223, %242
%248 = shl i64 %247, 2
%249 = call i32 @memset(i32* %246, i32 0, i64 %248)
%250 = load i64*, i64** %57
%251 = bitcast i64* %250 to i32*
br label %252
252: ; preds = %245, %221
%253 = phi i64* [ %250, %245 ], [ %244, %221 ]
%254 = phi i32* [ %251, %245 ], [ %239, %221 ]
%255 = getelementptr inbounds i64, i64* %253, i64 -2
store i64 %223, i64* %255
br label %256
256: ; preds = %252, %197
%257 = phi i64* [ %253, %252 ], [ %220, %197 ]
%258 = phi i32* [ %254, %252 ], [ %215, %197 ]
%259 = add i64 %199, %36
%260 = icmp ugt i64 %206, %259
br i1 %260, label %261, label %373
261: ; preds = %256
%262 = sub i64 %205, %199
%263 = icmp ult i64 %262, 8
br i1 %263, label %371, label %264
264: ; preds = %261
%265 = xor i64 %199, -1
%266 = add i64 %205, %265
%267 = add i64 %205, %36
%268 = add i64 %267, -1
%269 = getelementptr i32, i32* %258, i64 %268
%270 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %266, i64 4)
%271 = extractvalue { i64, i1 } %270, 0
%272 = extractvalue { i64, i1 } %270, 1
%273 = bitcast i32* %269 to i8*
%274 = sub i64 0, %271
%275 = getelementptr i8, i8* %273, i64 %274
%276 = icmp ugt i8* %275, %273
%277 = or i1 %276, %272
%278 = add i64 %205, -1
%279 = getelementptr i32, i32* %258, i64 %278
%280 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %266, i64 4)
%281 = extractvalue { i64, i1 } %280, 0
%282 = extractvalue { i64, i1 } %280, 1
%283 = bitcast i32* %279 to i8*
%284 = sub i64 0, %281
%285 = getelementptr i8, i8* %283, i64 %284
%286 = icmp ugt i8* %285, %283
%287 = or i1 %286, %282
%288 = or i1 %277, %287
br i1 %288, label %371, label %289
289: ; preds = %264
%290 = getelementptr i32, i32* %258, i64 %259
%291 = getelementptr i32, i32* %258, i64 %206
%292 = getelementptr i32, i32* %258, i64 %199
%293 = getelementptr i32, i32* %258, i64 %205
%294 = icmp ult i32* %290, %293
%295 = icmp ult i32* %292, %291
%296 = and i1 %294, %295
br i1 %296, label %371, label %297
297: ; preds = %289
%298 = and i64 %262, -8
%299 = sub i64 %206, %298
%300 = add i64 %298, -8
%301 = lshr exact i64 %300, 3
%302 = add nuw nsw i64 %301, 1
%303 = and i64 %302, 1
%304 = icmp eq i64 %300, 0
br i1 %304, label %349, label %305
305: ; preds = %297
%306 = and i64 %302, 4611686018427387902
br label %307
307: ; preds = %307, %305
%308 = phi i64 [ 0, %305 ], [ %344, %307 ]
%309 = phi i64 [ 0, %305 ], [ %345, %307 ]
%310 = xor i64 %308, -1
%311 = add i64 %206, %310
%312 = sub i64 %311, %36
%313 = getelementptr inbounds i32, i32* %258, i64 %312
%314 = getelementptr inbounds i32, i32* %313, i64 -3
%315 = bitcast i32* %314 to <4 x i32>*
%316 = load <4 x i32>, <4 x i32>* %315
%317 = getelementptr inbounds i32, i32* %313, i64 -4
%318 = getelementptr inbounds i32, i32* %317, i64 -3
%319 = bitcast i32* %318 to <4 x i32>*
%320 = load <4 x i32>, <4 x i32>* %319
%321 = getelementptr inbounds i32, i32* %258, i64 %311
%322 = getelementptr inbounds i32, i32* %321, i64 -3
%323 = bitcast i32* %322 to <4 x i32>*
store <4 x i32> %316, <4 x i32>* %323
%324 = getelementptr inbounds i32, i32* %321, i64 -4
%325 = getelementptr inbounds i32, i32* %324, i64 -3
%326 = bitcast i32* %325 to <4 x i32>*
store <4 x i32> %320, <4 x i32>* %326
%327 = sub nuw nsw i64 -9, %308
%328 = add i64 %206, %327
%329 = sub i64 %328, %36
%330 = getelementptr inbounds i32, i32* %258, i64 %329
%331 = getelementptr inbounds i32, i32* %330, i64 -3
%332 = bitcast i32* %331 to <4 x i32>*
%333 = load <4 x i32>, <4 x i32>* %332
%334 = getelementptr inbounds i32, i32* %330, i64 -4
%335 = getelementptr inbounds i32, i32* %334, i64 -3
%336 = bitcast i32* %335 to <4 x i32>*
%337 = load <4 x i32>, <4 x i32>* %336
%338 = getelementptr inbounds i32, i32* %258, i64 %328
%339 = getelementptr inbounds i32, i32* %338, i64 -3
%340 = bitcast i32* %339 to <4 x i32>*
store <4 x i32> %333, <4 x i32>* %340
%341 = getelementptr inbounds i32, i32* %338, i64 -4
%342 = getelementptr inbounds i32, i32* %341, i64 -3
%343 = bitcast i32* %342 to <4 x i32>*
store <4 x i32> %337, <4 x i32>* %343
%344 = add nuw i64 %308, 16
%345 = add i64 %309, 2
%346 = icmp eq i64 %345, %306
br i1 %346, label %347, label %307
347: ; preds = %307
%348 = sub i64 -17, %308
br label %349
349: ; preds = %347, %297
%350 = phi i64 [ -1, %297 ], [ %348, %347 ]
%351 = icmp eq i64 %303, 0
br i1 %351, label %369, label %352
352: ; preds = %349
%353 = add i64 %206, %350
%354 = sub i64 %353, %36
%355 = getelementptr inbounds i32, i32* %258, i64 %354
%356 = getelementptr inbounds i32, i32* %355, i64 -3
%357 = bitcast i32* %356 to <4 x i32>*
%358 = load <4 x i32>, <4 x i32>* %357
%359 = getelementptr inbounds i32, i32* %355, i64 -4
%360 = getelementptr inbounds i32, i32* %359, i64 -3
%361 = bitcast i32* %360 to <4 x i32>*
%362 = load <4 x i32>, <4 x i32>* %361
%363 = getelementptr inbounds i32, i32* %258, i64 %353
%364 = getelementptr inbounds i32, i32* %363, i64 -3
%365 = bitcast i32* %364 to <4 x i32>*
store <4 x i32> %358, <4 x i32>* %365
%366 = getelementptr inbounds i32, i32* %363, i64 -4
%367 = getelementptr inbounds i32, i32* %366, i64 -3
%368 = bitcast i32* %367 to <4 x i32>*
store <4 x i32> %362, <4 x i32>* %368
br label %369
369: ; preds = %349, %352
%370 = icmp eq i64 %262, %298
br i1 %370, label %373, label %371
371: ; preds = %289, %264, %261, %369
%372 = phi i64 [ %206, %289 ], [ %206, %264 ], [ %206, %261 ], [ %299, %369 ]
br label %486
373: ; preds = %486, %369, %256
br i1 %210, label %517, label %374
374: ; preds = %373
%375 = icmp ult i64 %36, 8
br i1 %375, label %467, label %376
376: ; preds = %374
%377 = getelementptr i32, i32* %258, i64 %199
%378 = getelementptr i32, i32* %258, i64 %259
%379 = getelementptr i32, i32* %18, i64 %36
%380 = icmp ult i32* %377, %379
%381 = icmp ult i32* %18, %378
%382 = and i1 %380, %381
br i1 %382, label %467, label %383
383: ; preds = %376
%384 = and i64 %36, -8
%385 = add i64 %384, -8
%386 = lshr exact i64 %385, 3
%387 = add nuw nsw i64 %386, 1
%388 = and i64 %387, 3
%389 = icmp ult i64 %385, 24
br i1 %389, label %445, label %390
390: ; preds = %383
%391 = and i64 %387, 4611686018427387900
br label %392
392: ; preds = %392, %390
%393 = phi i64 [ 0, %390 ], [ %442, %392 ]
%394 = phi i64 [ 0, %390 ], [ %443, %392 ]
%395 = getelementptr inbounds i32, i32* %18, i64 %393
%396 = bitcast i32* %395 to <4 x i32>*
%397 = load <4 x i32>, <4 x i32>* %396
%398 = getelementptr inbounds i32, i32* %395, i64 4
%399 = bitcast i32* %398 to <4 x i32>*
%400 = load <4 x i32>, <4 x i32>* %399
%401 = add i64 %393, %199
%402 = getelementptr inbounds i32, i32* %258, i64 %401
%403 = bitcast i32* %402 to <4 x i32>*
store <4 x i32> %397, <4 x i32>* %403
%404 = getelementptr inbounds i32, i32* %402, i64 4
%405 = bitcast i32* %404 to <4 x i32>*
store <4 x i32> %400, <4 x i32>* %405
%406 = or i64 %393, 8
%407 = getelementptr inbounds i32, i32* %18, i64 %406
%408 = bitcast i32* %407 to <4 x i32>*
%409 = load <4 x i32>, <4 x i32>* %408
%410 = getelementptr inbounds i32, i32* %407, i64 4
%411 = bitcast i32* %410 to <4 x i32>*
%412 = load <4 x i32>, <4 x i32>* %411
%413 = add i64 %406, %199
%414 = getelementptr inbounds i32, i32* %258, i64 %413
%415 = bitcast i32* %414 to <4 x i32>*
store <4 x i32> %409, <4 x i32>* %415
%416 = getelementptr inbounds i32, i32* %414, i64 4
%417 = bitcast i32* %416 to <4 x i32>*
store <4 x i32> %412, <4 x i32>* %417
%418 = or i64 %393, 16
%419 = getelementptr inbounds i32, i32* %18, i64 %418
%420 = bitcast i32* %419 to <4 x i32>*
%421 = load <4 x i32>, <4 x i32>* %420
%422 = getelementptr inbounds i32, i32* %419, i64 4
%423 = bitcast i32* %422 to <4 x i32>*
%424 = load <4 x i32>, <4 x i32>* %423
%425 = add i64 %418, %199
%426 = getelementptr inbounds i32, i32* %258, i64 %425
%427 = bitcast i32* %426 to <4 x i32>*
store <4 x i32> %421, <4 x i32>* %427
%428 = getelementptr inbounds i32, i32* %426, i64 4
%429 = bitcast i32* %428 to <4 x i32>*
store <4 x i32> %424, <4 x i32>* %429
%430 = or i64 %393, 24
%431 = getelementptr inbounds i32, i32* %18, i64 %430
%432 = bitcast i32* %431 to <4 x i32>*
%433 = load <4 x i32>, <4 x i32>* %432
%434 = getelementptr inbounds i32, i32* %431, i64 4
%435 = bitcast i32* %434 to <4 x i32>*
%436 = load <4 x i32>, <4 x i32>* %435
%437 = add i64 %430, %199
%438 = getelementptr inbounds i32, i32* %258, i64 %437
%439 = bitcast i32* %438 to <4 x i32>*
store <4 x i32> %433, <4 x i32>* %439
%440 = getelementptr inbounds i32, i32* %438, i64 4
%441 = bitcast i32* %440 to <4 x i32>*
store <4 x i32> %436, <4 x i32>* %441
%442 = add nuw i64 %393, 32
%443 = add i64 %394, 4
%444 = icmp eq i64 %443, %391
br i1 %444, label %445, label %392
445: ; preds = %392, %383
%446 = phi i64 [ 0, %383 ], [ %442, %392 ]
%447 = icmp eq i64 %388, 0
br i1 %447, label %465, label %448
448: ; preds = %445, %448
%449 = phi i64 [ %462, %448 ], [ %446, %445 ]
%450 = phi i64 [ %463, %448 ], [ 0, %445 ]
%451 = getelementptr inbounds i32, i32* %18, i64 %449
%452 = bitcast i32* %451 to <4 x i32>*
%453 = load <4 x i32>, <4 x i32>* %452
%454 = getelementptr inbounds i32, i32* %451, i64 4
%455 = bitcast i32* %454 to <4 x i32>*
%456 = load <4 x i32>, <4 x i32>* %455
%457 = add i64 %449, %199
%458 = getelementptr inbounds i32, i32* %258, i64 %457
%459 = bitcast i32* %458 to <4 x i32>*
store <4 x i32> %453, <4 x i32>* %459
%460 = getelementptr inbounds i32, i32* %458, i64 4
%461 = bitcast i32* %460 to <4 x i32>*
store <4 x i32> %456, <4 x i32>* %461
%462 = add nuw i64 %449, 8
%463 = add i64 %450, 1
%464 = icmp eq i64 %463, %388
br i1 %464, label %465, label %448
465: ; preds = %448, %445
%466 = icmp eq i64 %36, %384
br i1 %466, label %517, label %467
467: ; preds = %376, %374, %465
%468 = phi i64 [ 0, %376 ], [ 0, %374 ], [ %384, %465 ]
%469 = xor i64 %468, -1
%470 = add i64 %36, %469
%471 = and i64 %36, 3
%472 = icmp eq i64 %471, 0
br i1 %472, label %483, label %473
473: ; preds = %467, %473
%474 = phi i64 [ %480, %473 ], [ %468, %467 ]
%475 = phi i64 [ %481, %473 ], [ 0, %467 ]
%476 = getelementptr inbounds i32, i32* %18, i64 %474
%477 = load i32, i32* %476
%478 = add i64 %474, %199
%479 = getelementptr inbounds i32, i32* %258, i64 %478
store i32 %477, i32* %479
%480 = add nuw i64 %474, 1
%481 = add i64 %475, 1
%482 = icmp eq i64 %481, %471
br i1 %482, label %483, label %473
483: ; preds = %473, %467
%484 = phi i64 [ %468, %467 ], [ %480, %473 ]
%485 = icmp ult i64 %470, 3
br i1 %485, label %517, label %494
486: ; preds = %371, %486
%487 = phi i64 [ %488, %486 ], [ %372, %371 ]
%488 = add i64 %487, -1
%489 = sub i64 %488, %36
%490 = getelementptr inbounds i32, i32* %258, i64 %489
%491 = load i32, i32* %490
%492 = getelementptr inbounds i32, i32* %258, i64 %488
store i32 %491, i32* %492
%493 = icmp ugt i64 %488, %259
br i1 %493, label %486, label %373
494: ; preds = %483, %494
%495 = phi i64 [ %515, %494 ], [ %484, %483 ]
%496 = getelementptr inbounds i32, i32* %18, i64 %495
%497 = load i32, i32* %496
%498 = add i64 %495, %199
%499 = getelementptr inbounds i32, i32* %258, i64 %498
store i32 %497, i32* %499
%500 = add nuw i64 %495, 1
%501 = getelementptr inbounds i32, i32* %18, i64 %500
%502 = load i32, i32* %501
%503 = add i64 %500, %199
%504 = getelementptr inbounds i32, i32* %258, i64 %503
store i32 %502, i32* %504
%505 = add nuw i64 %495, 2
%506 = getelementptr inbounds i32, i32* %18, i64 %505
%507 = load i32, i32* %506
%508 = add i64 %505, %199
%509 = getelementptr inbounds i32, i32* %258, i64 %508
store i32 %507, i32* %509
%510 = add nuw i64 %495, 3
%511 = getelementptr inbounds i32, i32* %18, i64 %510
%512 = load i32, i32* %511
%513 = add i64 %510, %199
%514 = getelementptr inbounds i32, i32* %258, i64 %513
store i32 %512, i32* %514
%515 = add nuw i64 %495, 4
%516 = icmp eq i64 %515, %36
br i1 %516, label %517, label %494
517: ; preds = %483, %494, %465, %373
%518 = getelementptr inbounds i64, i64* %257, i64 -1
%519 = load i64, i64* %518
%520 = add i64 %519, %36
store i64 %520, i64* %518
%521 = icmp eq i32* %18, %14
br i1 %521, label %524, label %522
522: ; preds = %517
%523 = call i32 @free(i32* %18)
br label %524
524: ; preds = %522, %517
ret void
}