#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 */

/* Variables and functions */
double fabs(double);
double EstimateKmeans(double *src, unsigned char *label, unsigned char *mask,
                      int n_classes, double *mean, int ni, int *dims,
                      int thresh_mask, int thresh_kmeans, double max_src) {
  int i, j, j0, v;
  int count;
  long histo[256], lut[256], cumsum[256], vol;
  double diff, dmin, dx, xnorm, sum;
  vol = dims[0] * dims[1] * dims[2];
  for (i = 0; i < 256; i++)
    histo[i] = 0;
  for (i = 0; i < vol; i++) {
    v = (int)((long)((255.0 * src[i] / max_src) +
                     (((255.0 * src[i] / max_src) >= 0) ? 0.5 : (-0.5))));
    if (v < 1)
      continue;
    if ((thresh_mask > 0) && ((int)mask[i] < thresh_kmeans))
      continue;
    if (v < 0)
      v = 0;
    if (v > 255)
      v = 255;
    histo[v]++;
  }
  cumsum[0] = histo[0];
  for (i = 1; i < 256; i++)
    cumsum[i] = cumsum[i - 1] + histo[i];
  for (i = 0; i < 256; i++)
    cumsum[i] =
        (long)((long)((1000.0 * (double)cumsum[i] / (double)cumsum[255]) +
                      (((1000.0 * (double)cumsum[i] / (double)cumsum[255]) >= 0)
                           ? 0.5
                           : (-0.5))));
  for (i = 0; i < 256; i++)
    if ((cumsum[i] <= 10) || (cumsum[i] >= 990))
      histo[i] = 0;
  diff = 1e15;
  count = 0;
  while (diff > 1.0 && count < ni) {
    for (i = 0; i < 256; i++) {
      dmin = 256.0 * 256.0;
      for (j = 0; j < n_classes; j++) {
        dx = (double)i - mean[j];
        dx *= dx;
        if (dx < dmin) {
          lut[i] = j;
          dmin = dx;
        }
      }
    }
    diff = 0;
    for (i = 0; i < n_classes; i++) {
      xnorm = 0.0;
      sum = 0.0;
      for (j = 0; j < 256; j++)
        if (lut[j] == i) {
          xnorm += histo[j];
          sum += j * histo[j];
        }
      sum = xnorm > 0 ? sum /= xnorm : 0.0;
      dx = sum - mean[i];
      mean[i] = sum;
      dx *= dx;
      diff += dx;
    }
    count++;
  }
  for (i = 0; i < 256; i++) {
    dmin = 1e15;
    j0 = 0;
    for (j = 0; j < n_classes; j++) {
      if (fabs((double)i - mean[j]) < dmin) {
        dmin = fabs((double)i - mean[j]);
        j0 = j;
      }
    }
    lut[i] = j0;
  }
  lut[0] = 0;
  diff = 0;
  for (i = 0; i < vol; i++) {
    v = (int)((long)((255.0 * src[i] / max_src) +
                     (((255.0 * src[i] / max_src) >= 0) ? 0.5 : (-0.5))));
    if (v >= 1) {
      if (v < 0)
        v = 0;
      if (v > 255)
        v = 255;
      label[i] = (unsigned char)(lut[v] + 1);
      diff += (((double)v - mean[lut[v]]) * ((double)v - mean[lut[v]]));
      if ((thresh_mask > 0) && ((int)mask[i] < thresh_mask))
        label[i] = 0;
    } else
      label[i] = 0;
  }
  return (diff);
}


