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

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
unsigned int char_to_int(unsigned char *);
scalar_t__ memcmp(unsigned char *, ...);
int /*<<< orphan*/ memcpy(char *, char *, int);
int is_complete_message(unsigned char *buff, unsigned int len, int *ok_len) {
  unsigned int i;
  char btkeyword[20];
  unsigned char keep_alive[4] = {0x0, 0x0, 0x0, 0x0};
  unsigned char chocke[5] = {0x0, 0x0, 0x0, 0x1, 0x0};
  unsigned char unchocke[5] = {0x0, 0x0, 0x0, 0x1, 0x1};
  unsigned char interested[5] = {0x0, 0x0, 0x0, 0x1, 0x2};
  unsigned char uninterested[5] = {0x0, 0x0, 0x0, 0x1, 0x3};
  unsigned char have[5] = {0x0, 0x0, 0x0, 0x5, 0x4};
  unsigned char request[5] = {0x0, 0x0, 0x0, 0xd, 0x6};
  unsigned char cancel[5] = {0x0, 0x0, 0x0, 0xd, 0x8};
  unsigned char port[5] = {0x0, 0x0, 0x0, 0x3, 0x9};
  if (buff == NULL || len <= 0 || ok_len == NULL)
    return -1;
  *ok_len = 0;
  btkeyword[0] = 19;
  memcpy(&btkeyword[1], "BitTorrent protocol", 19);
  unsigned char c[4];
  unsigned int length;
  for (i = 0; i < len;) {
    if (i + 68 <= len && memcmp(&buff[i], btkeyword, 20) == 0)
      i += 68;
    else if (i + 4 <= len && memcmp(&buff[i], keep_alive, 4) == 0)
      i += 4;
    else if (i + 5 <= len && memcmp(&buff[i], chocke, 5) == 0)
      i += 5;
    else if (i + 5 <= len && memcmp(&buff[i], unchocke, 5) == 0)
      i += 5;
    else if (i + 5 <= len && memcmp(&buff[i], interested, 5) == 0)
      i += 5;
    else if (i + 5 <= len && memcmp(&buff[i], uninterested, 5) == 0)
      i += 5;
    else if (i + 9 <= len && memcmp(&buff[i], have, 5) == 0)
      i += 9;
    else if (i + 17 <= len && memcmp(&buff[i], request, 5) == 0)
      i += 17;
    else if (i + 17 <= len && memcmp(&buff[i], cancel, 5) == 0)
      i += 17;
    else if (i + 7 <= len && memcmp(&buff[i], port, 5) == 0)
      i += 7;
    else if (i + 5 <= len && buff[i + 4] == 5) {
      c[0] = buff[i];
      c[1] = buff[i + 1];
      c[2] = buff[i + 2];
      c[3] = buff[i + 3];
      length = char_to_int(c);
      if (i + 4 + length <= len)
        i += 4 + length;
      else {
        *ok_len = i;
        return -1;
      }
    } else if (i + 5 <= len && buff[i + 4] == 7) {
      c[0] = buff[i];
      c[1] = buff[i + 1];
      c[2] = buff[i + 2];
      c[3] = buff[i + 3];
      length = char_to_int(c);
      if (i + 4 + length <= len)
        i += 4 + length;
      else {
        *ok_len = i;
        return -1;
      }
    } else {
      if (i + 4 <= len) {
        c[0] = buff[i];
        c[1] = buff[i + 1];
        c[2] = buff[i + 2];
        c[3] = buff[i + 3];
        length = char_to_int(c);
        if (i + 4 + length <= len) {
          i += 4 + length;
          continue;
        } else {
          *ok_len = i;
          return -1;
        }
      }
      *ok_len = i;
      return -1;
    }
  }
  *ok_len = i;
  return 1;
}


