#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 */
int hex2number(char const *, int);
int pdu_get_number(char const *, int);
int pdu_get_timestamp(char const *);
int /*<<< orphan*/ printf(char *, ...);
int pdu_decode(const char *buffer) {
  int type;
  int mr;
  int pos = 0, ret;
  int submit = 0, deliver = 0, report = 0;
  int vpf = 0;
  int rp = 0;
  int udh = 0;
  int pid = 0;
  int dcs = 0;
  int vp = 0;
  int udhl = 0;
  int ud;
  int i;
  ret = pdu_get_number(buffer + pos, 0);
  if (ret < 0)
    return ret;
  pos += ret;
  type = hex2number(buffer + pos, 2);
  if (type < 0)
    return type;
  pos += 2;
  printf("Message type: %02x - ", type);
  switch (type & 0x3) {
  case 0:
    printf("Deliver");
    deliver = 1;
    break;
  case 1:
    printf("Submit");
    submit = 1;
    break;
  case 2:
    printf("Status report\n");
    report = 1;
    break;
  case 3:
    printf("Reserved\n");
    return -1;
  }
  if (submit || deliver) {
    if (type & (1 << 7)) {
      rp = 1;
    }
    if (type & (1 << 6)) {
      udh = 1;
    }
  }
  if (rp) {
    printf(", Reply path set");
  }
  if (udh) {
    printf(", UDH included");
  }
  if (submit) {
    switch (type & (0x3 << 3)) {
    case 0:
      printf(", No VP");
      break;
    case 1:
      printf(", Reserved VP!\n");
      return -1;
    case 2:
      printf(", Relative VP");
      vpf = 2;
      break;
    case 3:
      printf(", Absolute VP");
      vpf = 3;
      break;
    }
  }
  printf("\n");
  if (submit || report) {
    mr = hex2number(buffer + pos, 2);
    if (mr < 0)
      return mr;
    pos += 2;
    printf("MR = 0x%02X\n", mr);
  }
  ret = pdu_get_number(buffer + pos, 1);
  if (ret < 0)
    return ret;
  pos += ret;
  if (report) {
    ret = pdu_get_timestamp(buffer + pos);
    if (ret < 0)
      return ret;
    pos += ret;
    ret = pdu_get_timestamp(buffer + pos);
    if (ret < 0)
      return ret;
    pos += ret;
  }
  if (submit || deliver) {
    pid = hex2number(buffer + pos, 2);
    if (pid < 0)
      return pid;
    pos += 2;
    printf("PID = 0x%02X\n", pid);
    dcs = hex2number(buffer + pos, 2);
    if (dcs < 0)
      return dcs;
    pos += 2;
    printf("DCS = 0x%02X\n", dcs);
  }
  if (submit) {
    if (vpf == 2 || vpf == 0) {
      vp = hex2number(buffer + pos, 2);
      if (vp < 0)
        return vp;
      pos += 2;
      printf("VP = 0x%02X\n", vp);
    } else if (vpf == 3) {
      ret = pdu_get_timestamp(buffer + pos);
      if (ret < 0)
        return ret;
      pos += ret;
    }
  }
  if (deliver) {
    ret = pdu_get_timestamp(buffer + pos);
    if (ret < 0)
      return ret;
    pos += ret;
  }
  if (submit || deliver) {
    udhl = hex2number(buffer + pos, 2);
    if (udhl < 0)
      return udhl;
    pos += 2;
    printf("UDL = 0x%02X\n", udhl);
    if ((((dcs & 0xC0) == 0) &&
         ((dcs == 0) || ((dcs & 0x2C) == 0x00) || ((dcs & 0x2C) == 0x20))) ||
        ((((dcs & 0xF0) == 0xC0) || ((dcs & 0xF0) == 0xD0)) &&
         ((dcs & 4) != 4)) ||
        (((dcs & 0xF0) == 0xF0) && ((dcs & 8) != 8) && ((dcs & 4) == 0))) {
      if ((udhl * 7) % 8 != 0) {
        udhl = (udhl * 7) / 8;
        udhl++;
      } else {
        udhl = (udhl * 7) / 8;
      }
      printf("UDL[adjusted] = 0x%02X\n", udhl);
    }
    printf("data = ");
    for (i = 0; i < udhl; i++) {
      ud = hex2number(buffer + pos, 2);
      if (ud < 0) {
        printf("\nData too short!\n");
        return ud;
      }
      pos += 2;
      printf("%02X", ud);
    }
    printf("\n");
  }
  if (buffer[pos] != '\r' && buffer[pos] != '\n' && buffer[pos] != '\0') {
    printf("Did not reach end: %s\n", buffer + pos);
    return 1;
  }
  return 0;
}


