#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 uint32_t;
typedef int uint16_t;
typedef char router_lifetime;
typedef char retrans_time;
typedef char reachable_time;

/* Variables and functions */
int checksum_icmpv6(char *, int);
int /*<<< orphan*/ memcpy(char *, char *, int);
char *icmp_decompression(char *schc_buffer, char *buffer, int schc_offset,
                         int buffer_offset, int packet_size) {
  uint16_t payload_length = 0;
  uint16_t checksum = 0;
  int icmp = (schc_buffer[0] >> 0) & 15;
  if (icmp == 0) {
    buffer[buffer_offset] = 0x80;
  } else if (icmp == 2) {
    buffer[buffer_offset] = 0x81;
  } else if (icmp == 4) {
    buffer[buffer_offset] = 0x85;
  } else if (icmp == 6) {
    buffer[buffer_offset] = 0x86;
  } else if (icmp == 8 || icmp == 9) {
    buffer[buffer_offset] = 0x87;
  } else if (icmp == 10 || icmp == 11) {
    buffer[buffer_offset] = 0x88;
  } else if (icmp == 12) {
    buffer[buffer_offset] = 0x89;
  }
  buffer_offset += 1;
  buffer[buffer_offset] = 0;
  buffer_offset += 1;
  buffer_offset += 2;
  if (icmp == 0 || icmp == 2) {
    memcpy(&buffer[buffer_offset], &schc_buffer[schc_offset], 2);
    buffer_offset += 2;
    schc_offset += 2;
    memcpy(&buffer[buffer_offset], &schc_buffer[schc_offset], 2);
    buffer_offset += 2;
    schc_offset += 2;
    memcpy(&buffer[buffer_offset], &schc_buffer[schc_offset],
           (packet_size - schc_offset));
    buffer_offset += (packet_size - schc_offset);
  } else if (icmp == 4) {
    buffer[buffer_offset] = 0;
    buffer[buffer_offset + 1] = 0;
    buffer[buffer_offset + 2] = 0;
    buffer[buffer_offset + 3] = 0;
    buffer_offset += 4;
  } else if (icmp == 6) {
    uint16_t router_lifetime = 64800;
    uint32_t reachable_time = 30000;
    uint32_t retrans_time = 1000;
    buffer[buffer_offset] = 0;
    buffer_offset += 1;
    buffer[buffer_offset] = 0;
    buffer_offset += 1;
    buffer[buffer_offset] |= (router_lifetime >> 8) & 255;
    buffer[buffer_offset + 1] |= (router_lifetime)&255;
    buffer_offset += 2;
    buffer[buffer_offset] |= (reachable_time >> 24) & 255;
    buffer[buffer_offset + 1] |= (reachable_time >> 16) & 255;
    buffer[buffer_offset + 2] |= (reachable_time >> 8) & 255;
    buffer[buffer_offset + 3] |= (reachable_time)&255;
    buffer_offset += 4;
    buffer[buffer_offset] |= (retrans_time >> 24) & 255;
    buffer[buffer_offset + 1] |= (retrans_time >> 16) & 255;
    buffer[buffer_offset + 2] |= (retrans_time >> 8) & 255;
    buffer[buffer_offset + 3] |= (retrans_time)&255;
    buffer_offset += 4;
    memcpy(&buffer[buffer_offset], &schc_buffer[schc_offset], 1);
    buffer_offset += 1;
    schc_offset += 1;
    buffer[buffer_offset] = 1;
    buffer_offset += 1;
    memcpy(&buffer[buffer_offset], &schc_buffer[schc_offset], 6);
    buffer_offset += 6;
  } else if (icmp == 8 || icmp == 9) {
    int i;
    buffer[buffer_offset] = 0;
    buffer[buffer_offset + 1] = 0;
    buffer[buffer_offset + 2] = 0;
    buffer[buffer_offset + 3] = 0;
    buffer_offset += 4;
    if (icmp == 8) {
      for (i = 0; i < 16; i++) {
        buffer[buffer_offset + i] = buffer[24 + i];
      }
      buffer_offset += 16;
    } else {
      memcpy(&buffer[buffer_offset], &schc_buffer[schc_offset], 16);
      buffer_offset += 16;
      schc_offset += 16;
    }
    memcpy(&buffer[buffer_offset], &schc_buffer[schc_offset], 1);
    buffer_offset += 1;
    schc_offset += 1;
    buffer[buffer_offset] = 1;
    buffer_offset += 1;
    memcpy(&buffer[buffer_offset], &schc_buffer[schc_offset], 6);
    buffer_offset += 6;
  } else if (icmp == 10 && icmp == 11) {
    int i;
    buffer[buffer_offset] = 1;
    buffer[buffer_offset + 1] = 1;
    buffer[buffer_offset + 2] = 0;
    buffer[buffer_offset + 3] = 0;
    buffer_offset += 4;
    if (icmp == 10) {
      for (i = 0; i < 16; i++) {
        buffer[buffer_offset + i] = buffer[8 + i];
      }
      buffer_offset += 16;
    } else {
      memcpy(&buffer[buffer_offset], &schc_buffer[schc_offset], 16);
      buffer_offset += 16;
      schc_offset += 16;
    }
  } else if (icmp == 12) {
    int i;
    buffer[buffer_offset] = 0;
    buffer[buffer_offset + 1] = 0;
    buffer[buffer_offset + 2] = 0;
    buffer[buffer_offset + 3] = 0;
    buffer_offset += 4;
    memcpy(&buffer[buffer_offset], &schc_buffer[schc_offset], 16);
    buffer_offset += 16;
    schc_offset += 16;
    for (i = 0; i < 16; i++) {
      buffer[buffer_offset + i] = buffer[24 + i];
    }
    buffer_offset += 16;
    memcpy(&buffer[buffer_offset], &schc_buffer[schc_offset], 1);
    buffer_offset += 1;
    schc_offset += 1;
    buffer[buffer_offset] = 1;
    buffer_offset += 1;
    memcpy(&buffer[buffer_offset], &schc_buffer[schc_offset], 6);
    buffer_offset += 6;
  }
  payload_length = (buffer_offset - 40);
  buffer[4] = (payload_length >> 8) & 255;
  buffer[5] = (payload_length >> 0) & 255;
  checksum = checksum_icmpv6(buffer, (buffer_offset));
  buffer[42] = (checksum >> 8) & 255;
  buffer[43] = (checksum >> 0) & 255;
  return buffer;
}