x86 assembly (clang, -O0):
<is_complete_message>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
lea    -0x44(%rbp),%rdi
xor    %esi,%esi
mov    $0x4,%edx
call   1030 <memset@plt>
mov    0xe94(%rip),%eax
mov    %eax,-0x49(%rbp)
mov    0xe8f(%rip),%al
mov    %al,-0x45(%rbp)
mov    0xe87(%rip),%eax
mov    %eax,-0x4e(%rbp)
mov    0xe82(%rip),%al
mov    %al,-0x4a(%rbp)
mov    0xe7a(%rip),%eax
mov    %eax,-0x53(%rbp)
mov    0xe75(%rip),%al
mov    %al,-0x4f(%rbp)
mov    0xe6d(%rip),%eax
mov    %eax,-0x58(%rbp)
mov    0xe68(%rip),%al
mov    %al,-0x54(%rbp)
mov    0xe60(%rip),%eax
mov    %eax,-0x5d(%rbp)
mov    0xe5b(%rip),%al
mov    %al,-0x59(%rbp)
mov    0xe53(%rip),%eax
mov    %eax,-0x62(%rbp)
mov    0xe4e(%rip),%al
mov    %al,-0x5e(%rbp)
mov    0xe46(%rip),%eax
mov    %eax,-0x67(%rbp)
mov    0xe41(%rip),%al
mov    %al,-0x63(%rbp)
mov    0xe39(%rip),%eax
mov    %eax,-0x6c(%rbp)
mov    0xe34(%rip),%al
mov    %al,-0x68(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     1216 <is_complete_message+0xd6>
cmpl   $0x0,-0x14(%rbp)
jbe    1216 <is_complete_message+0xd6>
cmpq   $0x0,-0x20(%rbp)
jne    1222 <is_complete_message+0xe2>
movl   $0xffffffff,-0x4(%rbp)
jmp    1745 <is_complete_message+0x605>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movb   $0x13,-0x40(%rbp)
lea    -0x40(%rbp),%rdi
add    $0x1,%rdi
lea    0xde9(%rip),%rsi
mov    $0x13,%edx
call   1060 <memcpy@plt>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jae    1735 <is_complete_message+0x5f5>
mov    -0x24(%rbp),%eax
add    $0x44,%eax
cmp    -0x14(%rbp),%eax
ja     129d <is_complete_message+0x15d>
mov    -0x10(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x40(%rbp),%rsi
xor    %eax,%eax
mov    $0x14,%edx
call   1040 <memcmp@plt>
cmp    $0x0,%rax
jne    129d <is_complete_message+0x15d>
mov    -0x24(%rbp),%eax
add    $0x44,%eax
mov    %eax,-0x24(%rbp)
jmp    1730 <is_complete_message+0x5f0>
mov    -0x24(%rbp),%eax
add    $0x4,%eax
cmp    -0x14(%rbp),%eax
ja     12de <is_complete_message+0x19e>
mov    -0x10(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x44(%rbp),%rsi
xor    %eax,%eax
mov    $0x4,%edx
call   1040 <memcmp@plt>
cmp    $0x0,%rax
jne    12de <is_complete_message+0x19e>
mov    -0x24(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x24(%rbp)
jmp    172b <is_complete_message+0x5eb>
mov    -0x24(%rbp),%eax
add    $0x5,%eax
cmp    -0x14(%rbp),%eax
ja     131f <is_complete_message+0x1df>
mov    -0x10(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x49(%rbp),%rsi
xor    %eax,%eax
mov    $0x5,%edx
call   1040 <memcmp@plt>
cmp    $0x0,%rax
jne    131f <is_complete_message+0x1df>
mov    -0x24(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x24(%rbp)
jmp    1726 <is_complete_message+0x5e6>
mov    -0x24(%rbp),%eax
add    $0x5,%eax
cmp    -0x14(%rbp),%eax
ja     1360 <is_complete_message+0x220>
mov    -0x10(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x4e(%rbp),%rsi
xor    %eax,%eax
mov    $0x5,%edx
call   1040 <memcmp@plt>
cmp    $0x0,%rax
jne    1360 <is_complete_message+0x220>
mov    -0x24(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x24(%rbp)
jmp    1721 <is_complete_message+0x5e1>
mov    -0x24(%rbp),%eax
add    $0x5,%eax
cmp    -0x14(%rbp),%eax
ja     13a1 <is_complete_message+0x261>
mov    -0x10(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x53(%rbp),%rsi
xor    %eax,%eax
mov    $0x5,%edx
call   1040 <memcmp@plt>
cmp    $0x0,%rax
jne    13a1 <is_complete_message+0x261>
mov    -0x24(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x24(%rbp)
jmp    171c <is_complete_message+0x5dc>
mov    -0x24(%rbp),%eax
add    $0x5,%eax
cmp    -0x14(%rbp),%eax
ja     13e2 <is_complete_message+0x2a2>
mov    -0x10(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x58(%rbp),%rsi
xor    %eax,%eax
mov    $0x5,%edx
call   1040 <memcmp@plt>
cmp    $0x0,%rax
jne    13e2 <is_complete_message+0x2a2>
mov    -0x24(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x24(%rbp)
jmp    1717 <is_complete_message+0x5d7>
mov    -0x24(%rbp),%eax
add    $0x9,%eax
cmp    -0x14(%rbp),%eax
ja     1423 <is_complete_message+0x2e3>
mov    -0x10(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x5d(%rbp),%rsi
xor    %eax,%eax
mov    $0x5,%edx
call   1040 <memcmp@plt>
cmp    $0x0,%rax
jne    1423 <is_complete_message+0x2e3>
mov    -0x24(%rbp),%eax
add    $0x9,%eax
mov    %eax,-0x24(%rbp)
jmp    1712 <is_complete_message+0x5d2>
mov    -0x24(%rbp),%eax
add    $0x11,%eax
cmp    -0x14(%rbp),%eax
ja     1464 <is_complete_message+0x324>
mov    -0x10(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x62(%rbp),%rsi
xor    %eax,%eax
mov    $0x5,%edx
call   1040 <memcmp@plt>
cmp    $0x0,%rax
jne    1464 <is_complete_message+0x324>
mov    -0x24(%rbp),%eax
add    $0x11,%eax
mov    %eax,-0x24(%rbp)
jmp    170d <is_complete_message+0x5cd>
mov    -0x24(%rbp),%eax
add    $0x11,%eax
cmp    -0x14(%rbp),%eax
ja     14a5 <is_complete_message+0x365>
mov    -0x10(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x67(%rbp),%rsi
xor    %eax,%eax
mov    $0x5,%edx
call   1040 <memcmp@plt>
cmp    $0x0,%rax
jne    14a5 <is_complete_message+0x365>
mov    -0x24(%rbp),%eax
add    $0x11,%eax
mov    %eax,-0x24(%rbp)
jmp    1708 <is_complete_message+0x5c8>
mov    -0x24(%rbp),%eax
add    $0x7,%eax
cmp    -0x14(%rbp),%eax
ja     14e6 <is_complete_message+0x3a6>
mov    -0x10(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x6c(%rbp),%rsi
xor    %eax,%eax
mov    $0x5,%edx
call   1040 <memcmp@plt>
cmp    $0x0,%rax
jne    14e6 <is_complete_message+0x3a6>
mov    -0x24(%rbp),%eax
add    $0x7,%eax
mov    %eax,-0x24(%rbp)
jmp    1703 <is_complete_message+0x5c3>
mov    -0x24(%rbp),%eax
add    $0x5,%eax
cmp    -0x14(%rbp),%eax
ja     159a <is_complete_message+0x45a>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x4,%ecx
mov    %ecx,%ecx
movzbl (%rax,%rcx,1),%eax
cmp    $0x5,%eax
jne    159a <is_complete_message+0x45a>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x70(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x6f(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x2,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x6e(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x3,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x6d(%rbp)
lea    -0x70(%rbp),%rdi
call   1050 <char_to_int@plt>
mov    %eax,-0x74(%rbp)
mov    -0x24(%rbp),%eax
add    $0x4,%eax
add    -0x74(%rbp),%eax
cmp    -0x14(%rbp),%eax
ja     1580 <is_complete_message+0x440>
mov    -0x74(%rbp),%eax
add    $0x4,%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    1595 <is_complete_message+0x455>
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0xffffffff,-0x4(%rbp)
jmp    1745 <is_complete_message+0x605>
jmp    16fe <is_complete_message+0x5be>
mov    -0x24(%rbp),%eax
add    $0x5,%eax
cmp    -0x14(%rbp),%eax
ja     164e <is_complete_message+0x50e>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x4,%ecx
mov    %ecx,%ecx
movzbl (%rax,%rcx,1),%eax
cmp    $0x7,%eax
jne    164e <is_complete_message+0x50e>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x70(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x6f(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x2,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x6e(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x3,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x6d(%rbp)
lea    -0x70(%rbp),%rdi
call   1050 <char_to_int@plt>
mov    %eax,-0x74(%rbp)
mov    -0x24(%rbp),%eax
add    $0x4,%eax
add    -0x74(%rbp),%eax
cmp    -0x14(%rbp),%eax
ja     1634 <is_complete_message+0x4f4>
mov    -0x74(%rbp),%eax
add    $0x4,%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    1649 <is_complete_message+0x509>
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0xffffffff,-0x4(%rbp)
jmp    1745 <is_complete_message+0x605>
jmp    16f9 <is_complete_message+0x5b9>
mov    -0x24(%rbp),%eax
add    $0x4,%eax
cmp    -0x14(%rbp),%eax
ja     16e4 <is_complete_message+0x5a4>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x70(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x6f(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x2,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x6e(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x3,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x6d(%rbp)
lea    -0x70(%rbp),%rdi
call   1050 <char_to_int@plt>
mov    %eax,-0x74(%rbp)
mov    -0x24(%rbp),%eax
add    $0x4,%eax
add    -0x74(%rbp),%eax
cmp    -0x14(%rbp),%eax
ja     16cf <is_complete_message+0x58f>
mov    -0x74(%rbp),%eax
add    $0x4,%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    1250 <is_complete_message+0x110>
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0xffffffff,-0x4(%rbp)
jmp    1745 <is_complete_message+0x605>
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0xffffffff,-0x4(%rbp)
jmp    1745 <is_complete_message+0x605>
jmp    16fe <is_complete_message+0x5be>
jmp    1703 <is_complete_message+0x5c3>
jmp    1708 <is_complete_message+0x5c8>
jmp    170d <is_complete_message+0x5cd>
jmp    1712 <is_complete_message+0x5d2>
jmp    1717 <is_complete_message+0x5d7>
jmp    171c <is_complete_message+0x5dc>
jmp    1721 <is_complete_message+0x5e1>
jmp    1726 <is_complete_message+0x5e6>
jmp    172b <is_complete_message+0x5eb>
jmp    1730 <is_complete_message+0x5f0>
jmp    1250 <is_complete_message+0x110>
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<is_complete_message>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x78,%rsp
movl   $0x0,0x54(%rsp)
movb   $0x0,0x50(%rsp)
movl   $0x1000000,0x4c(%rsp)
01
movb   $0x1,0x48(%rsp)
movl   $0x1000000,0x44(%rsp)
01
movb   $0x2,0x40(%rsp)
movl   $0x1000000,0x3c(%rsp)
01
movb   $0x3,0x38(%rsp)
movl   $0x1000000,0x34(%rsp)
01
movb   $0x4,0x30(%rsp)
movl   $0x5000000,0x2c(%rsp)
05
movb   $0x6,0x28(%rsp)
movl   $0xd000000,0x24(%rsp)
0d
movb   $0x8,0x20(%rsp)
movl   $0xd000000,0x1c(%rsp)
0d
movb   $0x9,0x18(%rsp)
movl   $0x3000000,0x14(%rsp)
03
mov    $0xffffffff,%ebx
mov    %rdi,0x8(%rsp)
test   %rdi,%rdi
je     146f <is_complete_message+0x33f>
mov    %esi,%ebp
test   %esi,%esi
je     146f <is_complete_message+0x33f>
test   %rdx,%rdx
je     146f <is_complete_message+0x33f>
mov    %rdx,0x58(%rsp)
movl   $0x0,(%rdx)
movb   $0x13,0x60(%rsp)
lea    0x61(%rsp),%rdi
lea    0xe38(%rip),%rsi
mov    $0x13,%edx
call   1050 <memcpy@plt>
xor    %r14d,%r14d
jmp    120c <is_complete_message+0xdc>
nop
mov    %r12d,%r14d
cmp    %ebp,%r14d
jae    145f <is_complete_message+0x32f>
mov    %r14d,%r15d
lea    0x44(%r15),%r14d
cmp    %ebp,%r14d
ja     1236 <is_complete_message+0x106>
mov    %r15d,%edi
add    0x8(%rsp),%rdi
lea    0x60(%rsp),%rsi
mov    $0x14,%edx
xor    %eax,%eax
call   1030 <memcmp@plt>
test   %rax,%rax
je     1203 <is_complete_message+0xd3>
lea    0x4(%r15),%r13d
cmp    %ebp,%r13d
ja     1261 <is_complete_message+0x131>
mov    %r15d,%edi
add    0x8(%rsp),%rdi
lea    0x54(%rsp),%rsi
mov    $0x4,%edx
xor    %eax,%eax
call   1030 <memcmp@plt>
test   %rax,%rax
je     1401 <is_complete_message+0x2d1>
lea    0x5(%r15),%r12d
cmp    %ebp,%r12d
jbe    1380 <is_complete_message+0x250>
lea    0x9(%r15),%r14d
cmp    %ebp,%r14d
ja     1299 <is_complete_message+0x169>
mov    %r15d,%edi
add    0x8(%rsp),%rdi
lea    0x2c(%rsp),%rsi
mov    $0x5,%edx
xor    %eax,%eax
call   1030 <memcmp@plt>
test   %rax,%rax
je     1203 <is_complete_message+0xd3>
lea    0x11(%r15),%r14d
cmp    %ebp,%r14d
ja     12e4 <is_complete_message+0x1b4>
mov    %r15d,%ebx
add    0x8(%rsp),%rbx
mov    %rbx,%rdi
lea    0x24(%rsp),%rsi
mov    $0x5,%edx
xor    %eax,%eax
call   1030 <memcmp@plt>
test   %rax,%rax
je     1203 <is_complete_message+0xd3>
mov    %rbx,%rdi
lea    0x1c(%rsp),%rsi
mov    $0x5,%edx
xor    %eax,%eax
call   1030 <memcmp@plt>
test   %rax,%rax
je     1203 <is_complete_message+0xd3>
lea    0x7(%r15),%r14d
cmp    %ebp,%r14d
ja     130f <is_complete_message+0x1df>
mov    %r15d,%edi
add    0x8(%rsp),%rdi
lea    0x14(%rsp),%rsi
mov    $0x5,%edx
xor    %eax,%eax
call   1030 <memcmp@plt>
test   %rax,%rax
je     1203 <is_complete_message+0xd3>
cmp    %ebp,%r12d
ja     1409 <is_complete_message+0x2d9>
mov    %r13d,%eax
mov    0x8(%rsp),%rcx
movzbl (%rcx,%rax,1),%eax
cmp    $0x7,%al
je     1330 <is_complete_message+0x200>
cmp    $0x5,%al
jne    1409 <is_complete_message+0x2d9>
mov    %r15d,%eax
mov    0x8(%rsp),%rdx
movzbl (%rdx,%rax,1),%ecx
mov    %cl,0x4(%rsp)
movzbl 0x1(%rdx,%rax,1),%eax
mov    %al,0x5(%rsp)
lea    0x2(%r15),%eax
movzbl (%rdx,%rax,1),%eax
mov    %al,0x6(%rsp)
lea    0x3(%r15),%eax
movzbl (%rdx,%rax,1),%eax
mov    %al,0x7(%rsp)
lea    0x4(%rsp),%rdi
call   1040 <char_to_int@plt>
mov    %eax,%r14d
add    %r13d,%r14d
cmp    %ebp,%r14d
jbe    1203 <is_complete_message+0xd3>
jmp    1480 <is_complete_message+0x350>
nop
mov    %r15d,%ebx
add    0x8(%rsp),%rbx
mov    %rbx,%rdi
lea    0x4c(%rsp),%rsi
mov    $0x5,%edx
xor    %eax,%eax
call   1030 <memcmp@plt>
test   %rax,%rax
je     1200 <is_complete_message+0xd0>
mov    %rbx,%rdi
lea    0x44(%rsp),%rsi
mov    $0x5,%edx
xor    %eax,%eax
call   1030 <memcmp@plt>
test   %rax,%rax
je     1200 <is_complete_message+0xd0>
mov    %rbx,%rdi
lea    0x3c(%rsp),%rsi
mov    $0x5,%edx
xor    %eax,%eax
call   1030 <memcmp@plt>
test   %rax,%rax
je     1200 <is_complete_message+0xd0>
mov    %rbx,%rdi
lea    0x34(%rsp),%rsi
mov    $0x5,%edx
xor    %eax,%eax
call   1030 <memcmp@plt>
test   %rax,%rax
jne    126e <is_complete_message+0x13e>
jmp    1200 <is_complete_message+0xd0>
mov    %r13d,%r14d
jmp    1203 <is_complete_message+0xd3>
mov    $0xffffffff,%ebx
cmp    %ebp,%r13d
ja     1467 <is_complete_message+0x337>
mov    %r15d,%eax
mov    0x8(%rsp),%rdx
movzbl (%rdx,%rax,1),%ecx
mov    %cl,0x4(%rsp)
movzbl 0x1(%rdx,%rax,1),%eax
mov    %al,0x5(%rsp)
lea    0x2(%r15),%eax
movzbl (%rdx,%rax,1),%eax
mov    %al,0x6(%rsp)
lea    0x3(%r15),%eax
movzbl (%rdx,%rax,1),%eax
mov    %al,0x7(%rsp)
lea    0x4(%rsp),%rdi
call   1040 <char_to_int@plt>
mov    %eax,%r14d
add    %r13d,%r14d
cmp    %ebp,%r14d
jbe    1203 <is_complete_message+0xd3>
jmp    1467 <is_complete_message+0x337>
mov    $0x1,%ebx
mov    %r14d,%r15d
mov    0x58(%rsp),%rax
mov    %r15d,(%rax)
mov    %ebx,%eax
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    $0xffffffff,%ebx
jmp    1467 <is_complete_message+0x337>

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

LLVM IR (-O2):
@__const.is_complete_message.chocke = [5 x i8] c"\00\00\00\01\00"
@__const.is_complete_message.unchocke = [5 x i8] c"\00\00\00\01\01"
@__const.is_complete_message.interested = [5 x i8] c"\00\00\00\01\02"
@__const.is_complete_message.uninterested = [5 x i8] c"\00\00\00\01\03"
@__const.is_complete_message.have = [5 x i8] c"\00\00\00\05\04"
@__const.is_complete_message.request = [5 x i8] c"\00\00\00\0D\06"
@__const.is_complete_message.cancel = [5 x i8] c"\00\00\00\0D\08"
@__const.is_complete_message.port = [5 x i8] c"\00\00\00\03\09"
@.str = [20 x i8] c"BitTorrent protocol\00"
define i32 @is_complete_message(i8* %0, i32 %1, i32* writeonly %2) {
%4 = alloca [20 x i8]
%5 = alloca i32
%6 = alloca [5 x i8]
%7 = alloca [5 x i8]
%8 = alloca [5 x i8]
%9 = alloca [5 x i8]
%10 = alloca [5 x i8]
%11 = alloca [5 x i8]
%12 = alloca [5 x i8]
%13 = alloca [5 x i8]
%14 = alloca [4 x i8]
%15 = getelementptr inbounds [20 x i8], [20 x i8]* %4, i64 0, i64 0
%16 = bitcast i32* %5 to i8*
store i32 0, i32* %5
%17 = getelementptr inbounds [5 x i8], [5 x i8]* %6, i64 0, i64 0
%18 = getelementptr inbounds [5 x i8], [5 x i8]* %7, i64 0, i64 0
%19 = getelementptr inbounds [5 x i8], [5 x i8]* %8, i64 0, i64 0
%20 = getelementptr inbounds [5 x i8], [5 x i8]* %9, i64 0, i64 0
%21 = getelementptr inbounds [5 x i8], [5 x i8]* %10, i64 0, i64 0
%22 = getelementptr inbounds [5 x i8], [5 x i8]* %11, i64 0, i64 0
%23 = getelementptr inbounds [5 x i8], [5 x i8]* %12, i64 0, i64 0
%24 = getelementptr inbounds [5 x i8], [5 x i8]* %13, i64 0, i64 0
%25 = icmp eq i8* %0, null
%26 = icmp eq i32 %1, 0
%27 = or i1 %25, %26
%28 = icmp eq i32* %2, null
%29 = or i1 %27, %28
br i1 %29, label %167, label %30
30: ; preds = %3
store i32 0, i32* %2
store i8 19, i8* %15
%31 = getelementptr inbounds [20 x i8], [20 x i8]* %4, i64 0, i64 1
%32 = call i32 @memcpy(i8* %31, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i64 0, i64 0), i32 19)
%33 = getelementptr inbounds [4 x i8], [4 x i8]* %14, i64 0, i64 0
%34 = getelementptr inbounds [4 x i8], [4 x i8]* %14, i64 0, i64 1
%35 = getelementptr inbounds [4 x i8], [4 x i8]* %14, i64 0, i64 2
%36 = getelementptr inbounds [4 x i8], [4 x i8]* %14, i64 0, i64 3
br label %37
37: ; preds = %30, %161
%38 = phi i32 [ 0, %30 ], [ %162, %161 ]
%39 = add i32 %38, 68
%40 = icmp ugt i32 %39, %1
br i1 %40, label %46, label %41
41: ; preds = %37
%42 = zext i32 %38 to i64
%43 = getelementptr inbounds i8, i8* %0, i64 %42
%44 = call i64 (i8*, ...) @memcmp(i8* %43, i8* %15, i32 20)
%45 = icmp eq i64 %44, 0
br i1 %45, label %161, label %46
46: ; preds = %41, %37
%47 = add i32 %38, 4
%48 = icmp ugt i32 %47, %1
br i1 %48, label %54, label %49
49: ; preds = %46
%50 = zext i32 %38 to i64
%51 = getelementptr inbounds i8, i8* %0, i64 %50
%52 = call i64 (i8*, ...) @memcmp(i8* %51, i32* %5, i32 4)
%53 = icmp eq i64 %52, 0
br i1 %53, label %161, label %54
54: ; preds = %49, %46
%55 = add i32 %38, 5
%56 = icmp ugt i32 %55, %1
br i1 %56, label %71, label %57
57: ; preds = %54
%58 = zext i32 %38 to i64
%59 = getelementptr inbounds i8, i8* %0, i64 %58
%60 = call i64 (i8*, ...) @memcmp(i8* %59, i8* %17, i32 5)
%61 = icmp eq i64 %60, 0
br i1 %61, label %161, label %62
62: ; preds = %57
%63 = call i64 (i8*, ...) @memcmp(i8* %59, i8* %18, i32 5)
%64 = icmp eq i64 %63, 0
br i1 %64, label %161, label %65
65: ; preds = %62
%66 = call i64 (i8*, ...) @memcmp(i8* %59, i8* %19, i32 5)
%67 = icmp eq i64 %66, 0
br i1 %67, label %161, label %68
68: ; preds = %65
%69 = call i64 (i8*, ...) @memcmp(i8* %59, i8* %20, i32 5)
%70 = icmp eq i64 %69, 0
br i1 %70, label %161, label %71
71: ; preds = %54, %68
%72 = add i32 %38, 9
%73 = icmp ugt i32 %72, %1
br i1 %73, label %79, label %74
74: ; preds = %71
%75 = zext i32 %38 to i64
%76 = getelementptr inbounds i8, i8* %0, i64 %75
%77 = call i64 (i8*, ...) @memcmp(i8* %76, i8* %21, i32 5)
%78 = icmp eq i64 %77, 0
br i1 %78, label %161, label %79
79: ; preds = %74, %71
%80 = add i32 %38, 17
%81 = icmp ugt i32 %80, %1
br i1 %81, label %90, label %82
82: ; preds = %79
%83 = zext i32 %38 to i64
%84 = getelementptr inbounds i8, i8* %0, i64 %83
%85 = call i64 (i8*, ...) @memcmp(i8* %84, i8* %22, i32 5)
%86 = icmp eq i64 %85, 0
br i1 %86, label %161, label %87
87: ; preds = %82
%88 = call i64 (i8*, ...) @memcmp(i8* %84, i8* %23, i32 5)
%89 = icmp eq i64 %88, 0
br i1 %89, label %161, label %90
90: ; preds = %79, %87
%91 = add i32 %38, 7
%92 = icmp ugt i32 %91, %1
br i1 %92, label %98, label %93
93: ; preds = %90
%94 = zext i32 %38 to i64
%95 = getelementptr inbounds i8, i8* %0, i64 %94
%96 = call i64 (i8*, ...) @memcmp(i8* %95, i8* %24, i32 5)
%97 = icmp eq i64 %96, 0
br i1 %97, label %161, label %98
98: ; preds = %93, %90
br i1 %56, label %141, label %99
99: ; preds = %98
%100 = zext i32 %47 to i64
%101 = getelementptr inbounds i8, i8* %0, i64 %100
%102 = load i8, i8* %101
switch i8 %102, label %141 [
i8 5, label %103
i8 7, label %122
]
103: ; preds = %99
%104 = zext i32 %38 to i64
%105 = getelementptr inbounds i8, i8* %0, i64 %104
%106 = load i8, i8* %105
store i8 %106, i8* %33
%107 = add nuw i32 %38, 1
%108 = zext i32 %107 to i64
%109 = getelementptr inbounds i8, i8* %0, i64 %108
%110 = load i8, i8* %109
store i8 %110, i8* %34
%111 = add i32 %38, 2
%112 = zext i32 %111 to i64
%113 = getelementptr inbounds i8, i8* %0, i64 %112
%114 = load i8, i8* %113
store i8 %114, i8* %35
%115 = add i32 %38, 3
%116 = zext i32 %115 to i64
%117 = getelementptr inbounds i8, i8* %0, i64 %116
%118 = load i8, i8* %117
store i8 %118, i8* %36
%119 = call i32 @char_to_int(i8* %33)
%120 = add i32 %119, %47
%121 = icmp ugt i32 %120, %1
br i1 %121, label %164, label %161
122: ; preds = %99
%123 = zext i32 %38 to i64
%124 = getelementptr inbounds i8, i8* %0, i64 %123
%125 = load i8, i8* %124
store i8 %125, i8* %33
%126 = add nuw i32 %38, 1
%127 = zext i32 %126 to i64
%128 = getelementptr inbounds i8, i8* %0, i64 %127
%129 = load i8, i8* %128
store i8 %129, i8* %34
%130 = add i32 %38, 2
%131 = zext i32 %130 to i64
%132 = getelementptr inbounds i8, i8* %0, i64 %131
%133 = load i8, i8* %132
store i8 %133, i8* %35
%134 = add i32 %38, 3
%135 = zext i32 %134 to i64
%136 = getelementptr inbounds i8, i8* %0, i64 %135
%137 = load i8, i8* %136
store i8 %137, i8* %36
%138 = call i32 @char_to_int(i8* %33)
%139 = add i32 %138, %47
%140 = icmp ugt i32 %139, %1
br i1 %140, label %164, label %161
141: ; preds = %99, %98
br i1 %48, label %164, label %142
142: ; preds = %141
%143 = zext i32 %38 to i64
%144 = getelementptr inbounds i8, i8* %0, i64 %143
%145 = load i8, i8* %144
store i8 %145, i8* %33
%146 = add nuw i32 %38, 1
%147 = zext i32 %146 to i64
%148 = getelementptr inbounds i8, i8* %0, i64 %147
%149 = load i8, i8* %148
store i8 %149, i8* %34
%150 = add i32 %38, 2
%151 = zext i32 %150 to i64
%152 = getelementptr inbounds i8, i8* %0, i64 %151
%153 = load i8, i8* %152
store i8 %153, i8* %35
%154 = add i32 %38, 3
%155 = zext i32 %154 to i64
%156 = getelementptr inbounds i8, i8* %0, i64 %155
%157 = load i8, i8* %156
store i8 %157, i8* %36
%158 = call i32 @char_to_int(i8* %33)
%159 = add i32 %158, %47
%160 = icmp ugt i32 %159, %1
br i1 %160, label %164, label %161
161: ; preds = %142, %122, %103, %41, %49, %57, %62, %65, %68, %74, %82, %87, %93
%162 = phi i32 [ %39, %41 ], [ %47, %49 ], [ %55, %57 ], [ %55, %62 ], [ %55, %65 ], [ %55, %68 ], [ %72, %74 ], [ %80, %82 ], [ %80, %87 ], [ %91, %93 ], [ %120, %103 ], [ %139, %122 ], [ %159, %142 ]
%163 = icmp ult i32 %162, %1
br i1 %163, label %37, label %164
164: ; preds = %161, %141, %142, %122, %103
%165 = phi i32 [ %38, %103 ], [ %38, %122 ], [ %38, %142 ], [ %38, %141 ], [ %162, %161 ]
%166 = phi i32 [ -1, %103 ], [ -1, %122 ], [ -1, %142 ], [ -1, %141 ], [ 1, %161 ]
store i32 %165, i32* %2
br label %167
167: ; preds = %3, %164
%168 = phi i32 [ %166, %164 ], [ -1, %3 ]
ret i32 %168
}