#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 uint8_t;

/* Variables and functions */
double hllDenseSum(uint8_t *registers, double *PE, int *ezp) {
  double E = 0;
  int j, ez = 0;
  if ((1 << 14) == 16384 && 6 == 6) {
    uint8_t *r = registers;
    unsigned long r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13,
        r14, r15;
    for (j = 0; j < 1024; j++) {
      r0 = r[0] & 63;
      if (r0 == 0)
        ez++;
      r1 = (r[0] >> 6 | r[1] << 2) & 63;
      if (r1 == 0)
        ez++;
      r2 = (r[1] >> 4 | r[2] << 4) & 63;
      if (r2 == 0)
        ez++;
      r3 = (r[2] >> 2) & 63;
      if (r3 == 0)
        ez++;
      r4 = r[3] & 63;
      if (r4 == 0)
        ez++;
      r5 = (r[3] >> 6 | r[4] << 2) & 63;
      if (r5 == 0)
        ez++;
      r6 = (r[4] >> 4 | r[5] << 4) & 63;
      if (r6 == 0)
        ez++;
      r7 = (r[5] >> 2) & 63;
      if (r7 == 0)
        ez++;
      r8 = r[6] & 63;
      if (r8 == 0)
        ez++;
      r9 = (r[6] >> 6 | r[7] << 2) & 63;
      if (r9 == 0)
        ez++;
      r10 = (r[7] >> 4 | r[8] << 4) & 63;
      if (r10 == 0)
        ez++;
      r11 = (r[8] >> 2) & 63;
      if (r11 == 0)
        ez++;
      r12 = r[9] & 63;
      if (r12 == 0)
        ez++;
      r13 = (r[9] >> 6 | r[10] << 2) & 63;
      if (r13 == 0)
        ez++;
      r14 = (r[10] >> 4 | r[11] << 4) & 63;
      if (r14 == 0)
        ez++;
      r15 = (r[11] >> 2) & 63;
      if (r15 == 0)
        ez++;
      E += (PE[r0] + PE[r1]) + (PE[r2] + PE[r3]) + (PE[r4] + PE[r5]) +
           (PE[r6] + PE[r7]) + (PE[r8] + PE[r9]) + (PE[r10] + PE[r11]) +
           (PE[r12] + PE[r13]) + (PE[r14] + PE[r15]);
      r += 12;
    }
  } else {
    for (j = 0; j < (1 << 14); j++) {
      unsigned long reg;
      do {
        uint8_t *_p = (uint8_t *)registers;
        unsigned long _byte = j * 6 / 8;
        unsigned long _fb = j * 6 & 7;
        unsigned long _fb8 = 8 - _fb;
        unsigned long b0 = _p[_byte];
        unsigned long b1 = _p[_byte + 1];
        reg = ((b0 >> _fb) | (b1 << _fb8)) & ((1 << 6) - 1);
      } while (0);
      if (reg == 0) {
        ez++;
      } else {
        E += PE[reg];
      }
    }
    E += ez;
  }
  *ezp = ez;
  return E;
}


