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

/* Variables and functions */
double sumpw(const int64_t N, const double *X, const int64_t stride,
             int64_t *n) {
  double *xp1;
  double *xp2;
  double sum;
  int64_t ix;
  int64_t M;
  int64_t m;
  int64_t i;
  double s0;
  double s1;
  double s2;
  double s3;
  double s4;
  double s5;
  double s6;
  double s7;
  double v;
  if (N <= 0) {
    return 0.0;
  }
  if (N == 1 || stride == 0) {
    v = X[0];
    if (v == v) {
      *n += 1;
      return v;
    }
    return 0.0;
  }
  if (stride < 0) {
    ix = (1 - N) * stride;
  } else {
    ix = 0;
  }
  if (N < 8) {
    sum = 0.0;
    for (i = 0; i < N; i++) {
      v = X[ix];
      if (v == v) {
        sum += v;
        *n += 1;
      }
      ix += stride;
    }
    return sum;
  }
  if (N <= 128) {
    s0 = 0.0;
    s1 = 0.0;
    s2 = 0.0;
    s3 = 0.0;
    s4 = 0.0;
    s5 = 0.0;
    s6 = 0.0;
    s7 = 0.0;
    M = N % 8;
    for (i = 0; i < N - M; i += 8) {
      v = X[ix];
      if (v == v) {
        s0 += v;
        *n += 1;
      }
      ix += stride;
      v = X[ix];
      if (v == v) {
        s1 += v;
        *n += 1;
      }
      ix += stride;
      v = X[ix];
      if (v == v) {
        s2 += v;
        *n += 1;
      }
      ix += stride;
      v = X[ix];
      if (v == v) {
        s3 += v;
        *n += 1;
      }
      ix += stride;
      v = X[ix];
      if (v == v) {
        s4 += v;
        *n += 1;
      }
      ix += stride;
      v = X[ix];
      if (v == v) {
        s5 += v;
        *n += 1;
      }
      ix += stride;
      v = X[ix];
      if (v == v) {
        s6 += v;
        *n += 1;
      }
      ix += stride;
      v = X[ix];
      if (v == v) {
        s7 += v;
        *n += 1;
      }
      ix += stride;
    }
    sum = ((s0 + s1) + (s2 + s3)) + ((s4 + s5) + (s6 + s7));
    for (; i < N; i++) {
      v = X[ix];
      if (v == v) {
        sum += v;
        *n += 1;
      }
      ix += stride;
    }
    return sum;
  }
  m = N / 2;
  m -= m % 8;
  if (stride < 0) {
    xp1 = (double *)X + ((m - N) * stride);
    xp2 = (double *)X;
  } else {
    xp1 = (double *)X;
    xp2 = (double *)X + (m * stride);
  }
  return sumpw(m, xp1, stride, n) + sumpw(N - m, xp2, stride, n);
}


