unsigned short in_chksum_icmp6(unsigned short *h, unsigned short *w, int blen) {
  unsigned short answer = 0;
  unsigned int cksum = 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];
  while (blen >= 32) {
    cksum += w[0];
    cksum += w[1];
    cksum += w[2];
    cksum += w[3];
    cksum += w[4];
    cksum += w[5];
    cksum += w[6];
    cksum += w[7];
    cksum += w[8];
    cksum += w[9];
    cksum += w[10];
    cksum += w[11];
    cksum += w[12];
    cksum += w[13];
    cksum += w[14];
    cksum += w[15];
    w += 16;
    blen -= 32;
  }
  while (blen >= 8) {
    cksum += w[0];
    cksum += w[1];
    cksum += w[2];
    cksum += w[3];
    w += 4;
    blen -= 8;
  }
  while (blen > 1) {
    cksum += *w++;
    blen -= 2;
  }
  if (blen == 1) {
    *(unsigned char *)(&answer) = (*(unsigned char *)w);
    cksum += answer;
  }
  cksum = (cksum >> 16) + (cksum & 0x0000ffff);
  cksum += (cksum >> 16);
  return (unsigned short)(~cksum);
}


x86 assembly (clang, -O0):
<in_chksum_icmp6>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movw   $0x0,-0x16(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x2(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x4(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x6(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x8(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0xa(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0xc(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0xe(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x10(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x12(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x14(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x16(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x18(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x1a(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x1c(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x1e(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x20(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x22(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x20,-0x14(%rbp)
jl     1317 <in_chksum_icmp6+0x217>
mov    -0x10(%rbp),%rax
movzwl (%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x2(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x4(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x6(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x8(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0xa(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0xc(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0xe(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x10(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x12(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x14(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x16(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x18(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x1a(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x1c(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x1e(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x20,%eax
mov    %eax,-0x14(%rbp)
jmp    1214 <in_chksum_icmp6+0x114>
jmp    131c <in_chksum_icmp6+0x21c>
cmpl   $0x8,-0x14(%rbp)
jl     1377 <in_chksum_icmp6+0x277>
mov    -0x10(%rbp),%rax
movzwl (%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x2(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x4(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzwl 0x6(%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x8,%eax
mov    %eax,-0x14(%rbp)
jmp    131c <in_chksum_icmp6+0x21c>
jmp    137c <in_chksum_icmp6+0x27c>
cmpl   $0x1,-0x14(%rbp)
jle    13ac <in_chksum_icmp6+0x2ac>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x10(%rbp)
movzwl (%rax),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x14(%rbp)
jmp    137c <in_chksum_icmp6+0x27c>
cmpl   $0x1,-0x14(%rbp)
jne    13c9 <in_chksum_icmp6+0x2c9>
mov    -0x10(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x16(%rbp)
movzwl -0x16(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
shr    $0x10,%eax
mov    -0x1c(%rbp),%ecx
and    $0xffff,%ecx
add    %ecx,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
shr    $0x10,%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
xor    $0xffffffff,%eax
movzwl %ax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<in_chksum_icmp6>:
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
pshufd $0xee,%xmm1,%xmm2
paddd  %xmm1,%xmm2
pshufd $0x55,%xmm2,%xmm1
paddd  %xmm2,%xmm1
movd   %xmm1,%eax
add    %ecx,%eax
add    %edi,%eax
cmp    $0x20,%edx
jl     11f8 <in_chksum_icmp6+0xf8>
nopl   0x0(%rax)
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
lea    -0x20(%rdx),%edi
cmp    $0x3f,%edx
mov    %edi,%edx
ja     1160 <in_chksum_icmp6+0x60>
cmp    $0x8,%edi
jl     11ff <in_chksum_icmp6+0xff>
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(%rdi),%ecx
cmp    $0xf,%edi
mov    %ecx,%edi
ja     11c0 <in_chksum_icmp6+0xc0>
cmp    $0x2,%ecx
jge    120a <in_chksum_icmp6+0x10a>
jmp    1313 <in_chksum_icmp6+0x213>
mov    %edx,%edi
cmp    $0x8,%edi
jge    11b8 <in_chksum_icmp6+0xb8>
mov    %edi,%ecx
cmp    $0x2,%ecx
jl     1313 <in_chksum_icmp6+0x213>
xor    %edi,%edi
mov    %ecx,%edx
sub    $0x3,%edx
cmovb  %edi,%edx
add    $0x1,%edx
cmp    $0xe,%edx
jb     12f7 <in_chksum_icmp6+0x1f7>
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     12a3 <in_chksum_icmp6+0x1a3>
mov    %r9,%rax
and    $0xfffffffffffffffe,%rax
pxor   %xmm2,%xmm2
xor    %edi,%edi
pxor   %xmm1,%xmm1
cs nopw 0x0(%rax,%rax,1)
nop
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    1260 <in_chksum_icmp6+0x160>
jmp    12a9 <in_chksum_icmp6+0x1a9>
pxor   %xmm1,%xmm1
xor    %edi,%edi
lea    (%r8,%r8,1),%eax
test   $0x1,%r9b
je     12d2 <in_chksum_icmp6+0x1d2>
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     1313 <in_chksum_icmp6+0x213>
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     1300 <in_chksum_icmp6+0x200>
cmp    $0x1,%ecx
jne    131d <in_chksum_icmp6+0x21d>
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
ret

LLVM IR (-O0):
define zeroext i16 @in_chksum_icmp6(i16* %0, i16* %1, i32 %2) {
%4 = alloca i16*
%5 = alloca i16*
%6 = alloca i32
%7 = alloca i16
%8 = alloca i32
store i16* %0, i16** %4
store i16* %1, i16** %5
store i32 %2, i32* %6
store i16 0, i16* %7
store i32 0, i32* %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* %8
%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* %8
%18 = add i32 %17, %16
store i32 %18, i32* %8
%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* %8
%24 = add i32 %23, %22
store i32 %24, i32* %8
%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* %8
%30 = add i32 %29, %28
store i32 %30, i32* %8
%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* %8
%36 = add i32 %35, %34
store i32 %36, i32* %8
%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* %8
%42 = add i32 %41, %40
store i32 %42, i32* %8
%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* %8
%48 = add i32 %47, %46
store i32 %48, i32* %8
%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* %8
%54 = add i32 %53, %52
store i32 %54, i32* %8
%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* %8
%60 = add i32 %59, %58
store i32 %60, i32* %8
%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* %8
%66 = add i32 %65, %64
store i32 %66, i32* %8
%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* %8
%72 = add i32 %71, %70
store i32 %72, i32* %8
%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* %8
%78 = add i32 %77, %76
store i32 %78, i32* %8
%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* %8
%84 = add i32 %83, %82
store i32 %84, i32* %8
%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* %8
%90 = add i32 %89, %88
store i32 %90, i32* %8
%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* %8
%96 = add i32 %95, %94
store i32 %96, i32* %8
%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* %8
%102 = add i32 %101, %100
store i32 %102, i32* %8
%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* %8
%108 = add i32 %107, %106
store i32 %108, i32* %8
%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* %8
%114 = add i32 %113, %112
store i32 %114, i32* %8
br label %115
115: ; preds = %118, %3
%116 = load i32, i32* %6
%117 = icmp sge i32 %116, 32
br i1 %117, label %118, label %219
118: ; preds = %115
%119 = load i16*, i16** %5
%120 = getelementptr inbounds i16, i16* %119, i64 0
%121 = load i16, i16* %120
%122 = zext i16 %121 to i32
%123 = load i32, i32* %8
%124 = add i32 %123, %122
store i32 %124, i32* %8
%125 = load i16*, i16** %5
%126 = getelementptr inbounds i16, i16* %125, i64 1
%127 = load i16, i16* %126
%128 = zext i16 %127 to i32
%129 = load i32, i32* %8
%130 = add i32 %129, %128
store i32 %130, i32* %8
%131 = load i16*, i16** %5
%132 = getelementptr inbounds i16, i16* %131, i64 2
%133 = load i16, i16* %132
%134 = zext i16 %133 to i32
%135 = load i32, i32* %8
%136 = add i32 %135, %134
store i32 %136, i32* %8
%137 = load i16*, i16** %5
%138 = getelementptr inbounds i16, i16* %137, i64 3
%139 = load i16, i16* %138
%140 = zext i16 %139 to i32
%141 = load i32, i32* %8
%142 = add i32 %141, %140
store i32 %142, i32* %8
%143 = load i16*, i16** %5
%144 = getelementptr inbounds i16, i16* %143, i64 4
%145 = load i16, i16* %144
%146 = zext i16 %145 to i32
%147 = load i32, i32* %8
%148 = add i32 %147, %146
store i32 %148, i32* %8
%149 = load i16*, i16** %5
%150 = getelementptr inbounds i16, i16* %149, i64 5
%151 = load i16, i16* %150
%152 = zext i16 %151 to i32
%153 = load i32, i32* %8
%154 = add i32 %153, %152
store i32 %154, i32* %8
%155 = load i16*, i16** %5
%156 = getelementptr inbounds i16, i16* %155, i64 6
%157 = load i16, i16* %156
%158 = zext i16 %157 to i32
%159 = load i32, i32* %8
%160 = add i32 %159, %158
store i32 %160, i32* %8
%161 = load i16*, i16** %5
%162 = getelementptr inbounds i16, i16* %161, i64 7
%163 = load i16, i16* %162
%164 = zext i16 %163 to i32
%165 = load i32, i32* %8
%166 = add i32 %165, %164
store i32 %166, i32* %8
%167 = load i16*, i16** %5
%168 = getelementptr inbounds i16, i16* %167, i64 8
%169 = load i16, i16* %168
%170 = zext i16 %169 to i32
%171 = load i32, i32* %8
%172 = add i32 %171, %170
store i32 %172, i32* %8
%173 = load i16*, i16** %5
%174 = getelementptr inbounds i16, i16* %173, i64 9
%175 = load i16, i16* %174
%176 = zext i16 %175 to i32
%177 = load i32, i32* %8
%178 = add i32 %177, %176
store i32 %178, i32* %8
%179 = load i16*, i16** %5
%180 = getelementptr inbounds i16, i16* %179, i64 10
%181 = load i16, i16* %180
%182 = zext i16 %181 to i32
%183 = load i32, i32* %8
%184 = add i32 %183, %182
store i32 %184, i32* %8
%185 = load i16*, i16** %5
%186 = getelementptr inbounds i16, i16* %185, i64 11
%187 = load i16, i16* %186
%188 = zext i16 %187 to i32
%189 = load i32, i32* %8
%190 = add i32 %189, %188
store i32 %190, i32* %8
%191 = load i16*, i16** %5
%192 = getelementptr inbounds i16, i16* %191, i64 12
%193 = load i16, i16* %192
%194 = zext i16 %193 to i32
%195 = load i32, i32* %8
%196 = add i32 %195, %194
store i32 %196, i32* %8
%197 = load i16*, i16** %5
%198 = getelementptr inbounds i16, i16* %197, i64 13
%199 = load i16, i16* %198
%200 = zext i16 %199 to i32
%201 = load i32, i32* %8
%202 = add i32 %201, %200
store i32 %202, i32* %8
%203 = load i16*, i16** %5
%204 = getelementptr inbounds i16, i16* %203, i64 14
%205 = load i16, i16* %204
%206 = zext i16 %205 to i32
%207 = load i32, i32* %8
%208 = add i32 %207, %206
store i32 %208, i32* %8
%209 = load i16*, i16** %5
%210 = getelementptr inbounds i16, i16* %209, i64 15
%211 = load i16, i16* %210
%212 = zext i16 %211 to i32
%213 = load i32, i32* %8
%214 = add i32 %213, %212
store i32 %214, i32* %8
%215 = load i16*, i16** %5
%216 = getelementptr inbounds i16, i16* %215, i64 16
store i16* %216, i16** %5
%217 = load i32, i32* %6
%218 = sub nsw i32 %217, 32
store i32 %218, i32* %6
br label %115
219: ; preds = %115
br label %220
220: ; preds = %223, %219
%221 = load i32, i32* %6
%222 = icmp sge i32 %221, 8
br i1 %222, label %223, label %252
223: ; preds = %220
%224 = load i16*, i16** %5
%225 = getelementptr inbounds i16, i16* %224, i64 0
%226 = load i16, i16* %225
%227 = zext i16 %226 to i32
%228 = load i32, i32* %8
%229 = add i32 %228, %227
store i32 %229, i32* %8
%230 = load i16*, i16** %5
%231 = getelementptr inbounds i16, i16* %230, i64 1
%232 = load i16, i16* %231
%233 = zext i16 %232 to i32
%234 = load i32, i32* %8
%235 = add i32 %234, %233
store i32 %235, i32* %8
%236 = load i16*, i16** %5
%237 = getelementptr inbounds i16, i16* %236, i64 2
%238 = load i16, i16* %237
%239 = zext i16 %238 to i32
%240 = load i32, i32* %8
%241 = add i32 %240, %239
store i32 %241, i32* %8
%242 = load i16*, i16** %5
%243 = getelementptr inbounds i16, i16* %242, i64 3
%244 = load i16, i16* %243
%245 = zext i16 %244 to i32
%246 = load i32, i32* %8
%247 = add i32 %246, %245
store i32 %247, i32* %8
%248 = load i16*, i16** %5
%249 = getelementptr inbounds i16, i16* %248, i64 4
store i16* %249, i16** %5
%250 = load i32, i32* %6
%251 = sub nsw i32 %250, 8
store i32 %251, i32* %6
br label %220
252: ; preds = %220
br label %253
253: ; preds = %256, %252
%254 = load i32, i32* %6
%255 = icmp sgt i32 %254, 1
br i1 %255, label %256, label %265
256: ; preds = %253
%257 = load i16*, i16** %5
%258 = getelementptr inbounds i16, i16* %257, i32 1
store i16* %258, i16** %5
%259 = load i16, i16* %257
%260 = zext i16 %259 to i32
%261 = load i32, i32* %8
%262 = add i32 %261, %260
store i32 %262, i32* %8
%263 = load i32, i32* %6
%264 = sub nsw i32 %263, 2
store i32 %264, i32* %6
br label %253
265: ; preds = %253
%266 = load i32, i32* %6
%267 = icmp eq i32 %266, 1
br i1 %267, label %268, label %277
268: ; preds = %265
%269 = load i16*, i16** %5
%270 = bitcast i16* %269 to i8*
%271 = load i8, i8* %270
%272 = bitcast i16* %7 to i8*
store i8 %271, i8* %272
%273 = load i16, i16* %7
%274 = zext i16 %273 to i32
%275 = load i32, i32* %8
%276 = add i32 %275, %274
store i32 %276, i32* %8
br label %277
277: ; preds = %268, %265
%278 = load i32, i32* %8
%279 = lshr i32 %278, 16
%280 = load i32, i32* %8
%281 = and i32 %280, 65535
%282 = add i32 %279, %281
store i32 %282, i32* %8
%283 = load i32, i32* %8
%284 = lshr i32 %283, 16
%285 = load i32, i32* %8
%286 = add i32 %285, %284
store i32 %286, i32* %8
%287 = load i32, i32* %8
%288 = xor i32 %287, -1
%289 = trunc i32 %288 to i16
ret i16 %289
}

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