x86 assembly (clang, -O0):
<EstimateKmeans>:
push   %rbp
mov    %rsp,%rbp
sub    $0x1810,%rsp
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
movsd  %xmm0,-0x38(%rbp)
mov    0x10(%rbp),%rax
mov    (%rax),%eax
mov    0x10(%rbp),%rcx
imul   0x4(%rcx),%eax
mov    0x10(%rbp),%rcx
imul   0x8(%rcx),%eax
cltq
mov    %rax,-0x1858(%rbp)
movl   $0x0,-0x3c(%rbp)
cmpl   $0x100,-0x3c(%rbp)
jge    1182 <EstimateKmeans+0x82>
movslq -0x3c(%rbp),%rax
movq   $0x0,-0x850(%rbp,%rax,8)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1157 <EstimateKmeans+0x57>
movl   $0x0,-0x3c(%rbp)
movslq -0x3c(%rbp),%rax
cmp    -0x1858(%rbp),%rax
jge    127f <EstimateKmeans+0x17f>
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  0xe76(%rip),%xmm0
mulsd  (%rax,%rcx,8),%xmm0
divsd  -0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  0xe5c(%rip),%xmm2
mulsd  (%rax,%rcx,8),%xmm2
divsd  -0x38(%rbp),%xmm2
movsd  0xe3a(%rip),%xmm4
movsd  0xe3a(%rip),%xmm3
xorps  %xmm1,%xmm1
cmplesd %xmm2,%xmm1
movaps %xmm1,%xmm2
andpd  %xmm4,%xmm2
andnpd %xmm3,%xmm1
orpd   %xmm2,%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    %eax,-0x48(%rbp)
cmpl   $0x1,-0x48(%rbp)
jge    1210 <EstimateKmeans+0x110>
jmp    1271 <EstimateKmeans+0x171>
cmpl   $0x0,0x18(%rbp)
jle    1234 <EstimateKmeans+0x134>
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    0x20(%rbp),%eax
jge    1234 <EstimateKmeans+0x134>
jmp    1271 <EstimateKmeans+0x171>
cmpl   $0x0,-0x48(%rbp)
jge    1245 <EstimateKmeans+0x145>
movl   $0x0,-0x48(%rbp)
cmpl   $0xff,-0x48(%rbp)
jle    1259 <EstimateKmeans+0x159>
movl   $0xff,-0x48(%rbp)
movslq -0x48(%rbp),%rax
mov    -0x850(%rbp,%rax,8),%rcx
ff
add    $0x1,%rcx
mov    %rcx,-0x850(%rbp,%rax,8)
ff
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1189 <EstimateKmeans+0x89>
mov    -0x850(%rbp),%rax
mov    %rax,-0x1850(%rbp)
movl   $0x1,-0x3c(%rbp)
cmpl   $0x100,-0x3c(%rbp)
jge    12d7 <EstimateKmeans+0x1d7>
mov    -0x3c(%rbp),%eax
sub    $0x1,%eax
cltq
mov    -0x1850(%rbp,%rax,8),%rcx
ff
movslq -0x3c(%rbp),%rax
add    -0x850(%rbp,%rax,8),%rcx
ff
movslq -0x3c(%rbp),%rax
mov    %rcx,-0x1850(%rbp,%rax,8)
ff
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1294 <EstimateKmeans+0x194>
movl   $0x0,-0x3c(%rbp)
cmpl   $0x100,-0x3c(%rbp)
jge    1383 <EstimateKmeans+0x283>
movslq -0x3c(%rbp),%rax
cvtsi2sdq -0x1850(%rbp,%rax,8),%xmm1
e7 ff ff
movsd  0xd2f(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsi2sdq -0x1058(%rbp),%xmm1
ff ff
divsd  %xmm1,%xmm0
movslq -0x3c(%rbp),%rax
cvtsi2sdq -0x1850(%rbp,%rax,8),%xmm1
e7 ff ff
movsd  0xd08(%rip),%xmm2
mulsd  %xmm1,%xmm2
cvtsi2sdq -0x1058(%rbp),%xmm1
ff ff
divsd  %xmm1,%xmm2
movsd  0xccf(%rip),%xmm4
movsd  0xccf(%rip),%xmm3
xorps  %xmm1,%xmm1
cmplesd %xmm2,%xmm1
movaps %xmm1,%xmm2
andpd  %xmm4,%xmm2
andnpd %xmm3,%xmm1
orpd   %xmm2,%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rcx
movslq -0x3c(%rbp),%rax
mov    %rcx,-0x1850(%rbp,%rax,8)
ff
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    12de <EstimateKmeans+0x1de>
movl   $0x0,-0x3c(%rbp)
cmpl   $0x100,-0x3c(%rbp)
jge    13e3 <EstimateKmeans+0x2e3>
movslq -0x3c(%rbp),%rax
cmpq   $0xa,-0x1850(%rbp,%rax,8)
ff 0a
jle    13c0 <EstimateKmeans+0x2c0>
movslq -0x3c(%rbp),%rax
cmpq   $0x3de,-0x1850(%rbp,%rax,8)
jl     13d0 <EstimateKmeans+0x2d0>
movslq -0x3c(%rbp),%rax
movq   $0x0,-0x850(%rbp,%rax,8)
jmp    13d5 <EstimateKmeans+0x2d5>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    138a <EstimateKmeans+0x28a>
movsd  0xc15(%rip),%xmm0
movsd  %xmm0,-0x1860(%rbp)
ff
movl   $0x0,-0x4c(%rbp)
movsd  -0x1860(%rbp),%xmm0
ff
xor    %eax,%eax
movsd  0xbfc(%rip),%xmm1
ucomisd %xmm1,%xmm0
mov    %al,-0x1881(%rbp)
jbe    142b <EstimateKmeans+0x32b>
mov    -0x4c(%rbp),%eax
cmp    -0x2c(%rbp),%eax
setl   %al
mov    %al,-0x1881(%rbp)
mov    -0x1881(%rbp),%al
test   $0x1,%al
jne    143e <EstimateKmeans+0x33e>
jmp    169b <EstimateKmeans+0x59b>
movl   $0x0,-0x3c(%rbp)
cmpl   $0x100,-0x3c(%rbp)
jge    1507 <EstimateKmeans+0x407>
movsd  0xbce(%rip),%xmm0
movsd  %xmm0,-0x1868(%rbp)
ff
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    14f4 <EstimateKmeans+0x3f4>
cvtsi2sdl -0x3c(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x40(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x1870(%rbp)
ff
movsd  -0x1870(%rbp),%xmm0
ff
mulsd  -0x1870(%rbp),%xmm0
ff
movsd  %xmm0,-0x1870(%rbp)
ff
movsd  -0x1870(%rbp),%xmm1
ff
movsd  -0x1868(%rbp),%xmm0
ff
ucomisd %xmm1,%xmm0
jbe    14e1 <EstimateKmeans+0x3e1>
movslq -0x40(%rbp),%rcx
movslq -0x3c(%rbp),%rax
mov    %rcx,-0x1050(%rbp,%rax,8)
ff
movsd  -0x1870(%rbp),%xmm0
ff
movsd  %xmm0,-0x1868(%rbp)
ff
jmp    14e6 <EstimateKmeans+0x3e6>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1469 <EstimateKmeans+0x369>
jmp    14f9 <EstimateKmeans+0x3f9>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1445 <EstimateKmeans+0x345>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x1860(%rbp)
ff
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    168d <EstimateKmeans+0x58d>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x1878(%rbp)
ff
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x1880(%rbp)
ff
movl   $0x0,-0x40(%rbp)
cmpl   $0x100,-0x40(%rbp)
jge    15bf <EstimateKmeans+0x4bf>
movslq -0x40(%rbp),%rax
mov    -0x1050(%rbp,%rax,8),%rax
ff
movslq -0x3c(%rbp),%rcx
cmp    %rcx,%rax
jne    15ac <EstimateKmeans+0x4ac>
movslq -0x40(%rbp),%rax
cvtsi2sdq -0x850(%rbp,%rax,8),%xmm0
f7 ff ff
addsd  -0x1878(%rbp),%xmm0
ff
movsd  %xmm0,-0x1878(%rbp)
ff
movslq -0x40(%rbp),%rax
movslq -0x40(%rbp),%rcx
imul   -0x850(%rbp,%rcx,8),%rax
ff ff
cvtsi2sd %rax,%xmm0
addsd  -0x1880(%rbp),%xmm0
ff
movsd  %xmm0,-0x1880(%rbp)
ff
jmp    15b1 <EstimateKmeans+0x4b1>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1542 <EstimateKmeans+0x442>
movsd  -0x1878(%rbp),%xmm0
ff
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    15fd <EstimateKmeans+0x4fd>
movsd  -0x1878(%rbp),%xmm1
ff
movsd  -0x1880(%rbp),%xmm0
ff
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x1880(%rbp)
ff
movsd  %xmm0,-0x1890(%rbp)
ff
jmp    160d <EstimateKmeans+0x50d>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x1890(%rbp)
ff
jmp    160d <EstimateKmeans+0x50d>
movsd  -0x1890(%rbp),%xmm0
ff
movsd  %xmm0,-0x1880(%rbp)
ff
movsd  -0x1880(%rbp),%xmm0
ff
mov    -0x28(%rbp),%rax
movslq -0x3c(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x1870(%rbp)
ff
movsd  -0x1880(%rbp),%xmm0
ff
mov    -0x28(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x1870(%rbp),%xmm0
ff
mulsd  -0x1870(%rbp),%xmm0
ff
movsd  %xmm0,-0x1870(%rbp)
ff
movsd  -0x1870(%rbp),%xmm0
ff
addsd  -0x1860(%rbp),%xmm0
ff
movsd  %xmm0,-0x1860(%rbp)
ff
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1519 <EstimateKmeans+0x419>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    13fa <EstimateKmeans+0x2fa>
movl   $0x0,-0x3c(%rbp)
cmpl   $0x100,-0x3c(%rbp)
jge    1764 <EstimateKmeans+0x664>
movsd  0x949(%rip),%xmm0
movsd  %xmm0,-0x1868(%rbp)
ff
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1746 <EstimateKmeans+0x646>
cvtsi2sdl -0x3c(%rbp),%xmm1
mov    -0x28(%rbp),%rax
movslq -0x40(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm1
movaps 0x94e(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  -0x1868(%rbp),%xmm0
ff
ucomisd %xmm1,%xmm0
jbe    1733 <EstimateKmeans+0x633>
cvtsi2sdl -0x3c(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x40(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movaps 0x91f(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x1868(%rbp)
ff
mov    -0x40(%rbp),%eax
mov    %eax,-0x44(%rbp)
jmp    1738 <EstimateKmeans+0x638>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    16cd <EstimateKmeans+0x5cd>
movslq -0x44(%rbp),%rcx
movslq -0x3c(%rbp),%rax
mov    %rcx,-0x1050(%rbp,%rax,8)
ff
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    16a2 <EstimateKmeans+0x5a2>
movq   $0x0,-0x1050(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x1860(%rbp)
ff
movl   $0x0,-0x3c(%rbp)
movslq -0x3c(%rbp),%rax
cmp    -0x1858(%rbp),%rax
jge    18e0 <EstimateKmeans+0x7e0>
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  0x87e(%rip),%xmm0
mulsd  (%rax,%rcx,8),%xmm0
divsd  -0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  0x864(%rip),%xmm2
mulsd  (%rax,%rcx,8),%xmm2
divsd  -0x38(%rbp),%xmm2
movsd  0x842(%rip),%xmm4
movsd  0x842(%rip),%xmm3
xorps  %xmm1,%xmm1
cmplesd %xmm2,%xmm1
movaps %xmm1,%xmm2
andpd  %xmm4,%xmm2
andnpd %xmm3,%xmm1
orpd   %xmm2,%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    %eax,-0x48(%rbp)
cmpl   $0x1,-0x48(%rbp)
jl     18c1 <EstimateKmeans+0x7c1>
cmpl   $0x0,-0x48(%rbp)
jge    1814 <EstimateKmeans+0x714>
movl   $0x0,-0x48(%rbp)
cmpl   $0xff,-0x48(%rbp)
jle    1828 <EstimateKmeans+0x728>
movl   $0xff,-0x48(%rbp)
movslq -0x48(%rbp),%rax
mov    -0x1050(%rbp,%rax,8),%rax
ff
add    $0x1,%rax
mov    %al,%dl
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
cvtsi2sdl -0x48(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x48(%rbp),%rcx
mov    -0x1050(%rbp,%rcx,8),%rcx
ff
subsd  (%rax,%rcx,8),%xmm0
cvtsi2sdl -0x48(%rbp),%xmm2
mov    -0x28(%rbp),%rax
movslq -0x48(%rbp),%rcx
mov    -0x1050(%rbp,%rcx,8),%rcx
ff
subsd  (%rax,%rcx,8),%xmm2
movsd  -0x1860(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x1860(%rbp)
ff
cmpl   $0x0,0x18(%rbp)
jle    18bc <EstimateKmeans+0x7bc>
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    0x18(%rbp),%eax
jge    18bc <EstimateKmeans+0x7bc>
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    18cd <EstimateKmeans+0x7cd>
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    18d2 <EstimateKmeans+0x7d2>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1781 <EstimateKmeans+0x681>
movsd  -0x1860(%rbp),%xmm0
ff
add    $0x1810,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<EstimateKmeans>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x1828,%rsp
movsd  %xmm0,0x18(%rsp)
mov    %r9d,0xc(%rsp)
mov    %r8,%rbx
mov    %ecx,%ebp
mov    %rdx,0x10(%rsp)
mov    %rsi,%r15
mov    %rdi,%r12
mov    0x1860(%rsp),%rax
movslq (%rax),%rcx
movslq 0x4(%rax),%rdx
imul   %rcx,%rdx
movslq 0x8(%rax),%r14
imul   %rdx,%r14
lea    0x20(%rsp),%rdi
xor    %r13d,%r13d
mov    $0x800,%edx
xor    %esi,%esi
call   1030 <memset@plt>
test   %r14d,%r14d
jle    1209 <EstimateKmeans+0xf9>
mov    0x1870(%rsp),%r8d
xor    %ecx,%ecx
movsd  0xe7a(%rip),%xmm0
xorpd  %xmm1,%xmm1
lea    0xe9f(%rip),%rdx
mov    $0xff,%r9d
movsd  0x18(%rsp),%xmm6
mov    0x10(%rsp),%r11
mov    0x1868(%rsp),%esi
jmp    11cc <EstimateKmeans+0xbc>
nopl   0x0(%rax,%rax,1)
cmp    $0xff,%edi
movslq %edi,%rax
cmovae %r9,%rax
addq   $0x1,0x20(%rsp,%rax,8)
add    $0x1,%rcx
cmp    %rcx,%r14
je     1202 <EstimateKmeans+0xf2>
movsd  (%r12,%rcx,8),%xmm2
mulsd  %xmm0,%xmm2
divsd  %xmm6,%xmm2
xor    %edi,%edi
ucomisd %xmm1,%xmm2
setae  %dil
addsd  (%rdx,%rdi,8),%xmm2
cvttsd2si %xmm2,%rdi
test   %edi,%edi
jle    11c3 <EstimateKmeans+0xb3>
test   %esi,%esi
jle    11b0 <EstimateKmeans+0xa0>
movzbl (%r11,%rcx,1),%eax
cmp    %r8d,%eax
jge    11b0 <EstimateKmeans+0xa0>
jmp    11c3 <EstimateKmeans+0xb3>
mov    0x20(%rsp),%r13
jmp    1214 <EstimateKmeans+0x104>
movsd  0x18(%rsp),%xmm6
mov    0x10(%rsp),%r11
mov    %r13,0x820(%rsp)
xor    %eax,%eax
mov    %r13,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    0x28(%rsp,%rax,8),%rcx
mov    %rcx,0x828(%rsp,%rax,8)
add    0x30(%rsp,%rax,8),%rcx
mov    %rcx,0x830(%rsp,%rax,8)
add    0x38(%rsp,%rax,8),%rcx
mov    %rcx,0x838(%rsp,%rax,8)
add    0x40(%rsp,%rax,8),%rcx
mov    %rcx,0x840(%rsp,%rax,8)
add    0x48(%rsp,%rax,8),%rcx
mov    %rcx,0x848(%rsp,%rax,8)
add    $0x5,%rax
cmp    $0xff,%rax
jne    1230 <EstimateKmeans+0x120>
mov    $0x1,%eax
movsd  0xd7e(%rip),%xmm0
xorpd  %xmm1,%xmm1
lea    0xd9b(%rip),%r9
cs nopw 0x0(%rax,%rax,1)
nop
xorps  %xmm2,%xmm2
cvtsi2sd %r13,%xmm2
mulsd  %xmm0,%xmm2
xorps  %xmm3,%xmm3
cvtsi2sdq 0x1018(%rsp),%xmm3
divsd  %xmm3,%xmm2
xor    %ecx,%ecx
ucomisd %xmm1,%xmm2
setae  %cl
addsd  (%r9,%rcx,8),%xmm2
cvttsd2si %xmm2,%rcx
mov    %rcx,0x818(%rsp,%rax,8)
cmp    $0x100,%rax
je     12ef <EstimateKmeans+0x1df>
mov    0x820(%rsp,%rax,8),%r13
add    $0x1,%rax
jmp    12a0 <EstimateKmeans+0x190>
xor    %eax,%eax
mov    $0xfffffffffffffc22,%rcx
mov    0x1868(%rsp),%r13d
jmp    131c <EstimateKmeans+0x20c>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x2,%rax
cmp    $0x100,%rax
je     1358 <EstimateKmeans+0x248>
mov    0x820(%rsp,%rax,8),%rdx
add    %rcx,%rdx
cmp    $0xfffffffffffffc2c,%rdx
ja     1339 <EstimateKmeans+0x229>
movq   $0x0,0x20(%rsp,%rax,8)
mov    0x828(%rsp,%rax,8),%rdx
add    %rcx,%rdx
cmp    $0xfffffffffffffc2c,%rdx
ja     1310 <EstimateKmeans+0x200>
movq   $0x0,0x28(%rsp,%rax,8)
jmp    1310 <EstimateKmeans+0x200>
mov    %ebp,%r10d
cmpl   $0x0,0xc(%rsp)
jle    1535 <EstimateKmeans+0x425>
mov    %r10d,%edx
and    $0xfffffffe,%edx
xor    %r8d,%r8d
movsd  0xc99(%rip),%xmm0
movsd  0xc99(%rip),%xmm1
xor    %edi,%edi
jmp    13a1 <EstimateKmeans+0x291>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%rdi
cmp    $0x100,%rdi
je     1450 <EstimateKmeans+0x340>
test   %ebp,%ebp
jle    1430 <EstimateKmeans+0x320>
xorps  %xmm2,%xmm2
cvtsi2sd %edi,%xmm2
xor    %esi,%esi
movapd %xmm0,%xmm3
cmp    $0x1,%ebp
jne    13e9 <EstimateKmeans+0x2d9>
test   $0x1,%r10b
je     1390 <EstimateKmeans+0x280>
subsd  (%rbx,%rsi,8),%xmm2
mulsd  %xmm2,%xmm2
ucomisd %xmm2,%xmm3
jbe    1390 <EstimateKmeans+0x280>
mov    %rsi,0x1020(%rsp,%rdi,8)
jmp    1390 <EstimateKmeans+0x280>
nopw   0x0(%rax,%rax,1)
add    $0x2,%rsi
cmp    %rsi,%rdx
je     13bb <EstimateKmeans+0x2ab>
movapd %xmm2,%xmm4
subsd  (%rbx,%rsi,8),%xmm4
mulsd  %xmm4,%xmm4
ucomisd %xmm4,%xmm3
jbe    1408 <EstimateKmeans+0x2f8>
mov    %rsi,0x1020(%rsp,%rdi,8)
movapd %xmm4,%xmm3
movapd %xmm2,%xmm4
subsd  0x8(%rbx,%rsi,8),%xmm4
mulsd  %xmm4,%xmm4
ucomisd %xmm4,%xmm3
jbe    13e0 <EstimateKmeans+0x2d0>
lea    0x1(%rsi),%rax
mov    %rax,0x1020(%rsp,%rdi,8)
movapd %xmm4,%xmm3
jmp    13e0 <EstimateKmeans+0x2d0>
xchg   %ax,%ax
add    $0x1,%rdi
cmp    $0x100,%rdi
jne    13a1 <EstimateKmeans+0x291>
jmp    1535 <EstimateKmeans+0x425>
cs nopw 0x0(%rax,%rax,1)
test   %ebp,%ebp
jle    1535 <EstimateKmeans+0x425>
xorpd  %xmm2,%xmm2
xor    %edi,%edi
jmp    1483 <EstimateKmeans+0x373>
movapd %xmm5,%xmm3
subsd  (%rbx,%rdi,8),%xmm3
movsd  %xmm5,(%rbx,%rdi,8)
mulsd  %xmm3,%xmm3
addsd  %xmm3,%xmm2
add    $0x1,%rdi
cmp    %r10,%rdi
je     1520 <EstimateKmeans+0x410>
xor    %esi,%esi
xorpd  %xmm3,%xmm3
xorpd  %xmm4,%xmm4
jmp    149d <EstimateKmeans+0x38d>
nop
add    $0x2,%rsi
cmp    $0x100,%rsi
je     1500 <EstimateKmeans+0x3f0>
cmp    %rdi,0x1020(%rsp,%rsi,8)
jne    14c8 <EstimateKmeans+0x3b8>
mov    0x20(%rsp,%rsi,8),%rax
xorps  %xmm5,%xmm5
cvtsi2sd %rax,%xmm5
addsd  %xmm5,%xmm4
imul   %rsi,%rax
xorps  %xmm5,%xmm5
cvtsi2sd %rax,%xmm5
addsd  %xmm5,%xmm3
cmp    %rdi,0x1028(%rsp,%rsi,8)
jne    1490 <EstimateKmeans+0x380>
lea    0x1(%rsi),%rax
mov    0x28(%rsp,%rsi,8),%rcx
xorps  %xmm5,%xmm5
cvtsi2sd %rcx,%xmm5
addsd  %xmm5,%xmm4
imul   %rcx,%rax
xorps  %xmm5,%xmm5
cvtsi2sd %rax,%xmm5
addsd  %xmm5,%xmm3
jmp    1490 <EstimateKmeans+0x380>
nopl   0x0(%rax)
xorpd  %xmm5,%xmm5
ucomisd %xmm5,%xmm4
jbe    1460 <EstimateKmeans+0x350>
divsd  %xmm4,%xmm3
movapd %xmm3,%xmm5
jmp    1460 <EstimateKmeans+0x350>
nopl   0x0(%rax,%rax,1)
ucomisd %xmm1,%xmm2
jbe    1535 <EstimateKmeans+0x425>
add    $0x1,%r8d
cmp    0xc(%rsp),%r8d
jl     137f <EstimateKmeans+0x26f>
mov    %r10d,%edx
and    $0xfffffffe,%edx
xor    %esi,%esi
movsd  0xadb(%rip),%xmm0
movapd 0xaf3(%rip),%xmm1
movapd 0xaeb(%rip),%xmm2
jmp    157b <EstimateKmeans+0x46b>
nopw   0x0(%rax,%rax,1)
cltq
mov    %rax,0x1020(%rsp,%rsi,8)
add    $0x1,%rsi
cmp    $0x100,%rsi
je     15fe <EstimateKmeans+0x4ee>
mov    $0x0,%eax
test   %ebp,%ebp
jle    1560 <EstimateKmeans+0x450>
xorps  %xmm3,%xmm3
cvtsi2sd %esi,%xmm3
xor    %edi,%edi
movapd %xmm0,%xmm4
xor    %eax,%eax
cmp    $0x1,%ebp
je     15df <EstimateKmeans+0x4cf>
nopl   0x0(%rax,%rax,1)
movapd %xmm3,%xmm5
subsd  (%rbx,%rdi,8),%xmm5
andpd  %xmm2,%xmm5
ucomisd %xmm5,%xmm4
mov    %eax,%ecx
cmova  %edi,%ecx
minsd  %xmm4,%xmm5
movapd %xmm3,%xmm4
subsd  0x8(%rbx,%rdi,8),%xmm4
andpd  %xmm2,%xmm4
ucomisd %xmm4,%xmm5
lea    0x1(%rdi),%eax
cmovbe %ecx,%eax
minsd  %xmm5,%xmm4
add    $0x2,%rdi
cmp    %rdx,%rdi
jne    15a0 <EstimateKmeans+0x490>
test   $0x1,%r10b
je     1560 <EstimateKmeans+0x450>
subsd  (%rbx,%rdi,8),%xmm3
andpd  %xmm1,%xmm3
ucomisd %xmm3,%xmm4
cmova  %edi,%eax
jmp    1560 <EstimateKmeans+0x450>
test   %r14d,%r14d
jle    169e <EstimateKmeans+0x58e>
xorpd  %xmm1,%xmm1
xor    %ecx,%ecx
movsd  0x9eb(%rip),%xmm2
mov    $0xff,%edx
xorpd  %xmm3,%xmm3
jmp    1638 <EstimateKmeans+0x528>
lea    (%r15,%rcx,1),%rax
movapd %xmm3,%xmm0
movb   $0x0,(%rax)
add    $0x1,%rcx
movapd %xmm0,%xmm3
cmp    %rcx,%r14
je     16a2 <EstimateKmeans+0x592>
movsd  (%r12,%rcx,8),%xmm0
mulsd  %xmm2,%xmm0
divsd  %xmm6,%xmm0
xor    %eax,%eax
ucomisd %xmm1,%xmm0
setae  %al
addsd  (%r9,%rax,8),%xmm0
cvttsd2si %xmm0,%rax
test   %eax,%eax
jle    1620 <EstimateKmeans+0x510>
cmp    $0xff,%eax
cmovae %edx,%eax
mov    0x1020(%rsp,%rax,8),%rsi
lea    0x1(%rsi),%edi
mov    %dil,(%r15,%rcx,1)
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
subsd  (%rbx,%rsi,8),%xmm0
mulsd  %xmm0,%xmm0
addsd  %xmm3,%xmm0
test   %r13d,%r13d
jle    162b <EstimateKmeans+0x51b>
movzbl (%r11,%rcx,1),%eax
cmp    %r13d,%eax
jae    162b <EstimateKmeans+0x51b>
lea    (%r15,%rcx,1),%rax
jmp    1628 <EstimateKmeans+0x518>
xorpd  %xmm0,%xmm0
add    $0x1828,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define double @EstimateKmeans(double* %0, i8* %1, i8* %2, i32 %3, double* %4, i32 %5, i32* %6, i32 %7, i32 %8, double %9) {
%11 = alloca double*
%12 = alloca i8*
%13 = alloca i8*
%14 = alloca i32
%15 = alloca double*
%16 = alloca i32
%17 = alloca i32*
%18 = alloca i32
%19 = alloca i32
%20 = alloca double
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32
%25 = alloca i32
%26 = alloca [256 x i64]
%27 = alloca [256 x i64]
%28 = alloca [256 x i64]
%29 = alloca i64
%30 = alloca double
%31 = alloca double
%32 = alloca double
%33 = alloca double
%34 = alloca double
store double* %0, double** %11
store i8* %1, i8** %12
store i8* %2, i8** %13
store i32 %3, i32* %14
store double* %4, double** %15
store i32 %5, i32* %16
store i32* %6, i32** %17
store i32 %7, i32* %18
store i32 %8, i32* %19
store double %9, double* %20
%35 = load i32*, i32** %17
%36 = getelementptr inbounds i32, i32* %35, i64 0
%37 = load i32, i32* %36
%38 = load i32*, i32** %17
%39 = getelementptr inbounds i32, i32* %38, i64 1
%40 = load i32, i32* %39
%41 = mul nsw i32 %37, %40
%42 = load i32*, i32** %17
%43 = getelementptr inbounds i32, i32* %42, i64 2
%44 = load i32, i32* %43
%45 = mul nsw i32 %41, %44
%46 = sext i32 %45 to i64
store i64 %46, i64* %29
store i32 0, i32* %21
br label %47
47: ; preds = %54, %10
%48 = load i32, i32* %21
%49 = icmp slt i32 %48, 256
br i1 %49, label %50, label %57
50: ; preds = %47
%51 = load i32, i32* %21
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds [256 x i64], [256 x i64]* %26, i64 0, i64 %52
store i64 0, i64* %53
br label %54
54: ; preds = %50
%55 = load i32, i32* %21
%56 = add nsw i32 %55, 1
store i32 %56, i32* %21
br label %47
57: ; preds = %47
store i32 0, i32* %21
br label %58
58: ; preds = %116, %57
%59 = load i32, i32* %21
%60 = sext i32 %59 to i64
%61 = load i64, i64* %29
%62 = icmp slt i64 %60, %61
br i1 %62, label %63, label %119
63: ; preds = %58
%64 = load double*, double** %11
%65 = load i32, i32* %21
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds double, double* %64, i64 %66
%68 = load double, double* %67
%69 = fmul double 2.550000e+02, %68
%70 = load double, double* %20
%71 = fdiv double %69, %70
%72 = load double*, double** %11
%73 = load i32, i32* %21
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds double, double* %72, i64 %74
%76 = load double, double* %75
%77 = fmul double 2.550000e+02, %76
%78 = load double, double* %20
%79 = fdiv double %77, %78
%80 = fcmp oge double %79, 0.000000e+00
%81 = zext i1 %80 to i64
%82 = select i1 %80, double 5.000000e-01, double -5.000000e-01
%83 = fadd double %71, %82
%84 = fptosi double %83 to i64
%85 = trunc i64 %84 to i32
store i32 %85, i32* %24
%86 = load i32, i32* %24
%87 = icmp slt i32 %86, 1
br i1 %87, label %88, label %89
88: ; preds = %63
br label %116
89: ; preds = %63
%90 = load i32, i32* %18
%91 = icmp sgt i32 %90, 0
br i1 %91, label %92, label %102
92: ; preds = %89
%93 = load i8*, i8** %13
%94 = load i32, i32* %21
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds i8, i8* %93, i64 %95
%97 = load i8, i8* %96
%98 = zext i8 %97 to i32
%99 = load i32, i32* %19
%100 = icmp slt i32 %98, %99
br i1 %100, label %101, label %102
101: ; preds = %92
br label %116
102: ; preds = %92, %89
%103 = load i32, i32* %24
%104 = icmp slt i32 %103, 0
br i1 %104, label %105, label %106
105: ; preds = %102
store i32 0, i32* %24
br label %106
106: ; preds = %105, %102
%107 = load i32, i32* %24
%108 = icmp sgt i32 %107, 255
br i1 %108, label %109, label %110
109: ; preds = %106
store i32 255, i32* %24
br label %110
110: ; preds = %109, %106
%111 = load i32, i32* %24
%112 = sext i32 %111 to i64
%113 = getelementptr inbounds [256 x i64], [256 x i64]* %26, i64 0, i64 %112
%114 = load i64, i64* %113
%115 = add nsw i64 %114, 1
store i64 %115, i64* %113
br label %116
116: ; preds = %110, %101, %88
%117 = load i32, i32* %21
%118 = add nsw i32 %117, 1
store i32 %118, i32* %21
br label %58
119: ; preds = %58
%120 = getelementptr inbounds [256 x i64], [256 x i64]* %26, i64 0, i64 0
%121 = load i64, i64* %120
%122 = getelementptr inbounds [256 x i64], [256 x i64]* %28, i64 0, i64 0
store i64 %121, i64* %122
store i32 1, i32* %21
br label %123
123: ; preds = %140, %119
%124 = load i32, i32* %21
%125 = icmp slt i32 %124, 256
br i1 %125, label %126, label %143
126: ; preds = %123
%127 = load i32, i32* %21
%128 = sub nsw i32 %127, 1
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds [256 x i64], [256 x i64]* %28, i64 0, i64 %129
%131 = load i64, i64* %130
%132 = load i32, i32* %21
%133 = sext i32 %132 to i64
%134 = getelementptr inbounds [256 x i64], [256 x i64]* %26, i64 0, i64 %133
%135 = load i64, i64* %134
%136 = add nsw i64 %131, %135
%137 = load i32, i32* %21
%138 = sext i32 %137 to i64
%139 = getelementptr inbounds [256 x i64], [256 x i64]* %28, i64 0, i64 %138
store i64 %136, i64* %139
br label %140
140: ; preds = %126
%141 = load i32, i32* %21
%142 = add nsw i32 %141, 1
store i32 %142, i32* %21
br label %123
143: ; preds = %123
store i32 0, i32* %21
br label %144
144: ; preds = %176, %143
%145 = load i32, i32* %21
%146 = icmp slt i32 %145, 256
br i1 %146, label %147, label %179
147: ; preds = %144
%148 = load i32, i32* %21
%149 = sext i32 %148 to i64
%150 = getelementptr inbounds [256 x i64], [256 x i64]* %28, i64 0, i64 %149
%151 = load i64, i64* %150
%152 = sitofp i64 %151 to double
%153 = fmul double 1.000000e+03, %152
%154 = getelementptr inbounds [256 x i64], [256 x i64]* %28, i64 0, i64 255
%155 = load i64, i64* %154
%156 = sitofp i64 %155 to double
%157 = fdiv double %153, %156
%158 = load i32, i32* %21
%159 = sext i32 %158 to i64
%160 = getelementptr inbounds [256 x i64], [256 x i64]* %28, i64 0, i64 %159
%161 = load i64, i64* %160
%162 = sitofp i64 %161 to double
%163 = fmul double 1.000000e+03, %162
%164 = getelementptr inbounds [256 x i64], [256 x i64]* %28, i64 0, i64 255
%165 = load i64, i64* %164
%166 = sitofp i64 %165 to double
%167 = fdiv double %163, %166
%168 = fcmp oge double %167, 0.000000e+00
%169 = zext i1 %168 to i64
%170 = select i1 %168, double 5.000000e-01, double -5.000000e-01
%171 = fadd double %157, %170
%172 = fptosi double %171 to i64
%173 = load i32, i32* %21
%174 = sext i32 %173 to i64
%175 = getelementptr inbounds [256 x i64], [256 x i64]* %28, i64 0, i64 %174
store i64 %172, i64* %175
br label %176
176: ; preds = %147
%177 = load i32, i32* %21
%178 = add nsw i32 %177, 1
store i32 %178, i32* %21
br label %144
179: ; preds = %144
store i32 0, i32* %21
br label %180
180: ; preds = %200, %179
%181 = load i32, i32* %21
%182 = icmp slt i32 %181, 256
br i1 %182, label %183, label %203
183: ; preds = %180
%184 = load i32, i32* %21
%185 = sext i32 %184 to i64
%186 = getelementptr inbounds [256 x i64], [256 x i64]* %28, i64 0, i64 %185
%187 = load i64, i64* %186
%188 = icmp sle i64 %187, 10
br i1 %188, label %195, label %189
189: ; preds = %183
%190 = load i32, i32* %21
%191 = sext i32 %190 to i64
%192 = getelementptr inbounds [256 x i64], [256 x i64]* %28, i64 0, i64 %191
%193 = load i64, i64* %192
%194 = icmp sge i64 %193, 990
br i1 %194, label %195, label %199
195: ; preds = %189, %183
%196 = load i32, i32* %21
%197 = sext i32 %196 to i64
%198 = getelementptr inbounds [256 x i64], [256 x i64]* %26, i64 0, i64 %197
store i64 0, i64* %198
br label %199
199: ; preds = %195, %189
br label %200
200: ; preds = %199
%201 = load i32, i32* %21
%202 = add nsw i32 %201, 1
store i32 %202, i32* %21
br label %180
203: ; preds = %180
store double 1.000000e+15, double* %30
store i32 0, i32* %25
br label %204
204: ; preds = %322, %203
%205 = load double, double* %30
%206 = fcmp ogt double %205, 1.000000e+00
br i1 %206, label %207, label %211
207: ; preds = %204
%208 = load i32, i32* %25
%209 = load i32, i32* %16
%210 = icmp slt i32 %208, %209
br label %211
211: ; preds = %207, %204
%212 = phi i1 [ false, %204 ], [ %210, %207 ]
br i1 %212, label %213, label %325
213: ; preds = %211
store i32 0, i32* %21
br label %214
214: ; preds = %249, %213
%215 = load i32, i32* %21
%216 = icmp slt i32 %215, 256
br i1 %216, label %217, label %252
217: ; preds = %214
store double 6.553600e+04, double* %31
store i32 0, i32* %22
br label %218
218: ; preds = %245, %217
%219 = load i32, i32* %22
%220 = load i32, i32* %14
%221 = icmp slt i32 %219, %220
br i1 %221, label %222, label %248
222: ; preds = %218
%223 = load i32, i32* %21
%224 = sitofp i32 %223 to double
%225 = load double*, double** %15
%226 = load i32, i32* %22
%227 = sext i32 %226 to i64
%228 = getelementptr inbounds double, double* %225, i64 %227
%229 = load double, double* %228
%230 = fsub double %224, %229
store double %230, double* %32
%231 = load double, double* %32
%232 = load double, double* %32
%233 = fmul double %232, %231
store double %233, double* %32
%234 = load double, double* %32
%235 = load double, double* %31
%236 = fcmp olt double %234, %235
br i1 %236, label %237, label %244
237: ; preds = %222
%238 = load i32, i32* %22
%239 = sext i32 %238 to i64
%240 = load i32, i32* %21
%241 = sext i32 %240 to i64
%242 = getelementptr inbounds [256 x i64], [256 x i64]* %27, i64 0, i64 %241
store i64 %239, i64* %242
%243 = load double, double* %32
store double %243, double* %31
br label %244
244: ; preds = %237, %222
br label %245
245: ; preds = %244
%246 = load i32, i32* %22
%247 = add nsw i32 %246, 1
store i32 %247, i32* %22
br label %218
248: ; preds = %218
br label %249
249: ; preds = %248
%250 = load i32, i32* %21
%251 = add nsw i32 %250, 1
store i32 %251, i32* %21
br label %214
252: ; preds = %214
store double 0.000000e+00, double* %30
store i32 0, i32* %21
br label %253
253: ; preds = %319, %252
%254 = load i32, i32* %21
%255 = load i32, i32* %14
%256 = icmp slt i32 %254, %255
br i1 %256, label %257, label %322
257: ; preds = %253
store double 0.000000e+00, double* %33
store double 0.000000e+00, double* %34
store i32 0, i32* %22
br label %258
258: ; preds = %288, %257
%259 = load i32, i32* %22
%260 = icmp slt i32 %259, 256
br i1 %260, label %261, label %291
261: ; preds = %258
%262 = load i32, i32* %22
%263 = sext i32 %262 to i64
%264 = getelementptr inbounds [256 x i64], [256 x i64]* %27, i64 0, i64 %263
%265 = load i64, i64* %264
%266 = load i32, i32* %21
%267 = sext i32 %266 to i64
%268 = icmp eq i64 %265, %267
br i1 %268, label %269, label %287
269: ; preds = %261
%270 = load i32, i32* %22
%271 = sext i32 %270 to i64
%272 = getelementptr inbounds [256 x i64], [256 x i64]* %26, i64 0, i64 %271
%273 = load i64, i64* %272
%274 = sitofp i64 %273 to double
%275 = load double, double* %33
%276 = fadd double %275, %274
store double %276, double* %33
%277 = load i32, i32* %22
%278 = sext i32 %277 to i64
%279 = load i32, i32* %22
%280 = sext i32 %279 to i64
%281 = getelementptr inbounds [256 x i64], [256 x i64]* %26, i64 0, i64 %280
%282 = load i64, i64* %281
%283 = mul nsw i64 %278, %282
%284 = sitofp i64 %283 to double
%285 = load double, double* %34
%286 = fadd double %285, %284
store double %286, double* %34
br label %287
287: ; preds = %269, %261
br label %288
288: ; preds = %287
%289 = load i32, i32* %22
%290 = add nsw i32 %289, 1
store i32 %290, i32* %22
br label %258
291: ; preds = %258
%292 = load double, double* %33
%293 = fcmp ogt double %292, 0.000000e+00
br i1 %293, label %294, label %298
294: ; preds = %291
%295 = load double, double* %33
%296 = load double, double* %34
%297 = fdiv double %296, %295
store double %297, double* %34
br label %299
298: ; preds = %291
br label %299
299: ; preds = %298, %294
%300 = phi double [ %297, %294 ], [ 0.000000e+00, %298 ]
store double %300, double* %34
%301 = load double, double* %34
%302 = load double*, double** %15
%303 = load i32, i32* %21
%304 = sext i32 %303 to i64
%305 = getelementptr inbounds double, double* %302, i64 %304
%306 = load double, double* %305
%307 = fsub double %301, %306
store double %307, double* %32
%308 = load double, double* %34
%309 = load double*, double** %15
%310 = load i32, i32* %21
%311 = sext i32 %310 to i64
%312 = getelementptr inbounds double, double* %309, i64 %311
store double %308, double* %312
%313 = load double, double* %32
%314 = load double, double* %32
%315 = fmul double %314, %313
store double %315, double* %32
%316 = load double, double* %32
%317 = load double, double* %30
%318 = fadd double %317, %316
store double %318, double* %30
br label %319
319: ; preds = %299
%320 = load i32, i32* %21
%321 = add nsw i32 %320, 1
store i32 %321, i32* %21
br label %253
322: ; preds = %253
%323 = load i32, i32* %25
%324 = add nsw i32 %323, 1
store i32 %324, i32* %25
br label %204
325: ; preds = %211
store i32 0, i32* %21
br label %326
326: ; preds = %367, %325
%327 = load i32, i32* %21
%328 = icmp slt i32 %327, 256
br i1 %328, label %329, label %370
329: ; preds = %326
store double 1.000000e+15, double* %31
store i32 0, i32* %23
store i32 0, i32* %22
br label %330
330: ; preds = %358, %329
%331 = load i32, i32* %22
%332 = load i32, i32* %14
%333 = icmp slt i32 %331, %332
br i1 %333, label %334, label %361
334: ; preds = %330
%335 = load i32, i32* %21
%336 = sitofp i32 %335 to double
%337 = load double*, double** %15
%338 = load i32, i32* %22
%339 = sext i32 %338 to i64
%340 = getelementptr inbounds double, double* %337, i64 %339
%341 = load double, double* %340
%342 = fsub double %336, %341
%343 = call double @llvm.fabs.f64(double %342)
%344 = load double, double* %31
%345 = fcmp olt double %343, %344
br i1 %345, label %346, label %357
346: ; preds = %334
%347 = load i32, i32* %21
%348 = sitofp i32 %347 to double
%349 = load double*, double** %15
%350 = load i32, i32* %22
%351 = sext i32 %350 to i64
%352 = getelementptr inbounds double, double* %349, i64 %351
%353 = load double, double* %352
%354 = fsub double %348, %353
%355 = call double @llvm.fabs.f64(double %354)
store double %355, double* %31
%356 = load i32, i32* %22
store i32 %356, i32* %23
br label %357
357: ; preds = %346, %334
br label %358
358: ; preds = %357
%359 = load i32, i32* %22
%360 = add nsw i32 %359, 1
store i32 %360, i32* %22
br label %330
361: ; preds = %330
%362 = load i32, i32* %23
%363 = sext i32 %362 to i64
%364 = load i32, i32* %21
%365 = sext i32 %364 to i64
%366 = getelementptr inbounds [256 x i64], [256 x i64]* %27, i64 0, i64 %365
store i64 %363, i64* %366
br label %367
367: ; preds = %361
%368 = load i32, i32* %21
%369 = add nsw i32 %368, 1
store i32 %369, i32* %21
br label %326
370: ; preds = %326
%371 = getelementptr inbounds [256 x i64], [256 x i64]* %27, i64 0, i64 0
store i64 0, i64* %371
store double 0.000000e+00, double* %30
store i32 0, i32* %21
br label %372
372: ; preds = %466, %370
%373 = load i32, i32* %21
%374 = sext i32 %373 to i64
%375 = load i64, i64* %29
%376 = icmp slt i64 %374, %375
br i1 %376, label %377, label %469
377: ; preds = %372
%378 = load double*, double** %11
%379 = load i32, i32* %21
%380 = sext i32 %379 to i64
%381 = getelementptr inbounds double, double* %378, i64 %380
%382 = load double, double* %381
%383 = fmul double 2.550000e+02, %382
%384 = load double, double* %20
%385 = fdiv double %383, %384
%386 = load double*, double** %11
%387 = load i32, i32* %21
%388 = sext i32 %387 to i64
%389 = getelementptr inbounds double, double* %386, i64 %388
%390 = load double, double* %389
%391 = fmul double 2.550000e+02, %390
%392 = load double, double* %20
%393 = fdiv double %391, %392
%394 = fcmp oge double %393, 0.000000e+00
%395 = zext i1 %394 to i64
%396 = select i1 %394, double 5.000000e-01, double -5.000000e-01
%397 = fadd double %385, %396
%398 = fptosi double %397 to i64
%399 = trunc i64 %398 to i32
store i32 %399, i32* %24
%400 = load i32, i32* %24
%401 = icmp sge i32 %400, 1
br i1 %401, label %402, label %460
402: ; preds = %377
%403 = load i32, i32* %24
%404 = icmp slt i32 %403, 0
br i1 %404, label %405, label %406
405: ; preds = %402
store i32 0, i32* %24
br label %406
406: ; preds = %405, %402
%407 = load i32, i32* %24
%408 = icmp sgt i32 %407, 255
br i1 %408, label %409, label %410
409: ; preds = %406
store i32 255, i32* %24
br label %410
410: ; preds = %409, %406
%411 = load i32, i32* %24
%412 = sext i32 %411 to i64
%413 = getelementptr inbounds [256 x i64], [256 x i64]* %27, i64 0, i64 %412
%414 = load i64, i64* %413
%415 = add nsw i64 %414, 1
%416 = trunc i64 %415 to i8
%417 = load i8*, i8** %12
%418 = load i32, i32* %21
%419 = sext i32 %418 to i64
%420 = getelementptr inbounds i8, i8* %417, i64 %419
store i8 %416, i8* %420
%421 = load i32, i32* %24
%422 = sitofp i32 %421 to double
%423 = load double*, double** %15
%424 = load i32, i32* %24
%425 = sext i32 %424 to i64
%426 = getelementptr inbounds [256 x i64], [256 x i64]* %27, i64 0, i64 %425
%427 = load i64, i64* %426
%428 = getelementptr inbounds double, double* %423, i64 %427
%429 = load double, double* %428
%430 = fsub double %422, %429
%431 = load i32, i32* %24
%432 = sitofp i32 %431 to double
%433 = load double*, double** %15
%434 = load i32, i32* %24
%435 = sext i32 %434 to i64
%436 = getelementptr inbounds [256 x i64], [256 x i64]* %27, i64 0, i64 %435
%437 = load i64, i64* %436
%438 = getelementptr inbounds double, double* %433, i64 %437
%439 = load double, double* %438
%440 = fsub double %432, %439
%441 = load double, double* %30
%442 = call double @llvm.fmuladd.f64(double %430, double %440, double %441)
store double %442, double* %30
%443 = load i32, i32* %18
%444 = icmp sgt i32 %443, 0
br i1 %444, label %445, label %459
445: ; preds = %410
%446 = load i8*, i8** %13
%447 = load i32, i32* %21
%448 = sext i32 %447 to i64
%449 = getelementptr inbounds i8, i8* %446, i64 %448
%450 = load i8, i8* %449
%451 = zext i8 %450 to i32
%452 = load i32, i32* %18
%453 = icmp slt i32 %451, %452
br i1 %453, label %454, label %459
454: ; preds = %445
%455 = load i8*, i8** %12
%456 = load i32, i32* %21
%457 = sext i32 %456 to i64
%458 = getelementptr inbounds i8, i8* %455, i64 %457
store i8 0, i8* %458
br label %459
459: ; preds = %454, %445, %410
br label %465
460: ; preds = %377
%461 = load i8*, i8** %12
%462 = load i32, i32* %21
%463 = sext i32 %462 to i64
%464 = getelementptr inbounds i8, i8* %461, i64 %463
store i8 0, i8* %464
br label %465
465: ; preds = %460, %459
br label %466
466: ; preds = %465
%467 = load i32, i32* %21
%468 = add nsw i32 %467, 1
store i32 %468, i32* %21
br label %372
469: ; preds = %372
%470 = load double, double* %30
ret double %470
}

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