x86 assembly (clang, -O0):
<sumpw>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
mov    %edi,-0xc(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
cmpl   $0x0,-0xc(%rbp)
jg     1140 <sumpw+0x30>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    172c <sumpw+0x61c>
cmpl   $0x1,-0xc(%rbp)
je     1154 <sumpw+0x44>
cmpl   $0x0,-0x1c(%rbp)
jne    11aa <sumpw+0x9a>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
ucomisd -0x98(%rbp),%xmm0
ff
jne    119d <sumpw+0x8d>
jp     119d <sumpw+0x8d>
mov    -0x28(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
movsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x8(%rbp)
jmp    172c <sumpw+0x61c>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    172c <sumpw+0x61c>
cmpl   $0x0,-0x1c(%rbp)
jge    11c8 <sumpw+0xb8>
mov    $0x1,%eax
sub    -0xc(%rbp),%eax
imul   -0x1c(%rbp),%eax
mov    %eax,-0x44(%rbp)
jmp    11cf <sumpw+0xbf>
movl   $0x0,-0x44(%rbp)
cmpl   $0x8,-0xc(%rbp)
jge    1268 <sumpw+0x158>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x50(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1259 <sumpw+0x149>
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
ucomisd -0x98(%rbp),%xmm0
ff
jne    1242 <sumpw+0x132>
jp     1242 <sumpw+0x132>
movsd  -0x98(%rbp),%xmm0
ff
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x1c(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    11e8 <sumpw+0xd8>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    172c <sumpw+0x61c>
cmpl   $0x80,-0xc(%rbp)
jg     1672 <sumpw+0x562>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x80(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0xc(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    %edx,-0x48(%rbp)
movl   $0x0,-0x50(%rbp)
mov    -0x50(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    -0x48(%rbp),%ecx
cmp    %ecx,%eax
jge    15b3 <sumpw+0x4a3>
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
ucomisd -0x98(%rbp),%xmm0
ff
jne    132f <sumpw+0x21f>
jp     132f <sumpw+0x21f>
movsd  -0x98(%rbp),%xmm0
ff
addsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x1c(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
ucomisd -0x98(%rbp),%xmm0
ff
jne    1386 <sumpw+0x276>
jp     1386 <sumpw+0x276>
movsd  -0x98(%rbp),%xmm0
ff
addsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x1c(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
ucomisd -0x98(%rbp),%xmm0
ff
jne    13dd <sumpw+0x2cd>
jp     13dd <sumpw+0x2cd>
movsd  -0x98(%rbp),%xmm0
ff
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x1c(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
ucomisd -0x98(%rbp),%xmm0
ff
jne    1434 <sumpw+0x324>
jp     1434 <sumpw+0x324>
movsd  -0x98(%rbp),%xmm0
ff
addsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x1c(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
ucomisd -0x98(%rbp),%xmm0
ff
jne    148b <sumpw+0x37b>
jp     148b <sumpw+0x37b>
movsd  -0x98(%rbp),%xmm0
ff
addsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x1c(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
ucomisd -0x98(%rbp),%xmm0
ff
jne    14e2 <sumpw+0x3d2>
jp     14e2 <sumpw+0x3d2>
movsd  -0x98(%rbp),%xmm0
ff
addsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x1c(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
ucomisd -0x98(%rbp),%xmm0
ff
jne    153f <sumpw+0x42f>
jp     153f <sumpw+0x42f>
movsd  -0x98(%rbp),%xmm0
ff
addsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x28(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x1c(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
ucomisd -0x98(%rbp),%xmm0
ff
jne    159c <sumpw+0x48c>
jp     159c <sumpw+0x48c>
movsd  -0x98(%rbp),%xmm0
ff
addsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x28(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x1c(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x50(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x50(%rbp)
jmp    12d0 <sumpw+0x1c0>
movsd  -0x58(%rbp),%xmm0
addsd  -0x60(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm1
addsd  -0x70(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x78(%rbp),%xmm1
addsd  -0x80(%rbp),%xmm1
movsd  -0x88(%rbp),%xmm2
ff
addsd  -0x90(%rbp),%xmm2
ff
addsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1663 <sumpw+0x553>
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
ucomisd -0x98(%rbp),%xmm0
ff
jne    164c <sumpw+0x53c>
jp     164c <sumpw+0x53c>
movsd  -0x98(%rbp),%xmm0
ff
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x1c(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    15f2 <sumpw+0x4e2>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    172c <sumpw+0x61c>
mov    -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    -0x4c(%rbp),%eax
sub    %edx,%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jge    16c6 <sumpw+0x5b6>
mov    -0x18(%rbp),%rax
mov    -0x4c(%rbp),%ecx
sub    -0xc(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
jmp    16e7 <sumpw+0x5d7>
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x4c(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x4c(%rbp),%edi
mov    -0x30(%rbp),%rsi
mov    -0x1c(%rbp),%edx
mov    -0x28(%rbp),%rcx
call   1030 <sumpw@plt>
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0xc(%rbp),%edi
sub    -0x4c(%rbp),%edi
mov    -0x38(%rbp),%rsi
mov    -0x1c(%rbp),%edx
mov    -0x28(%rbp),%rcx
call   1030 <sumpw@plt>
movaps %xmm0,%xmm1
movsd  -0xa0(%rbp),%xmm0
ff
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0xa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sumpw>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
xorpd  %xmm0,%xmm0
test   %edi,%edi
jle    14d7 <sumpw+0x3c7>
mov    %rcx,%r14
mov    %rsi,%rbx
mov    %edi,%r15d
cmp    $0x1,%edi
je     1249 <sumpw+0x139>
mov    %edx,%ebp
test   %edx,%edx
je     1249 <sumpw+0x139>
mov    $0x1,%eax
sub    %r15d,%eax
imul   %ebp,%eax
mov    %ebp,%ecx
sar    $0x1f,%ecx
and    %eax,%ecx
cmp    $0x7,%r15d
ja     1264 <sumpw+0x154>
movslq %ecx,%rax
movsd  (%rbx,%rax,8),%xmm0
ucomisd %xmm0,%xmm0
jp     14e6 <sumpw+0x3d6>
xorpd  %xmm1,%xmm1
addsd  %xmm1,%xmm0
addl   $0x1,(%r14)
cmp    $0x1,%r15d
je     14d7 <sumpw+0x3c7>
movslq %ebp,%rcx
add    %rcx,%rax
movsd  (%rbx,%rax,8),%xmm1
ucomisd %xmm1,%xmm1
jp     11a0 <sumpw+0x90>
addsd  %xmm1,%xmm0
addl   $0x1,(%r14)
cmp    $0x2,%r15d
je     14d7 <sumpw+0x3c7>
add    %rcx,%rax
movsd  (%rbx,%rax,8),%xmm1
ucomisd %xmm1,%xmm1
jp     11c0 <sumpw+0xb0>
addsd  %xmm1,%xmm0
addl   $0x1,(%r14)
cmp    $0x3,%r15d
je     14d7 <sumpw+0x3c7>
add    %rcx,%rax
movsd  (%rbx,%rax,8),%xmm1
ucomisd %xmm1,%xmm1
jp     11e0 <sumpw+0xd0>
addsd  %xmm1,%xmm0
addl   $0x1,(%r14)
cmp    $0x4,%r15d
je     14d7 <sumpw+0x3c7>
add    %rcx,%rax
movsd  (%rbx,%rax,8),%xmm1
ucomisd %xmm1,%xmm1
jp     1200 <sumpw+0xf0>
addsd  %xmm1,%xmm0
addl   $0x1,(%r14)
cmp    $0x5,%r15d
je     14d7 <sumpw+0x3c7>
add    %rcx,%rax
movsd  (%rbx,%rax,8),%xmm1
ucomisd %xmm1,%xmm1
jp     1220 <sumpw+0x110>
addsd  %xmm1,%xmm0
addl   $0x1,(%r14)
cmp    $0x6,%r15d
je     14d7 <sumpw+0x3c7>
add    %rcx,%rax
movsd  (%rbx,%rax,8),%xmm1
ucomisd %xmm1,%xmm1
jp     14d7 <sumpw+0x3c7>
addsd  %xmm1,%xmm0
addl   $0x1,(%r14)
jmp    14d7 <sumpw+0x3c7>
movsd  (%rbx),%xmm1
ucomisd %xmm1,%xmm1
jp     14d7 <sumpw+0x3c7>
addl   $0x1,(%r14)
movapd %xmm1,%xmm0
jmp    14d7 <sumpw+0x3c7>
cmp    $0x80,%r15d
ja     13e6 <sumpw+0x2d6>
mov    %r15d,%r8d
and    $0xfffffff8,%r8d
je     140c <sumpw+0x2fc>
lea    0x0(,%rbp,8),%edx
sub    %ebp,%edx
lea    0x0(%rbp,%rbp,1),%r12d
lea    (%r12,%r12,2),%r9d
lea    0x0(%rbp,%rbp,4),%r10d
lea    0x0(,%rbp,4),%r11d
lea    0x0(%rbp,%rbp,2),%r13d
xor    %edi,%edi
xorpd  %xmm8,%xmm8
xorpd  %xmm3,%xmm3
xorpd  %xmm5,%xmm5
xorpd  %xmm6,%xmm6
xorpd  %xmm1,%xmm1
xorpd  %xmm4,%xmm4
xorpd  %xmm2,%xmm2
xorpd  %xmm7,%xmm7
cs nopw 0x0(%rax,%rax,1)
nop
movslq %ecx,%rsi
movsd  (%rbx,%rsi,8),%xmm0
ucomisd %xmm0,%xmm0
jp     12e6 <sumpw+0x1d6>
addsd  %xmm0,%xmm7
addl   $0x1,(%r14)
lea    (%rcx,%rbp,1),%esi
movslq %esi,%rax
movsd  (%rbx,%rax,8),%xmm0
ucomisd %xmm0,%xmm0
jp     12ff <sumpw+0x1ef>
addsd  %xmm0,%xmm2
addl   $0x1,(%r14)
add    %ebp,%esi
lea    (%r12,%rcx,1),%eax
cltq
movsd  (%rbx,%rax,8),%xmm0
ucomisd %xmm0,%xmm0
jp     131a <sumpw+0x20a>
addsd  %xmm0,%xmm4
addl   $0x1,(%r14)
add    %ebp,%esi
lea    (%rcx,%r13,1),%eax
cltq
movsd  (%rbx,%rax,8),%xmm0
ucomisd %xmm0,%xmm0
jp     1335 <sumpw+0x225>
addsd  %xmm0,%xmm1
addl   $0x1,(%r14)
add    %ebp,%esi
lea    (%r11,%rcx,1),%eax
cltq
movsd  (%rbx,%rax,8),%xmm0
ucomisd %xmm0,%xmm0
jp     1350 <sumpw+0x240>
addsd  %xmm0,%xmm6
addl   $0x1,(%r14)
add    %ebp,%esi
lea    (%r10,%rcx,1),%eax
cltq
movsd  (%rbx,%rax,8),%xmm0
ucomisd %xmm0,%xmm0
jp     136b <sumpw+0x25b>
addsd  %xmm0,%xmm5
addl   $0x1,(%r14)
add    %ebp,%esi
lea    (%r9,%rcx,1),%eax
cltq
movsd  (%rbx,%rax,8),%xmm0
ucomisd %xmm0,%xmm0
jp     1386 <sumpw+0x276>
addsd  %xmm0,%xmm3
addl   $0x1,(%r14)
add    %ebp,%esi
add    %edx,%ecx
movslq %ecx,%rax
movsd  (%rbx,%rax,8),%xmm0
ucomisd %xmm0,%xmm0
jp     13a1 <sumpw+0x291>
addsd  %xmm0,%xmm8
addl   $0x1,(%r14)
add    %ebp,%esi
add    $0x8,%edi
mov    %esi,%ecx
cmp    %r8d,%edi
jl     12d0 <sumpw+0x1c0>
unpcklpd %xmm6,%xmm7
unpcklpd %xmm5,%xmm2
addpd  %xmm7,%xmm2
unpcklpd %xmm3,%xmm4
unpcklpd %xmm8,%xmm1
addpd  %xmm4,%xmm1
addpd  %xmm2,%xmm1
movapd %xmm1,%xmm0
unpckhpd %xmm1,%xmm0
addsd  %xmm1,%xmm0
mov    %esi,%ecx
cmp    %r15d,%r8d
jl     141c <sumpw+0x30c>
jmp    14d7 <sumpw+0x3c7>
mov    %r15d,%r12d
shr    %r12d
and    $0xfffffff8,%r12d
mov    %r12d,%eax
test   %ebp,%ebp
js     14a1 <sumpw+0x391>
imul   %ebp,%eax
cltq
mov    %rbx,%rsi
lea    (%rbx,%rax,8),%rbx
jmp    14ad <sumpw+0x39d>
xor    %r8d,%r8d
xorpd  %xmm0,%xmm0
cmp    %r15d,%r8d
jge    14d7 <sumpw+0x3c7>
movslq %ecx,%rax
movslq %ebp,%rdx
mov    %r8d,%ecx
not    %ecx
test   $0x1,%r15b
je     1447 <sumpw+0x337>
movsd  (%rbx,%rax,8),%xmm1
ucomisd %xmm1,%xmm1
jp     1440 <sumpw+0x330>
addsd  %xmm1,%xmm0
addl   $0x1,(%r14)
add    %rdx,%rax
or     $0x1,%r8d
add    %r15d,%ecx
je     14d7 <sumpw+0x3c7>
mov    %rdx,%rcx
shl    $0x4,%rcx
shl    $0x3,%rdx
lea    (%rdx,%rax,8),%rdx
shl    $0x3,%rax
sub    %r8d,%r15d
cs nopw 0x0(%rax,%rax,1)
movsd  (%rbx,%rax,1),%xmm1
ucomisd %xmm1,%xmm1
jp     1483 <sumpw+0x373>
addsd  %xmm1,%xmm0
addl   $0x1,(%r14)
movsd  (%rbx,%rdx,1),%xmm1
ucomisd %xmm1,%xmm1
jp     1496 <sumpw+0x386>
addsd  %xmm1,%xmm0
addl   $0x1,(%r14)
add    %rcx,%rbx
add    $0xfffffffe,%r15d
jne    1470 <sumpw+0x360>
jmp    14d7 <sumpw+0x3c7>
sub    %r15d,%eax
imul   %ebp,%eax
cltq
lea    (%rbx,%rax,8),%rsi
mov    %r12d,%edi
mov    %ebp,%edx
mov    %r14,%rcx
call   1030 <sumpw@plt>
movsd  %xmm0,(%rsp)
sub    %r12d,%r15d
mov    %r15d,%edi
mov    %rbx,%rsi
mov    %ebp,%edx
mov    %r14,%rcx
call   1030 <sumpw@plt>
addsd  (%rsp),%xmm0
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xorpd  %xmm0,%xmm0
cmp    $0x1,%r15d
jne    1187 <sumpw+0x77>
jmp    14d7 <sumpw+0x3c7>

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

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