unsigned short in_chksum_tcp6(unsigned short *h, unsigned short *d, int dlen) {
  unsigned int cksum;
  unsigned short answer = 0;
  cksum = h[0];
  cksum += h[1];
  cksum += h[2];
  cksum += h[3];
  cksum += h[4];
  cksum += h[5];
  cksum += h[6];
  cksum += h[7];
  cksum += h[8];
  cksum += h[9];
  cksum += h[10];
  cksum += h[11];
  cksum += h[12];
  cksum += h[13];
  cksum += h[14];
  cksum += h[15];
  cksum += h[16];
  cksum += h[17];
  cksum += d[0];
  cksum += d[1];
  cksum += d[2];
  cksum += d[3];
  cksum += d[4];
  cksum += d[5];
  cksum += d[6];
  cksum += d[7];
  cksum += d[8];
  cksum += d[9];
  dlen -= 20;
  d += 10;
  while (dlen >= 32) {
    cksum += d[0];
    cksum += d[1];
    cksum += d[2];
    cksum += d[3];
    cksum += d[4];
    cksum += d[5];
    cksum += d[6];
    cksum += d[7];
    cksum += d[8];
    cksum += d[9];
    cksum += d[10];
    cksum += d[11];
    cksum += d[12];
    cksum += d[13];
    cksum += d[14];
    cksum += d[15];
    d += 16;
    dlen -= 32;
  }
  while (dlen >= 8) {
    cksum += d[0];
    cksum += d[1];
    cksum += d[2];
    cksum += d[3];
    d += 4;
    dlen -= 8;
  }
  while (dlen > 1) {
    cksum += *d++;
    dlen -= 2;
  }
  if (dlen == 1) {
    *(unsigned char *)(&answer) = (*(unsigned char *)d);
    cksum += answer;
  }
  cksum = (cksum >> 16) + (cksum & 0x0000ffff);
  cksum += (cksum >> 16);
  return (unsigned short)(~cksum);
}