x86 assembly (clang, -O0):
<icmp_decompression>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sar    $0x0,%eax
and    $0xf,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x28(%rbp)
jne    1173 <icmp_decompression+0x53>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x80,(%rax,%rcx,1)
jmp    1242 <icmp_decompression+0x122>
cmpl   $0x2,-0x28(%rbp)
jne    118e <icmp_decompression+0x6e>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x81,(%rax,%rcx,1)
jmp    123d <icmp_decompression+0x11d>
cmpl   $0x4,-0x28(%rbp)
jne    11a9 <icmp_decompression+0x89>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x85,(%rax,%rcx,1)
jmp    1238 <icmp_decompression+0x118>
cmpl   $0x6,-0x28(%rbp)
jne    11c4 <icmp_decompression+0xa4>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x86,(%rax,%rcx,1)
jmp    1233 <icmp_decompression+0x113>
cmpl   $0x8,-0x28(%rbp)
je     11d8 <icmp_decompression+0xb8>
cmpl   $0x9,-0x28(%rbp)
jne    11e9 <icmp_decompression+0xc9>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x87,(%rax,%rcx,1)
jmp    122e <icmp_decompression+0x10e>
cmpl   $0xa,-0x28(%rbp)
je     11fd <icmp_decompression+0xdd>
cmpl   $0xb,-0x28(%rbp)
jne    120e <icmp_decompression+0xee>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x88,(%rax,%rcx,1)
jmp    1229 <icmp_decompression+0x109>
cmpl   $0xc,-0x28(%rbp)
jne    1224 <icmp_decompression+0x104>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x89,(%rax,%rcx,1)
jmp    1229 <icmp_decompression+0x109>
jmp    122e <icmp_decompression+0x10e>
jmp    1233 <icmp_decompression+0x113>
jmp    1238 <icmp_decompression+0x118>
jmp    123d <icmp_decompression+0x11d>
jmp    1242 <icmp_decompression+0x122>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x18(%rbp)
cmpl   $0x0,-0x28(%rbp)
je     127d <icmp_decompression+0x15d>
cmpl   $0x2,-0x28(%rbp)
jne    1313 <icmp_decompression+0x1f3>
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
movslq -0x14(%rbp),%rax
add    %rax,%rsi
mov    $0x2,%edx
call   1040 <memcpy@plt>
mov    -0x18(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
movslq -0x14(%rbp),%rax
add    %rax,%rsi
mov    $0x2,%edx
call   1040 <memcpy@plt>
mov    -0x18(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
movslq -0x14(%rbp),%rax
add    %rax,%rsi
mov    -0x1c(%rbp),%edx
sub    -0x14(%rbp),%edx
call   1040 <memcpy@plt>
mov    -0x1c(%rbp),%eax
sub    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    1918 <icmp_decompression+0x7f8>
cmpl   $0x4,-0x28(%rbp)
jne    136a <icmp_decompression+0x24a>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x18(%rbp)
jmp    1913 <icmp_decompression+0x7f3>
cmpl   $0x6,-0x28(%rbp)
jne    157f <icmp_decompression+0x45f>
movl   $0xfd20,-0x2c(%rbp)
movl   $0x7530,-0x30(%rbp)
movl   $0x3e8,-0x34(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x2c(%rbp),%esi
sar    $0x8,%esi
and    $0xff,%esi
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x2c(%rbp),%esi
and    $0xff,%esi
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x18(%rbp)
mov    -0x30(%rbp),%esi
sar    $0x18,%esi
and    $0xff,%esi
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%esi
sar    $0x10,%esi
and    $0xff,%esi
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%esi
sar    $0x8,%esi
and    $0xff,%esi
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%esi
and    $0xff,%esi
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x18(%rbp)
mov    -0x34(%rbp),%esi
sar    $0x18,%esi
and    $0xff,%esi
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x34(%rbp),%esi
sar    $0x10,%esi
and    $0xff,%esi
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x34(%rbp),%esi
sar    $0x8,%esi
and    $0xff,%esi
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x34(%rbp),%esi
and    $0xff,%esi
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
movslq -0x14(%rbp),%rax
add    %rax,%rsi
mov    $0x1,%edx
call   1040 <memcpy@plt>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x1,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
movslq -0x14(%rbp),%rax
add    %rax,%rsi
mov    $0x6,%edx
call   1040 <memcpy@plt>
mov    -0x18(%rbp),%eax
add    $0x6,%eax
mov    %eax,-0x18(%rbp)
jmp    190e <icmp_decompression+0x7ee>
cmpl   $0x8,-0x28(%rbp)
je     1593 <icmp_decompression+0x473>
cmpl   $0x9,-0x28(%rbp)
jne    16d9 <icmp_decompression+0x5b9>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x18(%rbp)
cmpl   $0x8,-0x28(%rbp)
jne    1632 <icmp_decompression+0x512>
movl   $0x0,-0x38(%rbp)
cmpl   $0x10,-0x38(%rbp)
jge    1624 <icmp_decompression+0x504>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    $0x18,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    15ec <icmp_decompression+0x4cc>
mov    -0x18(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x18(%rbp)
jmp    1664 <icmp_decompression+0x544>
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
movslq -0x14(%rbp),%rax
add    %rax,%rsi
mov    $0x10,%edx
call   1040 <memcpy@plt>
mov    -0x18(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
movslq -0x14(%rbp),%rax
add    %rax,%rsi
mov    $0x1,%edx
call   1040 <memcpy@plt>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x1,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
movslq -0x14(%rbp),%rax
add    %rax,%rsi
mov    $0x6,%edx
call   1040 <memcpy@plt>
mov    -0x18(%rbp),%eax
add    $0x6,%eax
mov    %eax,-0x18(%rbp)
jmp    1909 <icmp_decompression+0x7e9>
cmpl   $0xa,-0x28(%rbp)
jne    17c3 <icmp_decompression+0x6a3>
cmpl   $0xb,-0x28(%rbp)
jne    17c3 <icmp_decompression+0x6a3>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x1,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x1,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x18(%rbp)
cmpl   $0xa,-0x28(%rbp)
jne    178c <icmp_decompression+0x66c>
movl   $0x0,-0x3c(%rbp)
cmpl   $0x10,-0x3c(%rbp)
jge    177e <icmp_decompression+0x65e>
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x8,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    -0x3c(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1746 <icmp_decompression+0x626>
mov    -0x18(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x18(%rbp)
jmp    17be <icmp_decompression+0x69e>
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
movslq -0x14(%rbp),%rax
add    %rax,%rsi
mov    $0x10,%edx
call   1040 <memcpy@plt>
mov    -0x18(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x14(%rbp)
jmp    1904 <icmp_decompression+0x7e4>
cmpl   $0xc,-0x28(%rbp)
jne    18ff <icmp_decompression+0x7df>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
movslq -0x14(%rbp),%rax
add    %rax,%rsi
mov    $0x10,%edx
call   1040 <memcpy@plt>
mov    -0x18(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x14(%rbp)
movl   $0x0,-0x40(%rbp)
cmpl   $0x10,-0x40(%rbp)
jge    1886 <icmp_decompression+0x766>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%ecx
add    $0x18,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    -0x40(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    184e <icmp_decompression+0x72e>
mov    -0x18(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
movslq -0x14(%rbp),%rax
add    %rax,%rsi
mov    $0x1,%edx
call   1040 <memcpy@plt>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x1,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
movslq -0x14(%rbp),%rax
add    %rax,%rsi
mov    $0x6,%edx
call   1040 <memcpy@plt>
mov    -0x18(%rbp),%eax
add    $0x6,%eax
mov    %eax,-0x18(%rbp)
jmp    1904 <icmp_decompression+0x7e4>
jmp    1909 <icmp_decompression+0x7e9>
jmp    190e <icmp_decompression+0x7ee>
jmp    1913 <icmp_decompression+0x7f3>
jmp    1918 <icmp_decompression+0x7f8>
mov    -0x18(%rbp),%eax
sub    $0x28,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
sar    $0x8,%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x4(%rax)
mov    -0x20(%rbp),%eax
sar    $0x0,%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x5(%rax)
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%esi
call   1030 <checksum_icmpv6@plt>
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
sar    $0x8,%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x2a(%rax)
mov    -0x24(%rbp),%eax
sar    $0x0,%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x2b(%rax)
mov    -0x10(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<icmp_decompression>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %r8d,%r12d
mov    %edx,%r15d
mov    %rsi,%rbx
mov    %rdi,%r14
mov    (%rdi),%dl
mov    %edx,%eax
and    $0xf,%al
movslq %ecx,%r13
cmp    $0x7,%al
jae    1151 <icmp_decompression+0x31>
movzbl %al,%ecx
mov    $0x55,%esi
bt     %ecx,%esi
jb     1165 <icmp_decompression+0x45>
mov    %edx,%ecx
and    $0xe,%cl
cmp    $0x8,%cl
je     117b <icmp_decompression+0x5b>
cmp    $0xa,%cl
jne    1180 <icmp_decompression+0x60>
mov    $0x88,%sil
jmp    1187 <icmp_decompression+0x67>
lea    0x0(,%rax,8),%ecx
movabs $0x86808580818080,%rsi
shr    %cl,%rsi
jmp    1187 <icmp_decompression+0x67>
mov    $0x87,%sil
jmp    1187 <icmp_decompression+0x67>
mov    $0x89,%sil
cmp    $0xc,%al
jne    118b <icmp_decompression+0x6b>
mov    %sil,(%rbx,%r13,1)
movb   $0x0,0x1(%r13,%rbx,1)
lea    0x4(%r13),%rsi
test   $0xd,%dl
je     11c1 <icmp_decompression+0xa1>
cmp    $0x6,%al
je     121b <icmp_decompression+0xfb>
cmp    $0x4,%al
jne    128b <icmp_decompression+0x16b>
movb   $0x0,(%rbx,%rsi,1)
movw   $0x0,0x5(%r13,%rbx,1)
movb   $0x0,0x7(%r13,%rbx,1)
add    $0x8,%r13d
jmp    1470 <icmp_decompression+0x350>
movslq %esi,%rdi
add    %rbx,%rdi
movslq %r15d,%rbp
lea    (%r14,%rbp,1),%rsi
mov    $0x2,%edx
call   1040 <memcpy@plt>
lea    (%rbx,%r13,1),%rdi
add    $0x6,%rdi
lea    (%r14,%rbp,1),%rsi
add    $0x2,%rsi
mov    $0x2,%edx
call   1040 <memcpy@plt>
lea    (%rbx,%r13,1),%rdi
add    $0x8,%rdi
lea    (%r14,%rbp,1),%rsi
add    $0x4,%rsi
sub    %r15d,%r12d
lea    -0x4(%r12),%edx
call   1040 <memcpy@plt>
lea    (%r12,%r13,1),%esi
add    $0x4,%esi
jmp    1473 <icmp_decompression+0x353>
movb   $0x0,(%rbx,%rsi,1)
movb   $0x0,0x5(%r13,%rbx,1)
orb    $0xfd,0x6(%r13,%rbx,1)
orb    $0x20,0x7(%r13,%rbx,1)
orb    $0x75,0xa(%r13,%rbx,1)
orb    $0x30,0xb(%r13,%rbx,1)
orb    $0x3,0xe(%r13,%rbx,1)
orb    $0xe8,0xf(%r13,%rbx,1)
lea    (%rbx,%r13,1),%rdi
add    $0x10,%rdi
movslq %r15d,%rbp
lea    (%r14,%rbp,1),%rsi
mov    $0x1,%edx
call   1040 <memcpy@plt>
movb   $0x1,0x11(%r13,%rbx,1)
lea    (%rbx,%r13,1),%rdi
add    $0x12,%rdi
lea    (%r14,%rbp,1),%rsi
add    $0x1,%rsi
mov    $0x6,%edx
call   1040 <memcpy@plt>
add    $0x18,%r13d
jmp    1470 <icmp_decompression+0x350>
and    $0xe,%dl
cmp    $0x8,%dl
jne    1329 <icmp_decompression+0x209>
lea    0x8(%r13),%rdi
movb   $0x0,(%rbx,%rsi,1)
movw   $0x0,0x5(%r13,%rbx,1)
movb   $0x0,0x7(%r13,%rbx,1)
cmp    $0x8,%al
jne    141c <icmp_decompression+0x2fc>
mov    0x18(%rbx),%al
mov    %al,(%rbx,%rdi,1)
mov    0x19(%rbx),%al
mov    %al,0x1(%rbx,%rdi,1)
mov    0x1a(%rbx),%al
mov    %al,0x2(%rbx,%rdi,1)
mov    0x1b(%rbx),%al
mov    %al,0x3(%rbx,%rdi,1)
mov    0x1c(%rbx),%al
mov    %al,0x4(%rbx,%rdi,1)
mov    0x1d(%rbx),%al
mov    %al,0x5(%rbx,%rdi,1)
mov    0x1e(%rbx),%al
mov    %al,0x6(%rbx,%rdi,1)
mov    0x1f(%rbx),%al
mov    %al,0x7(%rbx,%rdi,1)
mov    0x20(%rbx),%al
mov    %al,0x8(%rbx,%rdi,1)
mov    0x21(%rbx),%al
mov    %al,0x9(%rbx,%rdi,1)
mov    0x22(%rbx),%al
mov    %al,0xa(%rbx,%rdi,1)
mov    0x23(%rbx),%al
mov    %al,0xb(%rbx,%rdi,1)
mov    0x24(%rbx),%al
mov    %al,0xc(%rbx,%rdi,1)
mov    0x25(%rbx),%al
mov    %al,0xd(%rbx,%rdi,1)
mov    0x26(%rbx),%al
mov    %al,0xe(%rbx,%rdi,1)
mov    0x27(%rbx),%al
mov    %al,0xf(%rbx,%rdi,1)
jmp    1433 <icmp_decompression+0x313>
cmp    $0xc,%al
jne    1473 <icmp_decompression+0x353>
movb   $0x0,(%rbx,%rsi,1)
movw   $0x0,0x5(%r13,%rbx,1)
movb   $0x0,0x7(%r13,%rbx,1)
lea    (%rbx,%r13,1),%rdi
add    $0x8,%rdi
movslq %r15d,%r15
lea    (%r14,%r15,1),%rsi
mov    $0x10,%edx
call   1040 <memcpy@plt>
mov    0x18(%rbx),%al
mov    %al,0x18(%r13,%rbx,1)
mov    0x19(%rbx),%al
mov    %al,0x19(%r13,%rbx,1)
mov    0x1a(%rbx),%al
mov    %al,0x1a(%r13,%rbx,1)
mov    0x1b(%rbx),%al
mov    %al,0x1b(%r13,%rbx,1)
mov    0x1c(%rbx),%al
mov    %al,0x1c(%r13,%rbx,1)
mov    0x1d(%rbx),%al
mov    %al,0x1d(%r13,%rbx,1)
mov    0x1e(%rbx),%al
mov    %al,0x1e(%r13,%rbx,1)
mov    0x1f(%rbx),%al
mov    %al,0x1f(%r13,%rbx,1)
mov    0x20(%rbx),%al
mov    %al,0x20(%r13,%rbx,1)
mov    0x21(%rbx),%al
mov    %al,0x21(%r13,%rbx,1)
mov    0x22(%rbx),%al
mov    %al,0x22(%r13,%rbx,1)
mov    0x23(%rbx),%al
mov    %al,0x23(%r13,%rbx,1)
mov    0x24(%rbx),%al
mov    %al,0x24(%r13,%rbx,1)
mov    0x25(%rbx),%al
mov    %al,0x25(%r13,%rbx,1)
mov    0x26(%rbx),%al
mov    %al,0x26(%r13,%rbx,1)
mov    0x27(%rbx),%al
mov    %al,0x27(%r13,%rbx,1)
lea    (%rbx,%r13,1),%rdi
add    $0x28,%rdi
lea    (%r14,%r15,1),%rsi
add    $0x10,%rsi
mov    $0x1,%edx
call   1040 <memcpy@plt>
movb   $0x1,0x29(%r13,%rbx,1)
lea    (%rbx,%r13,1),%rdi
add    $0x2a,%rdi
lea    (%r14,%r15,1),%rsi
add    $0x11,%rsi
mov    $0x6,%edx
call   1040 <memcpy@plt>
add    $0x30,%r13d
jmp    1470 <icmp_decompression+0x350>
add    %rbx,%rdi
movslq %r15d,%rsi
add    %r14,%rsi
mov    $0x10,%edx
call   1040 <memcpy@plt>
add    $0x10,%r15d
lea    (%rbx,%r13,1),%rdi
add    $0x18,%rdi
movslq %r15d,%rbp
lea    (%r14,%rbp,1),%rsi
mov    $0x1,%edx
call   1040 <memcpy@plt>
movb   $0x1,0x19(%r13,%rbx,1)
lea    (%rbx,%r13,1),%rdi
add    $0x1a,%rdi
lea    (%r14,%rbp,1),%rsi
add    $0x1,%rsi
mov    $0x6,%edx
call   1040 <memcpy@plt>
add    $0x20,%r13d
mov    %r13d,%esi
lea    -0x28(%rsi),%eax
rol    $0x8,%ax
mov    %ax,0x4(%rbx)
mov    %rbx,%rdi
call   1030 <checksum_icmpv6@plt>
rol    $0x8,%ax
mov    %ax,0x2a(%rbx)
mov    %rbx,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i8* @icmp_decompression(i8* %0, i8* %1, i32 %2, i32 %3, i32 %4) {
%6 = alloca i8*
%7 = alloca i8*
%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** %6
store i8* %1, i8** %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store i32 %4, i32* %10
store i32 0, i32* %11
store i32 0, i32* %12
%20 = load i8*, i8** %6
%21 = getelementptr inbounds i8, i8* %20, i64 0
%22 = load i8, i8* %21
%23 = sext i8 %22 to i32
%24 = ashr i32 %23, 0
%25 = and i32 %24, 15
store i32 %25, i32* %13
%26 = load i32, i32* %13
%27 = icmp eq i32 %26, 0
br i1 %27, label %28, label %33
28: ; preds = %5
%29 = load i8*, i8** %7
%30 = load i32, i32* %9
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds i8, i8* %29, i64 %31
store i8 -128, i8* %32
br label %93
33: ; preds = %5
%34 = load i32, i32* %13
%35 = icmp eq i32 %34, 2
br i1 %35, label %36, label %41
36: ; preds = %33
%37 = load i8*, i8** %7
%38 = load i32, i32* %9
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i8, i8* %37, i64 %39
store i8 -127, i8* %40
br label %92
41: ; preds = %33
%42 = load i32, i32* %13
%43 = icmp eq i32 %42, 4
br i1 %43, label %44, label %49
44: ; preds = %41
%45 = load i8*, i8** %7
%46 = load i32, i32* %9
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i8, i8* %45, i64 %47
store i8 -123, i8* %48
br label %91
49: ; preds = %41
%50 = load i32, i32* %13
%51 = icmp eq i32 %50, 6
br i1 %51, label %52, label %57
52: ; preds = %49
%53 = load i8*, i8** %7
%54 = load i32, i32* %9
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds i8, i8* %53, i64 %55
store i8 -122, i8* %56
br label %90
57: ; preds = %49
%58 = load i32, i32* %13
%59 = icmp eq i32 %58, 8
br i1 %59, label %63, label %60
60: ; preds = %57
%61 = load i32, i32* %13
%62 = icmp eq i32 %61, 9
br i1 %62, label %63, label %68
63: ; preds = %60, %57
%64 = load i8*, i8** %7
%65 = load i32, i32* %9
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds i8, i8* %64, i64 %66
store i8 -121, i8* %67
br label %89
68: ; preds = %60
%69 = load i32, i32* %13
%70 = icmp eq i32 %69, 10
br i1 %70, label %74, label %71
71: ; preds = %68
%72 = load i32, i32* %13
%73 = icmp eq i32 %72, 11
br i1 %73, label %74, label %79
74: ; preds = %71, %68
%75 = load i8*, i8** %7
%76 = load i32, i32* %9
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds i8, i8* %75, i64 %77
store i8 -120, i8* %78
br label %88
79: ; preds = %71
%80 = load i32, i32* %13
%81 = icmp eq i32 %80, 12
br i1 %81, label %82, label %87
82: ; preds = %79
%83 = load i8*, i8** %7
%84 = load i32, i32* %9
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds i8, i8* %83, i64 %85
store i8 -119, i8* %86
br label %87
87: ; preds = %82, %79
br label %88
88: ; preds = %87, %74
br label %89
89: ; preds = %88, %63
br label %90
90: ; preds = %89, %52
br label %91
91: ; preds = %90, %44
br label %92
92: ; preds = %91, %36
br label %93
93: ; preds = %92, %28
%94 = load i32, i32* %9
%95 = add nsw i32 %94, 1
store i32 %95, i32* %9
%96 = load i8*, i8** %7
%97 = load i32, i32* %9
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds i8, i8* %96, i64 %98
store i8 0, i8* %99
%100 = load i32, i32* %9
%101 = add nsw i32 %100, 1
store i32 %101, i32* %9
%102 = load i32, i32* %9
%103 = add nsw i32 %102, 2
store i32 %103, i32* %9
%104 = load i32, i32* %13
%105 = icmp eq i32 %104, 0
br i1 %105, label %109, label %106
106: ; preds = %93
%107 = load i32, i32* %13
%108 = icmp eq i32 %107, 2
br i1 %108, label %109, label %153
109: ; preds = %106, %93
%110 = load i8*, i8** %7
%111 = load i32, i32* %9
%112 = sext i32 %111 to i64
%113 = getelementptr inbounds i8, i8* %110, i64 %112
%114 = load i8*, i8** %6
%115 = load i32, i32* %8
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds i8, i8* %114, i64 %116
%118 = call i32 @memcpy(i8* %113, i8* %117, i32 2)
%119 = load i32, i32* %9
%120 = add nsw i32 %119, 2
store i32 %120, i32* %9
%121 = load i32, i32* %8
%122 = add nsw i32 %121, 2
store i32 %122, i32* %8
%123 = load i8*, i8** %7
%124 = load i32, i32* %9
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds i8, i8* %123, i64 %125
%127 = load i8*, i8** %6
%128 = load i32, i32* %8
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds i8, i8* %127, i64 %129
%131 = call i32 @memcpy(i8* %126, i8* %130, i32 2)
%132 = load i32, i32* %9
%133 = add nsw i32 %132, 2
store i32 %133, i32* %9
%134 = load i32, i32* %8
%135 = add nsw i32 %134, 2
store i32 %135, i32* %8
%136 = load i8*, i8** %7
%137 = load i32, i32* %9
%138 = sext i32 %137 to i64
%139 = getelementptr inbounds i8, i8* %136, i64 %138
%140 = load i8*, i8** %6
%141 = load i32, i32* %8
%142 = sext i32 %141 to i64
%143 = getelementptr inbounds i8, i8* %140, i64 %142
%144 = load i32, i32* %10
%145 = load i32, i32* %8
%146 = sub nsw i32 %144, %145
%147 = call i32 @memcpy(i8* %139, i8* %143, i32 %146)
%148 = load i32, i32* %10
%149 = load i32, i32* %8
%150 = sub nsw i32 %148, %149
%151 = load i32, i32* %9
%152 = add nsw i32 %151, %150
store i32 %152, i32* %9
br label %605
153: ; preds = %106
%154 = load i32, i32* %13
%155 = icmp eq i32 %154, 4
br i1 %155, label %156, label %178
156: ; preds = %153
%157 = load i8*, i8** %7
%158 = load i32, i32* %9
%159 = sext i32 %158 to i64
%160 = getelementptr inbounds i8, i8* %157, i64 %159
store i8 0, i8* %160
%161 = load i8*, i8** %7
%162 = load i32, i32* %9
%163 = add nsw i32 %162, 1
%164 = sext i32 %163 to i64
%165 = getelementptr inbounds i8, i8* %161, i64 %164
store i8 0, i8* %165
%166 = load i8*, i8** %7
%167 = load i32, i32* %9
%168 = add nsw i32 %167, 2
%169 = sext i32 %168 to i64
%170 = getelementptr inbounds i8, i8* %166, i64 %169
store i8 0, i8* %170
%171 = load i8*, i8** %7
%172 = load i32, i32* %9
%173 = add nsw i32 %172, 3
%174 = sext i32 %173 to i64
%175 = getelementptr inbounds i8, i8* %171, i64 %174
store i8 0, i8* %175
%176 = load i32, i32* %9
%177 = add nsw i32 %176, 4
store i32 %177, i32* %9
br label %604
178: ; preds = %153
%179 = load i32, i32* %13
%180 = icmp eq i32 %179, 6
br i1 %180, label %181, label %344
181: ; preds = %178
store i32 64800, i32* %14
store i32 30000, i32* %15
store i32 1000, i32* %16
%182 = load i8*, i8** %7
%183 = load i32, i32* %9
%184 = sext i32 %183 to i64
%185 = getelementptr inbounds i8, i8* %182, i64 %184
store i8 0, i8* %185
%186 = load i32, i32* %9
%187 = add nsw i32 %186, 1
store i32 %187, i32* %9
%188 = load i8*, i8** %7
%189 = load i32, i32* %9
%190 = sext i32 %189 to i64
%191 = getelementptr inbounds i8, i8* %188, i64 %190
store i8 0, i8* %191
%192 = load i32, i32* %9
%193 = add nsw i32 %192, 1
store i32 %193, i32* %9
%194 = load i32, i32* %14
%195 = ashr i32 %194, 8
%196 = and i32 %195, 255
%197 = load i8*, i8** %7
%198 = load i32, i32* %9
%199 = sext i32 %198 to i64
%200 = getelementptr inbounds i8, i8* %197, i64 %199
%201 = load i8, i8* %200
%202 = sext i8 %201 to i32
%203 = or i32 %202, %196
%204 = trunc i32 %203 to i8
store i8 %204, i8* %200
%205 = load i32, i32* %14
%206 = and i32 %205, 255
%207 = load i8*, i8** %7
%208 = load i32, i32* %9
%209 = add nsw i32 %208, 1
%210 = sext i32 %209 to i64
%211 = getelementptr inbounds i8, i8* %207, i64 %210
%212 = load i8, i8* %211
%213 = sext i8 %212 to i32
%214 = or i32 %213, %206
%215 = trunc i32 %214 to i8
store i8 %215, i8* %211
%216 = load i32, i32* %9
%217 = add nsw i32 %216, 2
store i32 %217, i32* %9
%218 = load i32, i32* %15
%219 = ashr i32 %218, 24
%220 = and i32 %219, 255
%221 = load i8*, i8** %7
%222 = load i32, i32* %9
%223 = sext i32 %222 to i64
%224 = getelementptr inbounds i8, i8* %221, i64 %223
%225 = load i8, i8* %224
%226 = sext i8 %225 to i32
%227 = or i32 %226, %220
%228 = trunc i32 %227 to i8
store i8 %228, i8* %224
%229 = load i32, i32* %15
%230 = ashr i32 %229, 16
%231 = and i32 %230, 255
%232 = load i8*, i8** %7
%233 = load i32, i32* %9
%234 = add nsw i32 %233, 1
%235 = sext i32 %234 to i64
%236 = getelementptr inbounds i8, i8* %232, i64 %235
%237 = load i8, i8* %236
%238 = sext i8 %237 to i32
%239 = or i32 %238, %231
%240 = trunc i32 %239 to i8
store i8 %240, i8* %236
%241 = load i32, i32* %15
%242 = ashr i32 %241, 8
%243 = and i32 %242, 255
%244 = load i8*, i8** %7
%245 = load i32, i32* %9
%246 = add nsw i32 %245, 2
%247 = sext i32 %246 to i64
%248 = getelementptr inbounds i8, i8* %244, i64 %247
%249 = load i8, i8* %248
%250 = sext i8 %249 to i32
%251 = or i32 %250, %243
%252 = trunc i32 %251 to i8
store i8 %252, i8* %248
%253 = load i32, i32* %15
%254 = and i32 %253, 255
%255 = load i8*, i8** %7
%256 = load i32, i32* %9
%257 = add nsw i32 %256, 3
%258 = sext i32 %257 to i64
%259 = getelementptr inbounds i8, i8* %255, i64 %258
%260 = load i8, i8* %259
%261 = sext i8 %260 to i32
%262 = or i32 %261, %254
%263 = trunc i32 %262 to i8
store i8 %263, i8* %259
%264 = load i32, i32* %9
%265 = add nsw i32 %264, 4
store i32 %265, i32* %9
%266 = load i32, i32* %16
%267 = ashr i32 %266, 24
%268 = and i32 %267, 255
%269 = load i8*, i8** %7
%270 = load i32, i32* %9
%271 = sext i32 %270 to i64
%272 = getelementptr inbounds i8, i8* %269, i64 %271
%273 = load i8, i8* %272
%274 = sext i8 %273 to i32
%275 = or i32 %274, %268
%276 = trunc i32 %275 to i8
store i8 %276, i8* %272
%277 = load i32, i32* %16
%278 = ashr i32 %277, 16
%279 = and i32 %278, 255
%280 = load i8*, i8** %7
%281 = load i32, i32* %9
%282 = add nsw i32 %281, 1
%283 = sext i32 %282 to i64
%284 = getelementptr inbounds i8, i8* %280, i64 %283
%285 = load i8, i8* %284
%286 = sext i8 %285 to i32
%287 = or i32 %286, %279
%288 = trunc i32 %287 to i8
store i8 %288, i8* %284
%289 = load i32, i32* %16
%290 = ashr i32 %289, 8
%291 = and i32 %290, 255
%292 = load i8*, i8** %7
%293 = load i32, i32* %9
%294 = add nsw i32 %293, 2
%295 = sext i32 %294 to i64
%296 = getelementptr inbounds i8, i8* %292, i64 %295
%297 = load i8, i8* %296
%298 = sext i8 %297 to i32
%299 = or i32 %298, %291
%300 = trunc i32 %299 to i8
store i8 %300, i8* %296
%301 = load i32, i32* %16
%302 = and i32 %301, 255
%303 = load i8*, i8** %7
%304 = load i32, i32* %9
%305 = add nsw i32 %304, 3
%306 = sext i32 %305 to i64
%307 = getelementptr inbounds i8, i8* %303, i64 %306
%308 = load i8, i8* %307
%309 = sext i8 %308 to i32
%310 = or i32 %309, %302
%311 = trunc i32 %310 to i8
store i8 %311, i8* %307
%312 = load i32, i32* %9
%313 = add nsw i32 %312, 4
store i32 %313, i32* %9
%314 = load i8*, i8** %7
%315 = load i32, i32* %9
%316 = sext i32 %315 to i64
%317 = getelementptr inbounds i8, i8* %314, i64 %316
%318 = load i8*, i8** %6
%319 = load i32, i32* %8
%320 = sext i32 %319 to i64
%321 = getelementptr inbounds i8, i8* %318, i64 %320
%322 = call i32 @memcpy(i8* %317, i8* %321, i32 1)
%323 = load i32, i32* %9
%324 = add nsw i32 %323, 1
store i32 %324, i32* %9
%325 = load i32, i32* %8
%326 = add nsw i32 %325, 1
store i32 %326, i32* %8
%327 = load i8*, i8** %7
%328 = load i32, i32* %9
%329 = sext i32 %328 to i64
%330 = getelementptr inbounds i8, i8* %327, i64 %329
store i8 1, i8* %330
%331 = load i32, i32* %9
%332 = add nsw i32 %331, 1
store i32 %332, i32* %9
%333 = load i8*, i8** %7
%334 = load i32, i32* %9
%335 = sext i32 %334 to i64
%336 = getelementptr inbounds i8, i8* %333, i64 %335
%337 = load i8*, i8** %6
%338 = load i32, i32* %8
%339 = sext i32 %338 to i64
%340 = getelementptr inbounds i8, i8* %337, i64 %339
%341 = call i32 @memcpy(i8* %336, i8* %340, i32 6)
%342 = load i32, i32* %9
%343 = add nsw i32 %342, 6
store i32 %343, i32* %9
br label %603
344: ; preds = %178
%345 = load i32, i32* %13
%346 = icmp eq i32 %345, 8
br i1 %346, label %350, label %347
347: ; preds = %344
%348 = load i32, i32* %13
%349 = icmp eq i32 %348, 9
br i1 %349, label %350, label %442
350: ; preds = %347, %344
%351 = load i8*, i8** %7
%352 = load i32, i32* %9
%353 = sext i32 %352 to i64
%354 = getelementptr inbounds i8, i8* %351, i64 %353
store i8 0, i8* %354
%355 = load i8*, i8** %7
%356 = load i32, i32* %9
%357 = add nsw i32 %356, 1
%358 = sext i32 %357 to i64
%359 = getelementptr inbounds i8, i8* %355, i64 %358
store i8 0, i8* %359
%360 = load i8*, i8** %7
%361 = load i32, i32* %9
%362 = add nsw i32 %361, 2
%363 = sext i32 %362 to i64
%364 = getelementptr inbounds i8, i8* %360, i64 %363
store i8 0, i8* %364
%365 = load i8*, i8** %7
%366 = load i32, i32* %9
%367 = add nsw i32 %366, 3
%368 = sext i32 %367 to i64
%369 = getelementptr inbounds i8, i8* %365, i64 %368
store i8 0, i8* %369
%370 = load i32, i32* %9
%371 = add nsw i32 %370, 4
store i32 %371, i32* %9
%372 = load i32, i32* %13
%373 = icmp eq i32 %372, 8
br i1 %373, label %374, label %397
374: ; preds = %350
store i32 0, i32* %17
br label %375
375: ; preds = %391, %374
%376 = load i32, i32* %17
%377 = icmp slt i32 %376, 16
br i1 %377, label %378, label %394
378: ; preds = %375
%379 = load i8*, i8** %7
%380 = load i32, i32* %17
%381 = add nsw i32 24, %380
%382 = sext i32 %381 to i64
%383 = getelementptr inbounds i8, i8* %379, i64 %382
%384 = load i8, i8* %383
%385 = load i8*, i8** %7
%386 = load i32, i32* %9
%387 = load i32, i32* %17
%388 = add nsw i32 %386, %387
%389 = sext i32 %388 to i64
%390 = getelementptr inbounds i8, i8* %385, i64 %389
store i8 %384, i8* %390
br label %391
391: ; preds = %378
%392 = load i32, i32* %17
%393 = add nsw i32 %392, 1
store i32 %393, i32* %17
br label %375
394: ; preds = %375
%395 = load i32, i32* %9
%396 = add nsw i32 %395, 16
store i32 %396, i32* %9
br label %411
397: ; preds = %350
%398 = load i8*, i8** %7
%399 = load i32, i32* %9
%400 = sext i32 %399 to i64
%401 = getelementptr inbounds i8, i8* %398, i64 %400
%402 = load i8*, i8** %6
%403 = load i32, i32* %8
%404 = sext i32 %403 to i64
%405 = getelementptr inbounds i8, i8* %402, i64 %404
%406 = call i32 @memcpy(i8* %401, i8* %405, i32 16)
%407 = load i32, i32* %9
%408 = add nsw i32 %407, 16
store i32 %408, i32* %9
%409 = load i32, i32* %8
%410 = add nsw i32 %409, 16
store i32 %410, i32* %8
br label %411
411: ; preds = %397, %394
%412 = load i8*, i8** %7
%413 = load i32, i32* %9
%414 = sext i32 %413 to i64
%415 = getelementptr inbounds i8, i8* %412, i64 %414
%416 = load i8*, i8** %6
%417 = load i32, i32* %8
%418 = sext i32 %417 to i64
%419 = getelementptr inbounds i8, i8* %416, i64 %418
%420 = call i32 @memcpy(i8* %415, i8* %419, i32 1)
%421 = load i32, i32* %9
%422 = add nsw i32 %421, 1
store i32 %422, i32* %9
%423 = load i32, i32* %8
%424 = add nsw i32 %423, 1
store i32 %424, i32* %8
%425 = load i8*, i8** %7
%426 = load i32, i32* %9
%427 = sext i32 %426 to i64
%428 = getelementptr inbounds i8, i8* %425, i64 %427
store i8 1, i8* %428
%429 = load i32, i32* %9
%430 = add nsw i32 %429, 1
store i32 %430, i32* %9
%431 = load i8*, i8** %7
%432 = load i32, i32* %9
%433 = sext i32 %432 to i64
%434 = getelementptr inbounds i8, i8* %431, i64 %433
%435 = load i8*, i8** %6
%436 = load i32, i32* %8
%437 = sext i32 %436 to i64
%438 = getelementptr inbounds i8, i8* %435, i64 %437
%439 = call i32 @memcpy(i8* %434, i8* %438, i32 6)
%440 = load i32, i32* %9
%441 = add nsw i32 %440, 6
store i32 %441, i32* %9
br label %602
442: ; preds = %347
%443 = load i32, i32* %13
%444 = icmp eq i32 %443, 10
br i1 %444, label %445, label %510
445: ; preds = %442
%446 = load i32, i32* %13
%447 = icmp eq i32 %446, 11
br i1 %447, label %448, label %510
448: ; preds = %445
%449 = load i8*, i8** %7
%450 = load i32, i32* %9
%451 = sext i32 %450 to i64
%452 = getelementptr inbounds i8, i8* %449, i64 %451
store i8 1, i8* %452
%453 = load i8*, i8** %7
%454 = load i32, i32* %9
%455 = add nsw i32 %454, 1
%456 = sext i32 %455 to i64
%457 = getelementptr inbounds i8, i8* %453, i64 %456
store i8 1, i8* %457
%458 = load i8*, i8** %7
%459 = load i32, i32* %9
%460 = add nsw i32 %459, 2
%461 = sext i32 %460 to i64
%462 = getelementptr inbounds i8, i8* %458, i64 %461
store i8 0, i8* %462
%463 = load i8*, i8** %7
%464 = load i32, i32* %9
%465 = add nsw i32 %464, 3
%466 = sext i32 %465 to i64
%467 = getelementptr inbounds i8, i8* %463, i64 %466
store i8 0, i8* %467
%468 = load i32, i32* %9
%469 = add nsw i32 %468, 4
store i32 %469, i32* %9
%470 = load i32, i32* %13
%471 = icmp eq i32 %470, 10
br i1 %471, label %472, label %495
472: ; preds = %448
store i32 0, i32* %18
br label %473
473: ; preds = %489, %472
%474 = load i32, i32* %18
%475 = icmp slt i32 %474, 16
br i1 %475, label %476, label %492
476: ; preds = %473
%477 = load i8*, i8** %7
%478 = load i32, i32* %18
%479 = add nsw i32 8, %478
%480 = sext i32 %479 to i64
%481 = getelementptr inbounds i8, i8* %477, i64 %480
%482 = load i8, i8* %481
%483 = load i8*, i8** %7
%484 = load i32, i32* %9
%485 = load i32, i32* %18
%486 = add nsw i32 %484, %485
%487 = sext i32 %486 to i64
%488 = getelementptr inbounds i8, i8* %483, i64 %487
store i8 %482, i8* %488
br label %489
489: ; preds = %476
%490 = load i32, i32* %18
%491 = add nsw i32 %490, 1
store i32 %491, i32* %18
br label %473
492: ; preds = %473
%493 = load i32, i32* %9
%494 = add nsw i32 %493, 16
store i32 %494, i32* %9
br label %509
495: ; preds = %448
%496 = load i8*, i8** %7
%497 = load i32, i32* %9
%498 = sext i32 %497 to i64
%499 = getelementptr inbounds i8, i8* %496, i64 %498
%500 = load i8*, i8** %6
%501 = load i32, i32* %8
%502 = sext i32 %501 to i64
%503 = getelementptr inbounds i8, i8* %500, i64 %502
%504 = call i32 @memcpy(i8* %499, i8* %503, i32 16)
%505 = load i32, i32* %9
%506 = add nsw i32 %505, 16
store i32 %506, i32* %9
%507 = load i32, i32* %8
%508 = add nsw i32 %507, 16
store i32 %508, i32* %8
br label %509
509: ; preds = %495, %492
br label %601
510: ; preds = %445, %442
%511 = load i32, i32* %13
%512 = icmp eq i32 %511, 12
br i1 %512, label %513, label %600
513: ; preds = %510
%514 = load i8*, i8** %7
%515 = load i32, i32* %9
%516 = sext i32 %515 to i64
%517 = getelementptr inbounds i8, i8* %514, i64 %516
store i8 0, i8* %517
%518 = load i8*, i8** %7
%519 = load i32, i32* %9
%520 = add nsw i32 %519, 1
%521 = sext i32 %520 to i64
%522 = getelementptr inbounds i8, i8* %518, i64 %521
store i8 0, i8* %522
%523 = load i8*, i8** %7
%524 = load i32, i32* %9
%525 = add nsw i32 %524, 2
%526 = sext i32 %525 to i64
%527 = getelementptr inbounds i8, i8* %523, i64 %526
store i8 0, i8* %527
%528 = load i8*, i8** %7
%529 = load i32, i32* %9
%530 = add nsw i32 %529, 3
%531 = sext i32 %530 to i64
%532 = getelementptr inbounds i8, i8* %528, i64 %531
store i8 0, i8* %532
%533 = load i32, i32* %9
%534 = add nsw i32 %533, 4
store i32 %534, i32* %9
%535 = load i8*, i8** %7
%536 = load i32, i32* %9
%537 = sext i32 %536 to i64
%538 = getelementptr inbounds i8, i8* %535, i64 %537
%539 = load i8*, i8** %6
%540 = load i32, i32* %8
%541 = sext i32 %540 to i64
%542 = getelementptr inbounds i8, i8* %539, i64 %541
%543 = call i32 @memcpy(i8* %538, i8* %542, i32 16)
%544 = load i32, i32* %9
%545 = add nsw i32 %544, 16
store i32 %545, i32* %9
%546 = load i32, i32* %8
%547 = add nsw i32 %546, 16
store i32 %547, i32* %8
store i32 0, i32* %19
br label %548
548: ; preds = %564, %513
%549 = load i32, i32* %19
%550 = icmp slt i32 %549, 16
br i1 %550, label %551, label %567
551: ; preds = %548
%552 = load i8*, i8** %7
%553 = load i32, i32* %19
%554 = add nsw i32 24, %553
%555 = sext i32 %554 to i64
%556 = getelementptr inbounds i8, i8* %552, i64 %555
%557 = load i8, i8* %556
%558 = load i8*, i8** %7
%559 = load i32, i32* %9
%560 = load i32, i32* %19
%561 = add nsw i32 %559, %560
%562 = sext i32 %561 to i64
%563 = getelementptr inbounds i8, i8* %558, i64 %562
store i8 %557, i8* %563
br label %564
564: ; preds = %551
%565 = load i32, i32* %19
%566 = add nsw i32 %565, 1
store i32 %566, i32* %19
br label %548
567: ; preds = %548
%568 = load i32, i32* %9
%569 = add nsw i32 %568, 16
store i32 %569, i32* %9
%570 = load i8*, i8** %7
%571 = load i32, i32* %9
%572 = sext i32 %571 to i64
%573 = getelementptr inbounds i8, i8* %570, i64 %572
%574 = load i8*, i8** %6
%575 = load i32, i32* %8
%576 = sext i32 %575 to i64
%577 = getelementptr inbounds i8, i8* %574, i64 %576
%578 = call i32 @memcpy(i8* %573, i8* %577, i32 1)
%579 = load i32, i32* %9
%580 = add nsw i32 %579, 1
store i32 %580, i32* %9
%581 = load i32, i32* %8
%582 = add nsw i32 %581, 1
store i32 %582, i32* %8
%583 = load i8*, i8** %7
%584 = load i32, i32* %9
%585 = sext i32 %584 to i64
%586 = getelementptr inbounds i8, i8* %583, i64 %585
store i8 1, i8* %586
%587 = load i32, i32* %9
%588 = add nsw i32 %587, 1
store i32 %588, i32* %9
%589 = load i8*, i8** %7
%590 = load i32, i32* %9
%591 = sext i32 %590 to i64
%592 = getelementptr inbounds i8, i8* %589, i64 %591
%593 = load i8*, i8** %6
%594 = load i32, i32* %8
%595 = sext i32 %594 to i64
%596 = getelementptr inbounds i8, i8* %593, i64 %595
%597 = call i32 @memcpy(i8* %592, i8* %596, i32 6)
%598 = load i32, i32* %9
%599 = add nsw i32 %598, 6
store i32 %599, i32* %9
br label %600
600: ; preds = %567, %510
br label %601
601: ; preds = %600, %509
br label %602
602: ; preds = %601, %411
br label %603
603: ; preds = %602, %181
br label %604
604: ; preds = %603, %156
br label %605
605: ; preds = %604, %109
%606 = load i32, i32* %9
%607 = sub nsw i32 %606, 40
store i32 %607, i32* %11
%608 = load i32, i32* %11
%609 = ashr i32 %608, 8
%610 = and i32 %609, 255
%611 = trunc i32 %610 to i8
%612 = load i8*, i8** %7
%613 = getelementptr inbounds i8, i8* %612, i64 4
store i8 %611, i8* %613
%614 = load i32, i32* %11
%615 = ashr i32 %614, 0
%616 = and i32 %615, 255
%617 = trunc i32 %616 to i8
%618 = load i8*, i8** %7
%619 = getelementptr inbounds i8, i8* %618, i64 5
store i8 %617, i8* %619
%620 = load i8*, i8** %7
%621 = load i32, i32* %9
%622 = call i32 @checksum_icmpv6(i8* %620, i32 %621)
store i32 %622, i32* %12
%623 = load i32, i32* %12
%624 = ashr i32 %623, 8
%625 = and i32 %624, 255
%626 = trunc i32 %625 to i8
%627 = load i8*, i8** %7
%628 = getelementptr inbounds i8, i8* %627, i64 42
store i8 %626, i8* %628
%629 = load i32, i32* %12
%630 = ashr i32 %629, 0
%631 = and i32 %630, 255
%632 = trunc i32 %631 to i8
%633 = load i8*, i8** %7
%634 = getelementptr inbounds i8, i8* %633, i64 43
store i8 %632, i8* %634
%635 = load i8*, i8** %7
ret i8* %635
}

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