x86 assembly (clang, -O0):
<hllDenseSum>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x30(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x400,-0x24(%rbp)
jge    1547 <hllDenseSum+0x447>
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
cltq
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
jne    1162 <hllDenseSum+0x62>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
sar    $0x6,%eax
mov    -0x30(%rbp),%rcx
mov    0x4(%rcx),%ecx
shl    $0x2,%ecx
or     %ecx,%eax
and    $0x3f,%eax
cltq
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x40(%rbp)
jne    1194 <hllDenseSum+0x94>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0x4(%rax),%eax
sar    $0x4,%eax
mov    -0x30(%rbp),%rcx
mov    0x8(%rcx),%ecx
shl    $0x4,%ecx
or     %ecx,%eax
and    $0x3f,%eax
cltq
mov    %rax,-0x48(%rbp)
cmpq   $0x0,-0x48(%rbp)
jne    11c7 <hllDenseSum+0xc7>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0x8(%rax),%eax
sar    $0x2,%eax
and    $0x3f,%eax
cltq
mov    %rax,-0x50(%rbp)
cmpq   $0x0,-0x50(%rbp)
jne    11ee <hllDenseSum+0xee>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0xc(%rax),%eax
and    $0x3f,%eax
cltq
mov    %rax,-0x58(%rbp)
cmpq   $0x0,-0x58(%rbp)
jne    1212 <hllDenseSum+0x112>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0xc(%rax),%eax
sar    $0x6,%eax
mov    -0x30(%rbp),%rcx
mov    0x10(%rcx),%ecx
shl    $0x2,%ecx
or     %ecx,%eax
and    $0x3f,%eax
cltq
mov    %rax,-0x60(%rbp)
cmpq   $0x0,-0x60(%rbp)
jne    1245 <hllDenseSum+0x145>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0x10(%rax),%eax
sar    $0x4,%eax
mov    -0x30(%rbp),%rcx
mov    0x14(%rcx),%ecx
shl    $0x4,%ecx
or     %ecx,%eax
and    $0x3f,%eax
cltq
mov    %rax,-0x68(%rbp)
cmpq   $0x0,-0x68(%rbp)
jne    1278 <hllDenseSum+0x178>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0x14(%rax),%eax
sar    $0x2,%eax
and    $0x3f,%eax
cltq
mov    %rax,-0x70(%rbp)
cmpq   $0x0,-0x70(%rbp)
jne    129f <hllDenseSum+0x19f>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0x18(%rax),%eax
and    $0x3f,%eax
cltq
mov    %rax,-0x78(%rbp)
cmpq   $0x0,-0x78(%rbp)
jne    12c3 <hllDenseSum+0x1c3>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0x18(%rax),%eax
sar    $0x6,%eax
mov    -0x30(%rbp),%rcx
mov    0x1c(%rcx),%ecx
shl    $0x2,%ecx
or     %ecx,%eax
and    $0x3f,%eax
cltq
mov    %rax,-0x80(%rbp)
cmpq   $0x0,-0x80(%rbp)
jne    12f6 <hllDenseSum+0x1f6>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0x1c(%rax),%eax
sar    $0x4,%eax
mov    -0x30(%rbp),%rcx
mov    0x20(%rcx),%ecx
shl    $0x4,%ecx
or     %ecx,%eax
and    $0x3f,%eax
cltq
mov    %rax,-0x88(%rbp)
cmpq   $0x0,-0x88(%rbp)
jne    132f <hllDenseSum+0x22f>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0x20(%rax),%eax
sar    $0x2,%eax
and    $0x3f,%eax
cltq
mov    %rax,-0x90(%rbp)
cmpq   $0x0,-0x90(%rbp)
jne    135c <hllDenseSum+0x25c>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0x24(%rax),%eax
and    $0x3f,%eax
cltq
mov    %rax,-0x98(%rbp)
cmpq   $0x0,-0x98(%rbp)
jne    1386 <hllDenseSum+0x286>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0x24(%rax),%eax
sar    $0x6,%eax
mov    -0x30(%rbp),%rcx
mov    0x28(%rcx),%ecx
shl    $0x2,%ecx
or     %ecx,%eax
and    $0x3f,%eax
cltq
mov    %rax,-0xa0(%rbp)
cmpq   $0x0,-0xa0(%rbp)
jne    13bf <hllDenseSum+0x2bf>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0x28(%rax),%eax
sar    $0x4,%eax
mov    -0x30(%rbp),%rcx
mov    0x2c(%rcx),%ecx
shl    $0x4,%ecx
or     %ecx,%eax
and    $0x3f,%eax
cltq
mov    %rax,-0xa8(%rbp)
cmpq   $0x0,-0xa8(%rbp)
jne    13f8 <hllDenseSum+0x2f8>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    0x2c(%rax),%eax
sar    $0x2,%eax
and    $0x3f,%eax
cltq
mov    %rax,-0xb0(%rbp)
cmpq   $0x0,-0xb0(%rbp)
jne    1425 <hllDenseSum+0x325>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x50(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm1
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x58(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x60(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm1
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x68(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x70(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm1
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x78(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x80(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm1
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x88(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x90(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm1
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x98(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
mov    -0xa0(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm1
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0xa8(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
mov    -0xb0(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm1
addsd  %xmm1,%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x30(%rbp),%rax
add    $0x30,%rax
mov    %rax,-0x30(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1132 <hllDenseSum+0x32>
mov    -0x28(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
movsd  -0x20(%rbp),%xmm0
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<hllDenseSum>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rdx,-0x30(%rsp)
mov    %rsi,%r13
mov    %rdi,-0x28(%rsp)
xor    %r10d,%r10d
xorpd  %xmm0,%xmm0
xor    %ecx,%ecx
mov    -0x28(%rsp),%r11
mov    (%r11,%r10,1),%r9d
mov    %r9d,%eax
and    $0x3f,%eax
mov    %rax,-0x40(%rsp)
cmp    $0x1,%rax
adc    $0x0,%ecx
mov    0x4(%r11,%r10,1),%edx
lea    0x0(,%rdx,4),%eax
shr    $0x6,%r9d
or     %eax,%r9d
and    $0x3f,%r9d
cmp    $0x1,%r9
adc    $0x0,%ecx
mov    0x8(%r11,%r10,1),%eax
mov    %rax,-0x48(%rsp)
shl    $0x4,%eax
shr    $0x4,%edx
or     %eax,%edx
mov    %rdx,-0x10(%rsp)
mov    0xc(%r11,%r10,1),%esi
mov    %esi,%eax
mov    %rax,-0x8(%rsp)
mov    0x10(%r11,%r10,1),%edx
lea    0x0(,%rdx,4),%eax
shr    $0x6,%esi
or     %eax,%esi
mov    0x14(%r11,%r10,1),%ebp
mov    %ebp,%eax
shl    $0x4,%eax
shr    $0x4,%edx
or     %eax,%edx
mov    %rdx,%r14
mov    0x18(%r11,%r10,1),%ebx
mov    %ebx,%eax
mov    %rax,-0x18(%rsp)
mov    0x1c(%r11,%r10,1),%r8d
lea    0x0(,%r8,4),%eax
shr    $0x6,%ebx
or     %eax,%ebx
mov    0x20(%r11,%r10,1),%eax
mov    %rax,-0x38(%rsp)
shl    $0x4,%eax
shr    $0x4,%r8d
or     %eax,%r8d
mov    0x24(%r11,%r10,1),%eax
mov    %eax,%edx
mov    %rdx,-0x20(%rsp)
mov    0x28(%r11,%r10,1),%r15d
shr    $0x6,%eax
lea    0x0(,%r15,4),%edx
or     %edx,%eax
mov    0x2c(%r11,%r10,1),%edx
mov    %edx,%r11d
shl    $0x4,%r11d
shr    $0x4,%r15d
or     %r11d,%r15d
mov    -0x40(%rsp),%rdi
movsd  0x0(%r13,%rdi,8),%xmm8
addsd  0x0(%r13,%r9,8),%xmm8
mov    -0x10(%rsp),%r11
and    $0x3f,%r11d
mov    -0x48(%rsp),%r12
shr    $0x2,%r12d
and    $0x3f,%r12d
mov    -0x8(%rsp),%r9
and    $0x3f,%r9d
and    $0x3f,%esi
mov    %rsi,-0x48(%rsp)
and    $0x3f,%r14d
mov    %r14,-0x40(%rsp)
shr    $0x2,%ebp
and    $0x3f,%ebp
mov    -0x18(%rsp),%rdi
and    $0x3f,%edi
and    $0x3f,%ebx
and    $0x3f,%r8d
mov    -0x38(%rsp),%rsi
shr    $0x2,%esi
and    $0x3f,%esi
mov    %rsi,-0x38(%rsp)
mov    -0x20(%rsp),%r14
and    $0x3f,%r14d
and    $0x3f,%eax
and    $0x3f,%r15d
shr    $0x2,%edx
and    $0x3f,%edx
cmp    $0x1,%r12d
adc    $0x0,%ecx
cmp    $0x1,%r9
adc    $0x0,%ecx
cmp    $0x1,%r11
movsd  0x0(%r13,%r11,8),%xmm2
addsd  0x0(%r13,%r12,8),%xmm2
movsd  0x0(%r13,%r9,8),%xmm3
adc    $0x0,%ecx
mov    -0x48(%rsp),%rsi
cmp    $0x1,%rsi
addsd  0x0(%r13,%rsi,8),%xmm3
adc    $0x0,%ecx
cmp    $0x1,%ebp
adc    $0x0,%ecx
mov    %rdi,%r9
cmp    $0x1,%rdi
adc    $0x0,%ecx
mov    -0x40(%rsp),%rdi
cmp    $0x1,%rdi
movsd  0x0(%r13,%rdi,8),%xmm4
addsd  0x0(%r13,%rbp,8),%xmm4
movsd  0x0(%r13,%r9,8),%xmm5
adc    $0x0,%ecx
cmp    $0x1,%rbx
addsd  0x0(%r13,%rbx,8),%xmm5
adc    $0x0,%ecx
mov    -0x38(%rsp),%rdi
cmp    $0x1,%edi
adc    $0x0,%ecx
mov    %r14,%rbp
cmp    $0x1,%r14
adc    $0x0,%ecx
cmp    $0x1,%r8
movsd  0x0(%r13,%r8,8),%xmm6
addsd  0x0(%r13,%rdi,8),%xmm6
movsd  0x0(%r13,%r14,8),%xmm7
adc    $0x0,%ecx
cmp    $0x1,%rax
addsd  0x0(%r13,%rax,8),%xmm7
adc    $0x0,%ecx
cmp    $0x1,%edx
adc    $0x0,%ecx
cmp    $0x1,%r15
movsd  0x0(%r13,%r15,8),%xmm1
addsd  0x0(%r13,%rdx,8),%xmm1
addsd  %xmm8,%xmm2
addsd  %xmm2,%xmm3
addsd  %xmm3,%xmm4
addsd  %xmm4,%xmm5
addsd  %xmm5,%xmm6
addsd  %xmm6,%xmm7
adc    $0x0,%ecx
addsd  %xmm7,%xmm1
addsd  %xmm1,%xmm0
add    $0x30,%r10
cmp    $0xc000,%r10d
jne    1120 <hllDenseSum+0x20>
mov    -0x30(%rsp),%rax
mov    %ecx,(%rax)
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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