x86 assembly (clang, -O0):
<in_chksum_tcp6>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movw   $0x0,-0x1a(%rbp)
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x2(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x4(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x6(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x8(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0xa(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0xc(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0xe(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x10(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x12(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x14(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x16(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x18(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x1a(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x1c(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x1e(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x20(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x22(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl (%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x2(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x4(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x6(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x8(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0xa(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0xc(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0xe(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x10(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x12(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x14,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x14,%rax
mov    %rax,-0x10(%rbp)
cmpl   $0x20,-0x14(%rbp)
jl     13b0 <in_chksum_tcp6+0x2b0>
mov    -0x10(%rbp),%rax
movzwl (%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x2(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x4(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x6(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x8(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0xa(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0xc(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0xe(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x10(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x12(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x14(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x16(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x18(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x1a(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x1c(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x1e(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x20,%eax
mov    %eax,-0x14(%rbp)
jmp    12ad <in_chksum_tcp6+0x1ad>
jmp    13b5 <in_chksum_tcp6+0x2b5>
cmpl   $0x8,-0x14(%rbp)
jl     1410 <in_chksum_tcp6+0x310>
mov    -0x10(%rbp),%rax
movzwl (%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x2(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x4(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x6(%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x8,%eax
mov    %eax,-0x14(%rbp)
jmp    13b5 <in_chksum_tcp6+0x2b5>
jmp    1415 <in_chksum_tcp6+0x315>
cmpl   $0x1,-0x14(%rbp)
jle    1445 <in_chksum_tcp6+0x345>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x10(%rbp)
movzwl (%rax),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x14(%rbp)
jmp    1415 <in_chksum_tcp6+0x315>
cmpl   $0x1,-0x14(%rbp)
jne    1462 <in_chksum_tcp6+0x362>
mov    -0x10(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x1a(%rbp)
movzwl -0x1a(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
shr    $0x10,%eax
mov    -0x18(%rbp),%ecx
and    $0xffff,%ecx
add    %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
shr    $0x10,%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
xor    $0xffffffff,%eax
movzwl %ax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<in_chksum_tcp6>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
movdqu (%rdi),%xmm1
movdqu 0x10(%rdi),%xmm2
pxor   %xmm0,%xmm0
movdqa %xmm2,%xmm3
punpcklwd %xmm0,%xmm3
movdqa %xmm1,%xmm4
punpcklwd %xmm0,%xmm4
paddd  %xmm3,%xmm4
punpckhwd %xmm0,%xmm2
punpckhwd %xmm0,%xmm1
paddd  %xmm2,%xmm1
paddd  %xmm4,%xmm1
movzwl 0x20(%rdi),%ecx
movzwl 0x22(%rdi),%edi
movzwl (%rsi),%r9d
movzwl 0x2(%rsi),%r10d
movzwl 0x4(%rsi),%r11d
movzwl 0x6(%rsi),%ebx
movzwl 0x8(%rsi),%ebp
movzwl 0xa(%rsi),%r14d
movzwl 0xc(%rsi),%r15d
movzwl 0xe(%rsi),%r12d
movzwl 0x10(%rsi),%r13d
movzwl 0x12(%rsi),%r8d
pshufd $0xee,%xmm1,%xmm2
paddd  %xmm1,%xmm2
pshufd $0x55,%xmm2,%xmm1
paddd  %xmm2,%xmm1
movd   %xmm1,%eax
add    %ecx,%eax
add    %edi,%eax
add    %r9d,%eax
add    %r10d,%eax
add    %r11d,%eax
add    %ebx,%eax
add    %ebp,%eax
add    %r14d,%eax
add    %r15d,%eax
add    %r12d,%eax
add    %r13d,%eax
add    %r8d,%eax
add    $0x14,%rsi
cmp    $0x34,%edx
jl     121d <in_chksum_tcp6+0x11d>
add    $0xc,%edx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqu (%rsi),%xmm1
movdqu 0x10(%rsi),%xmm2
movdqa %xmm2,%xmm3
punpcklwd %xmm0,%xmm3
movdqa %xmm1,%xmm4
punpcklwd %xmm0,%xmm4
paddd  %xmm3,%xmm4
punpckhwd %xmm0,%xmm2
punpckhwd %xmm0,%xmm1
paddd  %xmm2,%xmm1
paddd  %xmm4,%xmm1
pshufd $0xee,%xmm1,%xmm2
paddd  %xmm1,%xmm2
pshufd $0x55,%xmm2,%xmm1
paddd  %xmm2,%xmm1
movd   %xmm1,%ecx
add    %ecx,%eax
add    $0x20,%rsi
add    $0xffffffe0,%edx
cmp    $0x3f,%edx
ja     11c0 <in_chksum_tcp6+0xc0>
add    $0xffffffe0,%edx
cmp    $0x8,%edx
jge    1225 <in_chksum_tcp6+0x125>
mov    %edx,%ecx
jmp    125e <in_chksum_tcp6+0x15e>
add    $0xffffffec,%edx
cmp    $0x8,%edx
jl     1219 <in_chksum_tcp6+0x119>
pxor   %xmm0,%xmm0
nopl   0x0(%rax)
movq   (%rsi),%xmm1
punpcklwd %xmm0,%xmm1
pshufd $0xee,%xmm1,%xmm2
paddd  %xmm1,%xmm2
pshufd $0x55,%xmm2,%xmm1
paddd  %xmm2,%xmm1
movd   %xmm1,%ecx
add    %ecx,%eax
add    $0x8,%rsi
lea    -0x8(%rdx),%ecx
cmp    $0xf,%edx
mov    %ecx,%edx
ja     1230 <in_chksum_tcp6+0x130>
cmp    $0x2,%ecx
jl     1373 <in_chksum_tcp6+0x273>
xor    %edi,%edi
mov    %ecx,%edx
sub    $0x3,%edx
cmovb  %edi,%edx
add    $0x1,%edx
cmp    $0xe,%edx
jb     1357 <in_chksum_tcp6+0x257>
shr    %edx
add    $0x1,%edx
mov    %edx,%r8d
and    $0xfffffff8,%r8d
movd   %eax,%xmm0
lea    -0x8(%r8),%rax
mov    %rax,%r9
shr    $0x3,%r9
add    $0x1,%r9
test   %rax,%rax
je     1303 <in_chksum_tcp6+0x203>
mov    %r9,%rax
and    $0xfffffffffffffffe,%rax
pxor   %xmm2,%xmm2
xor    %edi,%edi
pxor   %xmm1,%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movq   (%rsi,%rdi,2),%xmm3
movq   0x8(%rsi,%rdi,2),%xmm4
punpcklwd %xmm2,%xmm3
paddd  %xmm0,%xmm3
punpcklwd %xmm2,%xmm4
paddd  %xmm1,%xmm4
movq   0x10(%rsi,%rdi,2),%xmm0
movq   0x18(%rsi,%rdi,2),%xmm1
punpcklwd %xmm2,%xmm0
paddd  %xmm3,%xmm0
punpcklwd %xmm2,%xmm1
paddd  %xmm4,%xmm1
add    $0x10,%rdi
add    $0xfffffffffffffffe,%rax
jne    12c0 <in_chksum_tcp6+0x1c0>
jmp    1309 <in_chksum_tcp6+0x209>
pxor   %xmm1,%xmm1
xor    %edi,%edi
lea    (%r8,%r8,1),%eax
test   $0x1,%r9b
je     1332 <in_chksum_tcp6+0x232>
movq   (%rsi,%rdi,2),%xmm2
movq   0x8(%rsi,%rdi,2),%xmm3
pxor   %xmm4,%xmm4
punpcklwd %xmm4,%xmm2
paddd  %xmm2,%xmm0
punpcklwd %xmm4,%xmm3
paddd  %xmm3,%xmm1
paddd  %xmm1,%xmm0
lea    (%rsi,%r8,2),%rsi
sub    %eax,%ecx
pshufd $0xee,%xmm0,%xmm1
paddd  %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
paddd  %xmm1,%xmm0
movd   %xmm0,%eax
cmp    %rdx,%r8
je     1373 <in_chksum_tcp6+0x273>
mov    %ecx,%edx
nopl   0x0(%rax)
movzwl (%rsi),%ecx
add    $0x2,%rsi
add    %ecx,%eax
lea    -0x2(%rdx),%ecx
cmp    $0x3,%edx
mov    %ecx,%edx
ja     1360 <in_chksum_tcp6+0x260>
cmp    $0x1,%ecx
jne    137d <in_chksum_tcp6+0x27d>
movzbl (%rsi),%ecx
add    %ecx,%eax
mov    %eax,%ecx
shr    $0x10,%ecx
movzwl %ax,%edx
add    %ecx,%edx
mov    %edx,%eax
shr    $0x10,%eax
add    %edx,%eax
not    %eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define zeroext i16 @in_chksum_tcp6(i16* nocapture %0, i16* nocapture %1, i32 %2) {
%4 = bitcast i16* %0 to <16 x i16>*
%5 = load <16 x i16>, <16 x i16>* %4
%6 = zext <16 x i16> %5 to <16 x i32>
%7 = getelementptr inbounds i16, i16* %0, i64 16
%8 = load i16, i16* %7
%9 = zext i16 %8 to i32
%10 = getelementptr inbounds i16, i16* %0, i64 17
%11 = load i16, i16* %10
%12 = zext i16 %11 to i32
%13 = load i16, i16* %1
%14 = zext i16 %13 to i32
%15 = getelementptr inbounds i16, i16* %1, i64 1
%16 = load i16, i16* %15
%17 = zext i16 %16 to i32
%18 = getelementptr inbounds i16, i16* %1, i64 2
%19 = load i16, i16* %18
%20 = zext i16 %19 to i32
%21 = getelementptr inbounds i16, i16* %1, i64 3
%22 = load i16, i16* %21
%23 = zext i16 %22 to i32
%24 = getelementptr inbounds i16, i16* %1, i64 4
%25 = load i16, i16* %24
%26 = zext i16 %25 to i32
%27 = getelementptr inbounds i16, i16* %1, i64 5
%28 = load i16, i16* %27
%29 = zext i16 %28 to i32
%30 = getelementptr inbounds i16, i16* %1, i64 6
%31 = load i16, i16* %30
%32 = zext i16 %31 to i32
%33 = getelementptr inbounds i16, i16* %1, i64 7
%34 = load i16, i16* %33
%35 = zext i16 %34 to i32
%36 = getelementptr inbounds i16, i16* %1, i64 8
%37 = load i16, i16* %36
%38 = zext i16 %37 to i32
%39 = getelementptr inbounds i16, i16* %1, i64 9
%40 = load i16, i16* %39
%41 = zext i16 %40 to i32
%42 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %6)
%43 = add nuw nsw i32 %42, %9
%44 = add nuw nsw i32 %43, %12
%45 = add nuw nsw i32 %44, %14
%46 = add nuw nsw i32 %45, %17
%47 = add nuw nsw i32 %46, %20
%48 = add nuw nsw i32 %47, %23
%49 = add nuw nsw i32 %48, %26
%50 = add nuw nsw i32 %49, %29
%51 = add nuw nsw i32 %50, %32
%52 = add nuw nsw i32 %51, %35
%53 = add nuw nsw i32 %52, %38
%54 = add nuw nsw i32 %53, %41
%55 = add nsw i32 %2, -20
%56 = getelementptr inbounds i16, i16* %1, i64 10
%57 = icmp sgt i32 %2, 51
br i1 %57, label %63, label %58
58: ; preds = %63, %3
%59 = phi i32 [ %55, %3 ], [ %73, %63 ]
%60 = phi i32 [ %54, %3 ], [ %71, %63 ]
%61 = phi i16* [ %56, %3 ], [ %72, %63 ]
%62 = icmp sgt i32 %59, 7
br i1 %62, label %159, label %75
63: ; preds = %3, %63
%64 = phi i16* [ %72, %63 ], [ %56, %3 ]
%65 = phi i32 [ %71, %63 ], [ %54, %3 ]
%66 = phi i32 [ %73, %63 ], [ %55, %3 ]
%67 = bitcast i16* %64 to <16 x i16>*
%68 = load <16 x i16>, <16 x i16>* %67
%69 = zext <16 x i16> %68 to <16 x i32>
%70 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %69)
%71 = add i32 %70, %65
%72 = getelementptr inbounds i16, i16* %64, i64 16
%73 = add nsw i32 %66, -32
%74 = icmp ugt i32 %66, 63
br i1 %74, label %63, label %58
75: ; preds = %159, %58
%76 = phi i32 [ %59, %58 ], [ %169, %159 ]
%77 = phi i32 [ %60, %58 ], [ %167, %159 ]
%78 = phi i16* [ %61, %58 ], [ %168, %159 ]
%79 = icmp sgt i32 %76, 1
br i1 %79, label %80, label %181
80: ; preds = %75
%81 = add i32 %76, 1
%82 = call i32 @llvm.umin.i32(i32 %76, i32 3)
%83 = sub i32 %81, %82
%84 = lshr i32 %83, 1
%85 = add nuw i32 %84, 1
%86 = zext i32 %85 to i64
%87 = icmp ult i32 %83, 14
br i1 %87, label %155, label %88
88: ; preds = %80
%89 = and i64 %86, 4294967288
%90 = getelementptr i16, i16* %78, i64 %89
%91 = trunc i64 %89 to i32
%92 = mul i32 %91, -2
%93 = add i32 %76, %92
%94 = insertelement <4 x i32> <i32 poison, i32 0, i32 0, i32 0>, i32 %77, i64 0
%95 = add nsw i64 %89, -8
%96 = lshr exact i64 %95, 3
%97 = add nuw nsw i64 %96, 1
%98 = and i64 %97, 1
%99 = icmp eq i64 %95, 0
br i1 %99, label %131, label %100
100: ; preds = %88
%101 = and i64 %97, 4611686018427387902
br label %102
102: ; preds = %102, %100
%103 = phi i64 [ 0, %100 ], [ %128, %102 ]
%104 = phi <4 x i32> [ %94, %100 ], [ %126, %102 ]
%105 = phi <4 x i32> [ zeroinitializer, %100 ], [ %127, %102 ]
%106 = phi i64 [ 0, %100 ], [ %129, %102 ]
%107 = getelementptr i16, i16* %78, i64 %103
%108 = bitcast i16* %107 to <4 x i16>*
%109 = load <4 x i16>, <4 x i16>* %108
%110 = getelementptr i16, i16* %107, i64 4
%111 = bitcast i16* %110 to <4 x i16>*
%112 = load <4 x i16>, <4 x i16>* %111
%113 = zext <4 x i16> %109 to <4 x i32>
%114 = zext <4 x i16> %112 to <4 x i32>
%115 = add <4 x i32> %104, %113
%116 = add <4 x i32> %105, %114
%117 = or i64 %103, 8
%118 = getelementptr i16, i16* %78, i64 %117
%119 = bitcast i16* %118 to <4 x i16>*
%120 = load <4 x i16>, <4 x i16>* %119
%121 = getelementptr i16, i16* %118, i64 4
%122 = bitcast i16* %121 to <4 x i16>*
%123 = load <4 x i16>, <4 x i16>* %122
%124 = zext <4 x i16> %120 to <4 x i32>
%125 = zext <4 x i16> %123 to <4 x i32>
%126 = add <4 x i32> %115, %124
%127 = add <4 x i32> %116, %125
%128 = add nuw i64 %103, 16
%129 = add i64 %106, 2
%130 = icmp eq i64 %129, %101
br i1 %130, label %131, label %102
131: ; preds = %102, %88
%132 = phi <4 x i32> [ undef, %88 ], [ %126, %102 ]
%133 = phi <4 x i32> [ undef, %88 ], [ %127, %102 ]
%134 = phi i64 [ 0, %88 ], [ %128, %102 ]
%135 = phi <4 x i32> [ %94, %88 ], [ %126, %102 ]
%136 = phi <4 x i32> [ zeroinitializer, %88 ], [ %127, %102 ]
%137 = icmp eq i64 %98, 0
br i1 %137, label %149, label %138
138: ; preds = %131
%139 = getelementptr i16, i16* %78, i64 %134
%140 = bitcast i16* %139 to <4 x i16>*
%141 = load <4 x i16>, <4 x i16>* %140
%142 = getelementptr i16, i16* %139, i64 4
%143 = bitcast i16* %142 to <4 x i16>*
%144 = load <4 x i16>, <4 x i16>* %143
%145 = zext <4 x i16> %141 to <4 x i32>
%146 = zext <4 x i16> %144 to <4 x i32>
%147 = add <4 x i32> %135, %145
%148 = add <4 x i32> %136, %146
br label %149
149: ; preds = %131, %138
%150 = phi <4 x i32> [ %132, %131 ], [ %147, %138 ]
%151 = phi <4 x i32> [ %133, %131 ], [ %148, %138 ]
%152 = add <4 x i32> %151, %150
%153 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %152)
%154 = icmp eq i64 %89, %86
br i1 %154, label %181, label %155
155: ; preds = %80, %149
%156 = phi i16* [ %78, %80 ], [ %90, %149 ]
%157 = phi i32 [ %77, %80 ], [ %153, %149 ]
%158 = phi i32 [ %76, %80 ], [ %93, %149 ]
br label %171
159: ; preds = %58, %159
%160 = phi i16* [ %168, %159 ], [ %61, %58 ]
%161 = phi i32 [ %167, %159 ], [ %60, %58 ]
%162 = phi i32 [ %169, %159 ], [ %59, %58 ]
%163 = bitcast i16* %160 to <4 x i16>*
%164 = load <4 x i16>, <4 x i16>* %163
%165 = zext <4 x i16> %164 to <4 x i32>
%166 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %165)
%167 = add i32 %166, %161
%168 = getelementptr inbounds i16, i16* %160, i64 4
%169 = add nsw i32 %162, -8
%170 = icmp ugt i32 %162, 15
br i1 %170, label %159, label %75
171: ; preds = %155, %171
%172 = phi i16* [ %175, %171 ], [ %156, %155 ]
%173 = phi i32 [ %178, %171 ], [ %157, %155 ]
%174 = phi i32 [ %179, %171 ], [ %158, %155 ]
%175 = getelementptr inbounds i16, i16* %172, i64 1
%176 = load i16, i16* %172
%177 = zext i16 %176 to i32
%178 = add i32 %173, %177
%179 = add nsw i32 %174, -2
%180 = icmp ugt i32 %174, 3
br i1 %180, label %171, label %181
181: ; preds = %171, %149, %75
%182 = phi i32 [ %76, %75 ], [ %93, %149 ], [ %179, %171 ]
%183 = phi i32 [ %77, %75 ], [ %153, %149 ], [ %178, %171 ]
%184 = phi i16* [ %78, %75 ], [ %90, %149 ], [ %175, %171 ]
%185 = icmp eq i32 %182, 1
br i1 %185, label %186, label %191
186: ; preds = %181
%187 = bitcast i16* %184 to i8*
%188 = load i8, i8* %187
%189 = zext i8 %188 to i32
%190 = add i32 %183, %189
br label %191
191: ; preds = %186, %181
%192 = phi i32 [ %190, %186 ], [ %183, %181 ]
%193 = lshr i32 %192, 16
%194 = and i32 %192, 65535
%195 = add nuw nsw i32 %193, %194
%196 = lshr i32 %195, 16
%197 = add nuw nsw i32 %196, %195
%198 = trunc i32 %197 to i16
%199 = xor i16 %198, -1
ret i16 %199
}