x86 assembly (clang, -O0):
<pdu_decode>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x48(%rbp)
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
xor    %esi,%esi
call   1060 <pdu_get_number@plt>
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
jge    11c3 <pdu_decode+0x83>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
mov    -0x20(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
mov    $0x2,%esi
call   1030 <hex2number@plt>
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jge    11f9 <pdu_decode+0xb9>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
mov    -0x1c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x14(%rbp),%esi
lea    0xe14(%rip),%rdi
xor    %eax,%eax
call   1040 <printf@plt>
mov    -0x14(%rbp),%eax
and    $0x3,%eax
mov    %rax,-0x58(%rbp)
sub    $0x3,%eax
ja     12a2 <pdu_decode+0x162>
mov    -0x58(%rbp),%rax
lea    0xdcf(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
lea    0xdf5(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
movl   $0x1,-0x28(%rbp)
jmp    12a2 <pdu_decode+0x162>
lea    0xde3(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
movl   $0x1,-0x24(%rbp)
jmp    12a2 <pdu_decode+0x162>
lea    0xdd0(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
movl   $0x1,-0x2c(%rbp)
jmp    12a2 <pdu_decode+0x162>
lea    0xdc5(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
cmpl   $0x0,-0x24(%rbp)
jne    12b6 <pdu_decode+0x176>
cmpl   $0x0,-0x28(%rbp)
je     12e9 <pdu_decode+0x1a9>
mov    -0x14(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     12ce <pdu_decode+0x18e>
movl   $0x1,-0x34(%rbp)
mov    -0x14(%rbp),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     12e4 <pdu_decode+0x1a4>
movl   $0x1,-0x38(%rbp)
jmp    12e9 <pdu_decode+0x1a9>
cmpl   $0x0,-0x34(%rbp)
je     1301 <pdu_decode+0x1c1>
lea    0xd64(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
cmpl   $0x0,-0x38(%rbp)
je     1319 <pdu_decode+0x1d9>
lea    0xd5d(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
cmpl   $0x0,-0x24(%rbp)
je     13ab <pdu_decode+0x26b>
mov    -0x14(%rbp),%eax
and    $0x18,%eax
mov    %rax,-0x60(%rbp)
sub    $0x3,%eax
ja     13a6 <pdu_decode+0x266>
mov    -0x60(%rbp),%rax
lea    0xccf(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
lea    0xd2d(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    13a6 <pdu_decode+0x266>
lea    0xd22(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
lea    0xd18(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
movl   $0x2,-0x30(%rbp)
jmp    13a6 <pdu_decode+0x266>
lea    0xd0c(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
movl   $0x3,-0x30(%rbp)
jmp    13ab <pdu_decode+0x26b>
lea    0xce2(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
cmpl   $0x0,-0x24(%rbp)
jne    13cd <pdu_decode+0x28d>
cmpl   $0x0,-0x2c(%rbp)
je     1414 <pdu_decode+0x2d4>
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
mov    $0x2,%esi
call   1030 <hex2number@plt>
mov    %eax,-0x18(%rbp)
cmpl   $0x0,-0x18(%rbp)
jge    13fa <pdu_decode+0x2ba>
mov    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
mov    -0x1c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%esi
lea    0xca5(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
mov    $0x1,%esi
call   1060 <pdu_get_number@plt>
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
jge    1441 <pdu_decode+0x301>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
mov    -0x20(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x2c(%rbp)
je     14b6 <pdu_decode+0x376>
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
call   1050 <pdu_get_timestamp@plt>
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
jge    147c <pdu_decode+0x33c>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
mov    -0x20(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
call   1050 <pdu_get_timestamp@plt>
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
jge    14ad <pdu_decode+0x36d>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
mov    -0x20(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x24(%rbp)
jne    14ca <pdu_decode+0x38a>
cmpl   $0x0,-0x28(%rbp)
je     1558 <pdu_decode+0x418>
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
mov    $0x2,%esi
call   1030 <hex2number@plt>
mov    %eax,-0x3c(%rbp)
cmpl   $0x0,-0x3c(%rbp)
jge    14f7 <pdu_decode+0x3b7>
mov    -0x3c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
mov    -0x1c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x3c(%rbp),%esi
lea    0xbb5(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
mov    $0x2,%esi
call   1030 <hex2number@plt>
mov    %eax,-0x40(%rbp)
cmpl   $0x0,-0x40(%rbp)
jge    153e <pdu_decode+0x3fe>
mov    -0x40(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
mov    -0x1c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x40(%rbp),%esi
lea    0xb7c(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
cmpl   $0x0,-0x24(%rbp)
je     1607 <pdu_decode+0x4c7>
cmpl   $0x2,-0x30(%rbp)
je     1576 <pdu_decode+0x436>
cmpl   $0x0,-0x30(%rbp)
jne    15c2 <pdu_decode+0x482>
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
mov    $0x2,%esi
call   1030 <hex2number@plt>
mov    %eax,-0x44(%rbp)
cmpl   $0x0,-0x44(%rbp)
jge    15a3 <pdu_decode+0x463>
mov    -0x44(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
mov    -0x1c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x44(%rbp),%esi
lea    0xb25(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1602 <pdu_decode+0x4c2>
cmpl   $0x3,-0x30(%rbp)
jne    15fd <pdu_decode+0x4bd>
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
call   1050 <pdu_get_timestamp@plt>
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
jge    15f4 <pdu_decode+0x4b4>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
mov    -0x20(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1602 <pdu_decode+0x4c2>
jmp    1607 <pdu_decode+0x4c7>
cmpl   $0x0,-0x28(%rbp)
je     1642 <pdu_decode+0x502>
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
call   1050 <pdu_get_timestamp@plt>
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
jge    1639 <pdu_decode+0x4f9>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
mov    -0x20(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x24(%rbp)
jne    1656 <pdu_decode+0x516>
cmpl   $0x0,-0x28(%rbp)
je     1820 <pdu_decode+0x6e0>
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
mov    $0x2,%esi
call   1030 <hex2number@plt>
mov    %eax,-0x48(%rbp)
cmpl   $0x0,-0x48(%rbp)
jge    1683 <pdu_decode+0x543>
mov    -0x48(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
mov    -0x1c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x48(%rbp),%esi
lea    0xa52(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x40(%rbp),%eax
and    $0xc0,%eax
cmp    $0x0,%eax
jne    16d6 <pdu_decode+0x596>
cmpl   $0x0,-0x40(%rbp)
je     173c <pdu_decode+0x5fc>
mov    -0x40(%rbp),%eax
and    $0x2c,%eax
cmp    $0x0,%eax
je     173c <pdu_decode+0x5fc>
mov    -0x40(%rbp),%eax
and    $0x2c,%eax
cmp    $0x20,%eax
je     173c <pdu_decode+0x5fc>
mov    -0x40(%rbp),%eax
and    $0xf0,%eax
cmp    $0xc0,%eax
je     16fc <pdu_decode+0x5bc>
mov    -0x40(%rbp),%eax
and    $0xf0,%eax
cmp    $0xd0,%eax
jne    170b <pdu_decode+0x5cb>
mov    -0x40(%rbp),%eax
and    $0x4,%eax
cmp    $0x4,%eax
jne    173c <pdu_decode+0x5fc>
mov    -0x40(%rbp),%eax
and    $0xf0,%eax
cmp    $0xf0,%eax
jne    178e <pdu_decode+0x64e>
mov    -0x40(%rbp),%eax
and    $0x8,%eax
cmp    $0x8,%eax
je     178e <pdu_decode+0x64e>
mov    -0x40(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
jne    178e <pdu_decode+0x64e>
imul   $0x7,-0x48(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     176e <pdu_decode+0x62e>
imul   $0x7,-0x48(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    177d <pdu_decode+0x63d>
imul   $0x7,-0x48(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%esi
lea    0x96f(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
lea    0x979(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
movl   $0x0,-0x50(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0x48(%rbp),%eax
jge    1812 <pdu_decode+0x6d2>
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
mov    $0x2,%esi
call   1030 <hex2number@plt>
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
jge    17ea <pdu_decode+0x6aa>
lea    0x93e(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x4c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
mov    -0x1c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x4c(%rbp),%esi
lea    0x92b(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    17a3 <pdu_decode+0x663>
lea    0x87b(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0xd,%eax
je     1884 <pdu_decode+0x744>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0xa,%eax
je     1884 <pdu_decode+0x744>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1884 <pdu_decode+0x744>
mov    -0x10(%rbp),%rsi
movslq -0x1c(%rbp),%rax
add    %rax,%rsi
lea    0x8bc(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
movl   $0x1,-0x4(%rbp)
jmp    188b <pdu_decode+0x74b>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<pdu_decode>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rdi,%r15
xor    %esi,%esi
call   1080 <pdu_get_number@plt>
mov    %eax,%ebp
test   %eax,%eax
js     1244 <pdu_decode+0xe4>
mov    %ebp,%r14d
lea    (%r15,%r14,1),%rdi
mov    $0x2,%esi
call   1050 <hex2number@plt>
mov    %eax,%ebx
test   %eax,%eax
js     1556 <pdu_decode+0x3f6>
lea    0x2(%rbp),%r13d
lea    0xe6b(%rip),%rdi
xor    %r12d,%r12d
mov    %ebx,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %ebx,%eax
and    $0x3,%eax
mov    $0x1,%dl
lea    0xe67(%rip),%rdi
lea    0xe3a(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    $0x1,%r12b
lea    0xe55(%rip),%rdi
xor    %edx,%edx
mov    %edx,(%rsp)
xor    %eax,%eax
call   1060 <printf@plt>
test   $0x80,%bl
je     11f8 <pdu_decode+0x98>
lea    0xe44(%rip),%rdi
xor    %eax,%eax
call   1060 <printf@plt>
test   $0x40,%bl
je     120b <pdu_decode+0xab>
lea    0xe42(%rip),%rdi
xor    %eax,%eax
call   1060 <printf@plt>
test   $0x18,%bl
sete   %al
and    %r12b,%al
cmp    $0x1,%al
jne    1226 <pdu_decode+0xc6>
lea    0xe36(%rip),%rdi
xor    %eax,%eax
call   1060 <printf@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
test   %r12b,%r12b
je     1311 <pdu_decode+0x1b1>
mov    $0x1,%al
mov    %eax,0x4(%rsp)
xor    %r12d,%r12d
jmp    1273 <pdu_decode+0x113>
mov    %ebp,%ebx
jmp    1556 <pdu_decode+0x3f6>
lea    0xe94(%rip),%rdi
call   1040 <puts@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
mov    $0x1,%r12b
movl   $0x0,0x4(%rsp)
movl   $0x0,(%rsp)
mov    %r13d,%edi
add    %r15,%rdi
mov    $0x2,%esi
call   1050 <hex2number@plt>
mov    %eax,%ebx
test   %eax,%eax
js     1556 <pdu_decode+0x3f6>
lea    0xdc9(%rip),%rdi
mov    %ebx,%esi
xor    %eax,%eax
call   1060 <printf@plt>
lea    (%r14,%r15,1),%rdi
add    $0x4,%rdi
mov    $0x1,%esi
call   1080 <pdu_get_number@plt>
mov    %eax,%r14d
test   %eax,%eax
js     1341 <pdu_decode+0x1e1>
add    $0x4,%ebp
add    %ebp,%r14d
test   %r12b,%r12b
je     1349 <pdu_decode+0x1e9>
mov    %r14d,%edi
add    %r15,%rdi
call   1070 <pdu_get_timestamp@plt>
mov    %eax,%ebx
test   %eax,%eax
mov    0x4(%rsp),%r13d
js     1556 <pdu_decode+0x3f6>
add    %r14d,%ebx
lea    (%r15,%rbx,1),%rdi
call   1070 <pdu_get_timestamp@plt>
mov    %eax,%r14d
test   %eax,%eax
js     1341 <pdu_decode+0x1e1>
add    %ebx,%r14d
jmp    134e <pdu_decode+0x1ee>
lea    0xddb(%rip),%rdi
call   1040 <puts@plt>
mov    $0xffffffff,%ebx
jmp    1556 <pdu_decode+0x3f6>
mov    %r13d,%edi
add    %r15,%rdi
mov    $0x1,%esi
call   1080 <pdu_get_number@plt>
mov    %eax,%r14d
test   %eax,%eax
js     1341 <pdu_decode+0x1e1>
mov    (%rsp),%eax
or     %al,%r12b
add    %r13d,%r14d
xor    %ebx,%ebx
test   %r12b,%r12b
je     13bc <pdu_decode+0x25c>
xor    %r13d,%r13d
jmp    1353 <pdu_decode+0x1f3>
mov    %r14d,%ebx
jmp    1556 <pdu_decode+0x3f6>
mov    0x4(%rsp),%r13d
test   %r13b,%r13b
je     13c8 <pdu_decode+0x268>
mov    %r14d,%ebp
lea    (%r15,%rbp,1),%rdi
mov    $0x2,%esi
call   1050 <hex2number@plt>
mov    %eax,%ebx
test   %eax,%eax
js     1556 <pdu_decode+0x3f6>
lea    0xcf5(%rip),%rdi
mov    %ebx,%esi
xor    %eax,%eax
call   1060 <printf@plt>
lea    (%r15,%rbp,1),%rdi
add    $0x2,%rdi
mov    $0x2,%esi
call   1050 <hex2number@plt>
mov    %eax,%ebx
test   %eax,%eax
js     1556 <pdu_decode+0x3f6>
add    $0x4,%r14d
lea    0xcd3(%rip),%rdi
mov    %ebx,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    $0x1,%bpl
test   %r13b,%r13b
mov    (%rsp),%r12d
jne    13d8 <pdu_decode+0x278>
jmp    1400 <pdu_decode+0x2a0>
mov    $0x1,%bpl
test   %al,%al
jne    1405 <pdu_decode+0x2a5>
jmp    1514 <pdu_decode+0x3b4>
mov    (%rsp),%r12d
xor    %ebx,%ebx
mov    $0x0,%ebp
test   %r13b,%r13b
je     1400 <pdu_decode+0x2a0>
mov    %r14d,%edi
add    %r15,%rdi
mov    $0x2,%esi
call   1050 <hex2number@plt>
test   %eax,%eax
js     1464 <pdu_decode+0x304>
add    $0x2,%r14d
lea    0xc8f(%rip),%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
test   %r12b,%r12b
je     1417 <pdu_decode+0x2b7>
mov    %r14d,%edi
add    %r15,%rdi
call   1070 <pdu_get_timestamp@plt>
test   %eax,%eax
js     1464 <pdu_decode+0x304>
add    %eax,%r14d
test   %bpl,%bpl
je     1514 <pdu_decode+0x3b4>
mov    %r14d,%edi
add    %r15,%rdi
mov    $0x2,%esi
call   1050 <hex2number@plt>
mov    %eax,%r12d
test   %eax,%eax
js     146b <pdu_decode+0x30b>
lea    0xc55(%rip),%rdi
mov    %r12d,%esi
xor    %eax,%eax
call   1060 <printf@plt>
test   $0xc0,%bl
je     1473 <pdu_decode+0x313>
mov    %ebx,%eax
and    $0xf0,%al
cmp    $0xc0,%al
je     145d <pdu_decode+0x2fd>
cmp    $0xf0,%al
je     147e <pdu_decode+0x31e>
cmp    $0xd0,%al
jne    14b9 <pdu_decode+0x359>
test   $0x4,%bl
je     1483 <pdu_decode+0x323>
jmp    14b9 <pdu_decode+0x359>
mov    %eax,%ebx
jmp    1556 <pdu_decode+0x3f6>
mov    %r12d,%ebx
jmp    1556 <pdu_decode+0x3f6>
test   %ebx,%ebx
je     1483 <pdu_decode+0x323>
test   $0xc,%bl
je     1483 <pdu_decode+0x323>
jmp    144d <pdu_decode+0x2ed>
test   $0xc,%bl
jne    14b9 <pdu_decode+0x359>
lea    0x0(,%r12,8),%eax
sub    %r12d,%eax
mov    %eax,%ecx
and    $0x7,%ecx
lea    0x7(%rax),%r12d
test   %eax,%eax
cmovns %eax,%r12d
sar    $0x3,%r12d
cmp    $0x1,%ecx
sbb    $0xffffffff,%r12d
lea    0xbf2(%rip),%rdi
mov    %r12d,%esi
xor    %eax,%eax
call   1060 <printf@plt>
lea    0xbf9(%rip),%rdi
xor    %eax,%eax
call   1060 <printf@plt>
add    $0x2,%r14d
test   %r12d,%r12d
jle    150a <pdu_decode+0x3aa>
movslq %r14d,%rbp
add    %r15,%rbp
lea    0xbe4(%rip),%r13
mov    %rbp,%rdi
mov    $0x2,%esi
call   1050 <hex2number@plt>
mov    %eax,%ebx
test   %eax,%eax
js     154a <pdu_decode+0x3ea>
mov    %r13,%rdi
mov    %ebx,%esi
xor    %eax,%eax
call   1060 <printf@plt>
add    $0x2,%rbp
add    $0x2,%r14d
add    $0xffffffff,%r12d
jne    14dd <pdu_decode+0x37d>
mov    $0xa,%edi
call   1030 <putchar@plt>
movslq %r14d,%rax
movzbl (%r15,%rax,1),%ecx
cmp    $0xd,%rcx
ja     152f <pdu_decode+0x3cf>
xor    %ebx,%ebx
mov    $0x2401,%edx
bt     %rcx,%rdx
jb     1556 <pdu_decode+0x3f6>
add    %rax,%r15
lea    0xb8d(%rip),%rdi
mov    %r15,%rsi
xor    %eax,%eax
call   1060 <printf@plt>
mov    $0x1,%ebx
jmp    1556 <pdu_decode+0x3f6>
lea    0xba3(%rip),%rdi
call   1040 <puts@plt>
mov    %ebx,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@.str = [22 x i8] c"Message type: %02x - \00"
@.str.1 = [8 x i8] c"Deliver\00"
@.str.2 = [7 x i8] c"Submit\00"
@.str.5 = [17 x i8] c", Reply path set\00"
@.str.6 = [15 x i8] c", UDH included\00"
@.str.7 = [8 x i8] c", No VP\00"
@.str.12 = [13 x i8] c"MR = 0x%02X\0A\00"
@.str.13 = [14 x i8] c"PID = 0x%02X\0A\00"
@.str.14 = [14 x i8] c"DCS = 0x%02X\0A\00"
@.str.15 = [13 x i8] c"VP = 0x%02X\0A\00"
@.str.16 = [14 x i8] c"UDL = 0x%02X\0A\00"
@.str.17 = [24 x i8] c"UDL[adjusted] = 0x%02X\0A\00"
@.str.18 = [8 x i8] c"data = \00"
@.str.20 = [5 x i8] c"%02X\00"
@.str.21 = [23 x i8] c"Did not reach end: %s\0A\00"
@str = [9 x i8] c"Reserved\00"
@str.22 = [14 x i8] c"Status report\00"
@str.23 = [17 x i8] c"\0AData too short!\00"
define i32 @pdu_decode(i8* %0) {
%2 = tail call i32 @pdu_get_number(i8* %0, i32 0)
%3 = icmp slt i32 %2, 0
br i1 %3, label %197, label %4
4: ; preds = %1
%5 = zext i32 %2 to i64
%6 = getelementptr inbounds i8, i8* %0, i64 %5
%7 = tail call i32 @hex2number(i8* %6, i32 2)
%8 = icmp slt i32 %7, 0
br i1 %8, label %197, label %9
9: ; preds = %4
%10 = add nuw nsw i32 %2, 2
%11 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([22 x i8], [22 x i8]* @.str, i64 0, i64 0), i32 %7)
%12 = and i32 %7, 3
switch i32 %12, label %16 [
i32 0, label %20
i32 1, label %13
i32 2, label %17
i32 3, label %14
]
13: ; preds = %9
br label %20
14: ; preds = %9
%15 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @str, i64 0, i64 0))
br label %197
16: ; preds = %9
unreachable
17: ; preds = %9
%18 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @str.22, i64 0, i64 0))
%19 = tail call i32 @putchar(i32 10)
br label %43
20: ; preds = %9, %13
%21 = phi i8* [ getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i64 0, i64 0), %13 ], [ getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i64 0, i64 0), %9 ]
%22 = phi i1 [ true, %13 ], [ false, %9 ]
%23 = phi i1 [ false, %13 ], [ true, %9 ]
%24 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) %21)
%25 = or i1 %22, %23
%26 = and i32 %7, 128
%27 = icmp eq i32 %26, 0
%28 = and i32 %7, 64
%29 = icmp eq i32 %28, 0
br i1 %27, label %30, label %31
30: ; preds = %20
br i1 %29, label %35, label %33
31: ; preds = %20
%32 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i64 0, i64 0))
br i1 %29, label %35, label %33
33: ; preds = %30, %31
%34 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([15 x i8], [15 x i8]* @.str.6, i64 0, i64 0))
br label %35
35: ; preds = %30, %33, %31
%36 = and i32 %7, 24
%37 = icmp eq i32 %36, 0
%38 = select i1 %22, i1 %37, i1 false
br i1 %38, label %39, label %41
39: ; preds = %35
%40 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.7, i64 0, i64 0))
br label %41
41: ; preds = %39, %35
%42 = tail call i32 @putchar(i32 10)
br i1 %22, label %43, label %58
43: ; preds = %17, %41
%44 = phi i1 [ false, %17 ], [ true, %41 ]
%45 = phi i1 [ true, %17 ], [ false, %41 ]
%46 = phi i1 [ false, %17 ], [ %23, %41 ]
%47 = zext i32 %10 to i64
%48 = getelementptr inbounds i8, i8* %0, i64 %47
%49 = tail call i32 @hex2number(i8* %48, i32 2)
%50 = icmp slt i32 %49, 0
br i1 %50, label %197, label %51
51: ; preds = %43
%52 = add nuw nsw i32 %2, 4
%53 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([13 x i8], [13 x i8]* @.str.12, i64 0, i64 0), i32 %49)
%54 = zext i32 %52 to i64
%55 = getelementptr inbounds i8, i8* %0, i64 %54
%56 = tail call i32 @pdu_get_number(i8* %55, i32 1)
%57 = icmp slt i32 %56, 0
br i1 %57, label %197, label %66
58: ; preds = %41
%59 = zext i32 %10 to i64
%60 = getelementptr inbounds i8, i8* %0, i64 %59
%61 = tail call i32 @pdu_get_number(i8* %60, i32 1)
%62 = icmp slt i32 %61, 0
br i1 %62, label %197, label %63
63: ; preds = %58
%64 = add nuw nsw i32 %61, %10
br i1 %25, label %82, label %65
65: ; preds = %63
br i1 %23, label %119, label %190
66: ; preds = %51
%67 = add nuw nsw i32 %56, %52
br i1 %45, label %68, label %81
68: ; preds = %66
%69 = zext i32 %67 to i64
%70 = getelementptr inbounds i8, i8* %0, i64 %69
%71 = tail call i32 @pdu_get_timestamp(i8* %70)
%72 = icmp slt i32 %71, 0
br i1 %72, label %197, label %73
73: ; preds = %68
%74 = add nuw nsw i32 %71, %67
%75 = zext i32 %74 to i64
%76 = getelementptr inbounds i8, i8* %0, i64 %75
%77 = tail call i32 @pdu_get_timestamp(i8* %76)
%78 = icmp slt i32 %77, 0
br i1 %78, label %197, label %79
79: ; preds = %73
%80 = add nuw nsw i32 %77, %74
br i1 %44, label %82, label %100
81: ; preds = %66
br i1 %44, label %82, label %100
82: ; preds = %63, %79, %81
%83 = phi i32 [ %80, %79 ], [ %67, %81 ], [ %64, %63 ]
%84 = phi i1 [ %44, %79 ], [ %44, %81 ], [ false, %63 ]
%85 = phi i1 [ %46, %79 ], [ %46, %81 ], [ %23, %63 ]
%86 = zext i32 %83 to i64
%87 = getelementptr inbounds i8, i8* %0, i64 %86
%88 = tail call i32 @hex2number(i8* %87, i32 2)
%89 = icmp slt i32 %88, 0
br i1 %89, label %197, label %90
90: ; preds = %82
%91 = add nuw nsw i32 %83, 2
%92 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @.str.13, i64 0, i64 0), i32 %88)
%93 = zext i32 %91 to i64
%94 = getelementptr inbounds i8, i8* %0, i64 %93
%95 = tail call i32 @hex2number(i8* %94, i32 2)
%96 = icmp slt i32 %95, 0
br i1 %96, label %197, label %97
97: ; preds = %90
%98 = add nuw nsw i32 %83, 4
%99 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @.str.14, i64 0, i64 0), i32 %95)
br i1 %84, label %102, label %114
100: ; preds = %79, %81
%101 = phi i32 [ %67, %81 ], [ %80, %79 ]
br i1 %44, label %102, label %114
102: ; preds = %97, %100
%103 = phi i32 [ %95, %97 ], [ 0, %100 ]
%104 = phi i32 [ %98, %97 ], [ %101, %100 ]
%105 = phi i1 [ true, %97 ], [ false, %100 ]
%106 = phi i1 [ %85, %97 ], [ %46, %100 ]
%107 = zext i32 %104 to i64
%108 = getelementptr inbounds i8, i8* %0, i64 %107
%109 = tail call i32 @hex2number(i8* %108, i32 2)
%110 = icmp slt i32 %109, 0
br i1 %110, label %197, label %111
111: ; preds = %102
%112 = add nuw nsw i32 %104, 2
%113 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([13 x i8], [13 x i8]* @.str.15, i64 0, i64 0), i32 %109)
br i1 %106, label %119, label %129
114: ; preds = %97, %100
%115 = phi i32 [ 0, %100 ], [ %95, %97 ]
%116 = phi i1 [ false, %100 ], [ true, %97 ]
%117 = phi i1 [ %46, %100 ], [ %85, %97 ]
%118 = phi i32 [ %101, %100 ], [ %98, %97 ]
br i1 %117, label %119, label %129
119: ; preds = %65, %111, %114
%120 = phi i32 [ %112, %111 ], [ %118, %114 ], [ %64, %65 ]
%121 = phi i1 [ %105, %111 ], [ %116, %114 ], [ true, %65 ]
%122 = phi i32 [ %103, %111 ], [ %115, %114 ], [ 0, %65 ]
%123 = zext i32 %120 to i64
%124 = getelementptr inbounds i8, i8* %0, i64 %123
%125 = tail call i32 @pdu_get_timestamp(i8* %124)
%126 = icmp slt i32 %125, 0
br i1 %126, label %197, label %127
127: ; preds = %119
%128 = add nuw nsw i32 %125, %120
br i1 %121, label %133, label %190
129: ; preds = %111, %114
%130 = phi i1 [ %116, %114 ], [ %105, %111 ]
%131 = phi i32 [ %115, %114 ], [ %103, %111 ]
%132 = phi i32 [ %118, %114 ], [ %112, %111 ]
br i1 %130, label %133, label %190
133: ; preds = %127, %129
%134 = phi i32 [ %128, %127 ], [ %132, %129 ]
%135 = phi i32 [ %122, %127 ], [ %131, %129 ]
%136 = zext i32 %134 to i64
%137 = getelementptr inbounds i8, i8* %0, i64 %136
%138 = tail call i32 @hex2number(i8* %137, i32 2)
%139 = icmp slt i32 %138, 0
br i1 %139, label %197, label %140
140: ; preds = %133
%141 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @.str.16, i64 0, i64 0), i32 %138)
%142 = and i32 %135, 192
%143 = icmp eq i32 %142, 0
br i1 %143, label %144, label %148
144: ; preds = %140
%145 = icmp eq i32 %135, 0
br i1 %145, label %157, label %146
146: ; preds = %144
%147 = and i32 %135, 44
switch i32 %147, label %148 [
i32 0, label %157
i32 32, label %157
]
148: ; preds = %146, %140
%149 = trunc i32 %135 to i8
%150 = and i8 %149, -16
switch i8 %150, label %165 [
i8 -64, label %151
i8 -48, label %151
i8 -16, label %154
]
151: ; preds = %148, %148
%152 = and i32 %135, 4
%153 = icmp eq i32 %152, 0
br i1 %153, label %157, label %165
154: ; preds = %148
%155 = and i32 %135, 12
%156 = icmp eq i32 %155, 0
br i1 %156, label %157, label %165
157: ; preds = %154, %146, %146, %151, %144
%158 = mul nsw i32 %138, 7
%159 = and i32 %158, 7
%160 = icmp ne i32 %159, 0
%161 = sdiv i32 %158, 8
%162 = zext i1 %160 to i32
%163 = add nsw i32 %161, %162
%164 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([24 x i8], [24 x i8]* @.str.17, i64 0, i64 0), i32 %163)
br label %165
165: ; preds = %151, %148, %157, %154
%166 = phi i32 [ %163, %157 ], [ %138, %154 ], [ %138, %148 ], [ %138, %151 ]
%167 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.18, i64 0, i64 0))
%168 = add nuw i32 %134, 2
%169 = icmp sgt i32 %166, 0
br i1 %169, label %170, label %187
170: ; preds = %165
%171 = sext i32 %168 to i64
br label %172
172: ; preds = %170, %180
%173 = phi i64 [ %171, %170 ], [ %183, %180 ]
%174 = phi i32 [ 0, %170 ], [ %182, %180 ]
%175 = getelementptr inbounds i8, i8* %0, i64 %173
%176 = tail call i32 @hex2number(i8* %175, i32 2)
%177 = icmp slt i32 %176, 0
br i1 %177, label %178, label %180
178: ; preds = %172
%179 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([17 x i8], [17 x i8]* @str.23, i64 0, i64 0))
br label %197
180: ; preds = %172
%181 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.20, i64 0, i64 0), i32 %176)
%182 = add nuw nsw i32 %174, 1
%183 = add nsw i64 %173, 2
%184 = icmp eq i32 %182, %166
br i1 %184, label %185, label %172
185: ; preds = %180
%186 = trunc i64 %183 to i32
br label %187
187: ; preds = %185, %165
%188 = phi i32 [ %168, %165 ], [ %186, %185 ]
%189 = tail call i32 @putchar(i32 10)
br label %190
190: ; preds = %65, %127, %129, %187
%191 = phi i32 [ %188, %187 ], [ %132, %129 ], [ %128, %127 ], [ %64, %65 ]
%192 = sext i32 %191 to i64
%193 = getelementptr inbounds i8, i8* %0, i64 %192
%194 = load i8, i8* %193
switch i8 %194, label %195 [
i8 13, label %197
i8 10, label %197
i8 0, label %197
]
195: ; preds = %190
%196 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([23 x i8], [23 x i8]* @.str.21, i64 0, i64 0), i8* %193)
br label %197
197: ; preds = %58, %190, %190, %190, %133, %119, %102, %90, %82, %73, %68, %51, %43, %4, %1, %195, %178, %14
%198 = phi i32 [ -1, %14 ], [ %176, %178 ], [ 1, %195 ], [ %2, %1 ], [ %7, %4 ], [ %49, %43 ], [ %56, %51 ], [ %71, %68 ], [ %77, %73 ], [ %88, %82 ], [ %95, %90 ], [ %109, %102 ], [ %125, %119 ], [ %138, %133 ], [ 0, %190 ], [ 0, %190 ], [ 0, %190 ], [ %61, %58 ]
ret i32 %198
}