double lb_kim_hierarchy(double *t, double *q, int j, int len, double mean,
                        double std, double bsf) {
  double d, lb;
  double x0 = (t[j] - mean) / std;
  double y0 = (t[(len - 1 + j)] - mean) / std;
  lb = ((x0 - q[0]) * (x0 - q[0])) + ((y0 - q[len - 1]) * (y0 - q[len - 1]));
  if (lb >= bsf)
    return lb;
  double x1 = (t[(j + 1)] - mean) / std;
  d = ((((x1 - q[0]) * (x1 - q[0]))) < (((x0 - q[1]) * (x0 - q[1])))
           ? (((x1 - q[0]) * (x1 - q[0])))
           : (((x0 - q[1]) * (x0 - q[1]))));
  d = ((d) < (((x1 - q[1]) * (x1 - q[1]))) ? (d)
                                           : (((x1 - q[1]) * (x1 - q[1]))));
  lb += d;
  if (lb >= bsf)
    return lb;
  double y1 = (t[(len - 2 + j)] - mean) / std;
  d = ((((y1 - q[len - 1]) * (y1 - q[len - 1]))) <
               (((y0 - q[len - 2]) * (y0 - q[len - 2])))
           ? (((y1 - q[len - 1]) * (y1 - q[len - 1])))
           : (((y0 - q[len - 2]) * (y0 - q[len - 2]))));
  d = ((d) < (((y1 - q[len - 2]) * (y1 - q[len - 2])))
           ? (d)
           : (((y1 - q[len - 2]) * (y1 - q[len - 2]))));
  lb += d;
  if (lb >= bsf)
    return lb;
  double x2 = (t[(j + 2)] - mean) / std;
  d = ((((x0 - q[2]) * (x0 - q[2]))) < (((x1 - q[2]) * (x1 - q[2])))
           ? (((x0 - q[2]) * (x0 - q[2])))
           : (((x1 - q[2]) * (x1 - q[2]))));
  d = ((d) < (((x2 - q[2]) * (x2 - q[2]))) ? (d)
                                           : (((x2 - q[2]) * (x2 - q[2]))));
  d = ((d) < (((x2 - q[1]) * (x2 - q[1]))) ? (d)
                                           : (((x2 - q[1]) * (x2 - q[1]))));
  d = ((d) < (((x2 - q[0]) * (x2 - q[0]))) ? (d)
                                           : (((x2 - q[0]) * (x2 - q[0]))));
  lb += d;
  if (lb >= bsf)
    return lb;
  double y2 = (t[(len - 3 + j)] - mean) / std;
  d = ((((y0 - q[len - 3]) * (y0 - q[len - 3]))) <
               (((y1 - q[len - 3]) * (y1 - q[len - 3])))
           ? (((y0 - q[len - 3]) * (y0 - q[len - 3])))
           : (((y1 - q[len - 3]) * (y1 - q[len - 3]))));
  d = ((d) < (((y2 - q[len - 3]) * (y2 - q[len - 3])))
           ? (d)
           : (((y2 - q[len - 3]) * (y2 - q[len - 3]))));
  d = ((d) < (((y2 - q[len - 2]) * (y2 - q[len - 2])))
           ? (d)
           : (((y2 - q[len - 2]) * (y2 - q[len - 2]))));
  d = ((d) < (((y2 - q[len - 1]) * (y2 - q[len - 1])))
           ? (d)
           : (((y2 - q[len - 1]) * (y2 - q[len - 1]))));
  lb += d;
  return lb;
}


x86 assembly (clang, -O0):
<lb_kim_hierarchy>:
push   %rbp
mov    %rsp,%rbp
sub    $0x58,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %ecx,-0x20(%rbp)
movsd  %xmm0,-0x28(%rbp)
movsd  %xmm1,-0x30(%rbp)
movsd  %xmm2,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x28(%rbp),%xmm0
divsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x28(%rbp),%xmm0
divsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x50(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  (%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
mov    -0x18(%rbp),%rax
subsd  (%rax),%xmm2
movsd  -0x58(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm1
movsd  -0x58(%rbp),%xmm3
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm3
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
ucomisd -0x38(%rbp),%xmm0
jb     11dd <lb_kim_hierarchy+0xdd>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1a79 <lb_kim_hierarchy+0x979>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x28(%rbp),%xmm0
divsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm1
mov    -0x18(%rbp),%rax
subsd  (%rax),%xmm1
movsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  (%rax),%xmm0
mulsd  %xmm0,%xmm1
movsd  -0x50(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm2
mulsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    126e <lb_kim_hierarchy+0x16e>
movsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  (%rax),%xmm0
movsd  -0x60(%rbp),%xmm1
mov    -0x18(%rbp),%rax
subsd  (%rax),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
jmp    1293 <lb_kim_hierarchy+0x193>
movsd  -0x50(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm0
movsd  -0x50(%rbp),%xmm1
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm2
mulsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    12de <lb_kim_hierarchy+0x1de>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
jmp    1306 <lb_kim_hierarchy+0x206>
movsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm0
movsd  -0x60(%rbp),%xmm1
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
ucomisd -0x38(%rbp),%xmm0
jb     1341 <lb_kim_hierarchy+0x241>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1a79 <lb_kim_hierarchy+0x979>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x28(%rbp),%xmm0
divsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm1
movsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
mulsd  %xmm0,%xmm1
movsd  -0x58(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x58(%rbp),%xmm2
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    1412 <lb_kim_hierarchy+0x312>
movsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x68(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
jmp    144c <lb_kim_hierarchy+0x34c>
movsd  -0x58(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x58(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x68(%rbp),%xmm2
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    14ac <lb_kim_hierarchy+0x3ac>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
jmp    14e6 <lb_kim_hierarchy+0x3e6>
movsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x68(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
ucomisd -0x38(%rbp),%xmm0
jb     1521 <lb_kim_hierarchy+0x421>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1a79 <lb_kim_hierarchy+0x979>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x28(%rbp),%xmm0
divsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x50(%rbp),%xmm1
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm1
movsd  -0x50(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm0
mulsd  %xmm0,%xmm1
movsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm2
mulsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    15b9 <lb_kim_hierarchy+0x4b9>
movsd  -0x50(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm0
movsd  -0x50(%rbp),%xmm1
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
jmp    15e1 <lb_kim_hierarchy+0x4e1>
movsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm0
movsd  -0x60(%rbp),%xmm1
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  -0x70(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm0
movsd  -0x70(%rbp),%xmm2
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm2
mulsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    162f <lb_kim_hierarchy+0x52f>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
jmp    1657 <lb_kim_hierarchy+0x557>
movsd  -0x70(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm0
movsd  -0x70(%rbp),%xmm1
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0xa8(%rbp),%xmm0
ff
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  -0x70(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm0
movsd  -0x70(%rbp),%xmm2
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm2
mulsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    16a5 <lb_kim_hierarchy+0x5a5>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
jmp    16cd <lb_kim_hierarchy+0x5cd>
movsd  -0x70(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm0
movsd  -0x70(%rbp),%xmm1
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  -0x70(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  (%rax),%xmm0
movsd  -0x70(%rbp),%xmm2
mov    -0x18(%rbp),%rax
subsd  (%rax),%xmm2
mulsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    1719 <lb_kim_hierarchy+0x619>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
jmp    173f <lb_kim_hierarchy+0x63f>
movsd  -0x70(%rbp),%xmm0
mov    -0x18(%rbp),%rax
subsd  (%rax),%xmm0
movsd  -0x70(%rbp),%xmm1
mov    -0x18(%rbp),%rax
subsd  (%rax),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  -0xb8(%rbp),%xmm0
ff
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
ucomisd -0x38(%rbp),%xmm0
jb     177a <lb_kim_hierarchy+0x67a>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1a79 <lb_kim_hierarchy+0x979>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x3,%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x28(%rbp),%xmm0
divsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x58(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm1
movsd  -0x58(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
mulsd  %xmm0,%xmm1
movsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x68(%rbp),%xmm2
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    184b <lb_kim_hierarchy+0x74b>
movsd  -0x58(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x58(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
jmp    1885 <lb_kim_hierarchy+0x785>
movsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x68(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  -0x78(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x78(%rbp),%xmm2
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    18e5 <lb_kim_hierarchy+0x7e5>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
jmp    191f <lb_kim_hierarchy+0x81f>
movsd  -0x78(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x78(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  -0xc8(%rbp),%xmm0
ff
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  -0x78(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x78(%rbp),%xmm2
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    197f <lb_kim_hierarchy+0x87f>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
jmp    19b9 <lb_kim_hierarchy+0x8b9>
movsd  -0x78(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x78(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  -0xd0(%rbp),%xmm0
ff
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  -0x78(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x78(%rbp),%xmm2
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    1a19 <lb_kim_hierarchy+0x919>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
jmp    1a53 <lb_kim_hierarchy+0x953>
movsd  -0x78(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  -0x78(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
movsd  -0xd8(%rbp),%xmm0
ff
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x58,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<lb_kim_hierarchy>:
movapd %xmm0,%xmm13
movslq %edx,%r8
movsd  (%rdi,%r8,8),%xmm6
subsd  %xmm0,%xmm6
divsd  %xmm1,%xmm6
lea    -0x1(%rcx,%r8,1),%eax
cltq
movsd  (%rdi,%rax,8),%xmm4
subsd  %xmm0,%xmm4
divsd  %xmm1,%xmm4
movsd  (%rsi),%xmm12
movapd %xmm6,%xmm0
subsd  %xmm12,%xmm0
movslq %ecx,%rcx
movsd  -0x8(%rsi,%rcx,8),%xmm9
movapd %xmm4,%xmm5
subsd  %xmm9,%xmm5
mulsd  %xmm5,%xmm5
mulsd  %xmm0,%xmm0
addsd  %xmm5,%xmm0
ucomisd %xmm2,%xmm0
jae    12f6 <lb_kim_hierarchy+0x1f6>
movsd  0x8(%rdi,%r8,8),%xmm5
subsd  %xmm13,%xmm5
divsd  %xmm1,%xmm5
movsd  0x8(%rsi),%xmm10
movapd %xmm5,%xmm7
unpcklpd %xmm6,%xmm7
movapd %xmm12,%xmm3
unpcklpd %xmm10,%xmm3
subpd  %xmm3,%xmm7
mulpd  %xmm7,%xmm7
movapd %xmm7,%xmm3
unpckhpd %xmm7,%xmm3
minsd  %xmm3,%xmm7
movapd %xmm5,%xmm3
subsd  %xmm10,%xmm3
mulsd  %xmm3,%xmm3
minsd  %xmm3,%xmm7
addsd  %xmm7,%xmm0
ucomisd %xmm2,%xmm0
jae    12f6 <lb_kim_hierarchy+0x1f6>
lea    (%rcx,%rdx,1),%eax
add    $0xfffffffe,%eax
cltq
movsd  (%rdi,%rax,8),%xmm11
subsd  %xmm13,%xmm11
divsd  %xmm1,%xmm11
movsd  -0x10(%rsi,%rcx,8),%xmm8
movapd %xmm11,%xmm3
unpcklpd %xmm4,%xmm3
movapd %xmm9,%xmm7
unpcklpd %xmm8,%xmm7
subpd  %xmm7,%xmm3
mulpd  %xmm3,%xmm3
movapd %xmm3,%xmm7
unpckhpd %xmm3,%xmm7
minsd  %xmm7,%xmm3
movapd %xmm11,%xmm7
subsd  %xmm8,%xmm7
mulsd  %xmm7,%xmm7
minsd  %xmm7,%xmm3
addsd  %xmm3,%xmm0
ucomisd %xmm2,%xmm0
jae    12f6 <lb_kim_hierarchy+0x1f6>
movsd  0x10(%rdi,%r8,8),%xmm7
subsd  %xmm13,%xmm7
divsd  %xmm1,%xmm7
movsd  0x10(%rsi),%xmm3
unpcklpd %xmm5,%xmm6
movapd %xmm7,%xmm5
subsd  %xmm3,%xmm5
unpcklpd %xmm3,%xmm3
subpd  %xmm3,%xmm6
mulpd  %xmm6,%xmm6
movapd %xmm6,%xmm3
unpckhpd %xmm6,%xmm3
minsd  %xmm3,%xmm6
mulsd  %xmm5,%xmm5
minsd  %xmm5,%xmm6
movapd %xmm7,%xmm3
subsd  %xmm10,%xmm3
mulsd  %xmm3,%xmm3
minsd  %xmm3,%xmm6
subsd  %xmm12,%xmm7
mulsd  %xmm7,%xmm7
minsd  %xmm7,%xmm6
addsd  %xmm6,%xmm0
ucomisd %xmm2,%xmm0
jae    12f6 <lb_kim_hierarchy+0x1f6>
lea    (%rcx,%rdx,1),%eax
add    $0xfffffffd,%eax
cltq
movsd  (%rdi,%rax,8),%xmm2
subsd  %xmm13,%xmm2
divsd  %xmm1,%xmm2
movsd  -0x18(%rsi,%rcx,8),%xmm1
unpcklpd %xmm11,%xmm4
movapd %xmm2,%xmm3
subsd  %xmm1,%xmm3
unpcklpd %xmm1,%xmm1
subpd  %xmm1,%xmm4
mulpd  %xmm4,%xmm4
movapd %xmm4,%xmm1
unpckhpd %xmm4,%xmm1
minsd  %xmm1,%xmm4
mulsd  %xmm3,%xmm3
minsd  %xmm3,%xmm4
movapd %xmm2,%xmm1
subsd  %xmm8,%xmm1
mulsd  %xmm1,%xmm1
minsd  %xmm1,%xmm4
subsd  %xmm9,%xmm2
mulsd  %xmm2,%xmm2
minsd  %xmm2,%xmm4
addsd  %xmm4,%xmm0
ret

LLVM IR (-O0):
define double @lb_kim_hierarchy(double* %0, double* %1, i32 %2, i32 %3, double %4, double %5, double %6) {
%8 = alloca double
%9 = alloca double*
%10 = alloca double*
%11 = alloca i32
%12 = alloca i32
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca double
store double* %0, double** %9
store double* %1, double** %10
store i32 %2, i32* %11
store i32 %3, i32* %12
store double %4, double* %13
store double %5, double* %14
store double %6, double* %15
%24 = load double*, double** %9
%25 = load i32, i32* %11
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds double, double* %24, i64 %26
%28 = load double, double* %27
%29 = load double, double* %13
%30 = fsub double %28, %29
%31 = load double, double* %14
%32 = fdiv double %30, %31
store double %32, double* %18
%33 = load double*, double** %9
%34 = load i32, i32* %12
%35 = sub nsw i32 %34, 1
%36 = load i32, i32* %11
%37 = add nsw i32 %35, %36
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds double, double* %33, i64 %38
%40 = load double, double* %39
%41 = load double, double* %13
%42 = fsub double %40, %41
%43 = load double, double* %14
%44 = fdiv double %42, %43
store double %44, double* %19
%45 = load double, double* %18
%46 = load double*, double** %10
%47 = getelementptr inbounds double, double* %46, i64 0
%48 = load double, double* %47
%49 = fsub double %45, %48
%50 = load double, double* %18
%51 = load double*, double** %10
%52 = getelementptr inbounds double, double* %51, i64 0
%53 = load double, double* %52
%54 = fsub double %50, %53
%55 = load double, double* %19
%56 = load double*, double** %10
%57 = load i32, i32* %12
%58 = sub nsw i32 %57, 1
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds double, double* %56, i64 %59
%61 = load double, double* %60
%62 = fsub double %55, %61
%63 = load double, double* %19
%64 = load double*, double** %10
%65 = load i32, i32* %12
%66 = sub nsw i32 %65, 1
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds double, double* %64, i64 %67
%69 = load double, double* %68
%70 = fsub double %63, %69
%71 = fmul double %62, %70
%72 = call double @llvm.fmuladd.f64(double %49, double %54, double %71)
store double %72, double* %17
%73 = load double, double* %17
%74 = load double, double* %15
%75 = fcmp oge double %73, %74
br i1 %75, label %76, label %78
76: ; preds = %7
%77 = load double, double* %17
store double %77, double* %8
br label %678
78: ; preds = %7
%79 = load double*, double** %9
%80 = load i32, i32* %11
%81 = add nsw i32 %80, 1
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds double, double* %79, i64 %82
%84 = load double, double* %83
%85 = load double, double* %13
%86 = fsub double %84, %85
%87 = load double, double* %14
%88 = fdiv double %86, %87
store double %88, double* %20
%89 = load double, double* %20
%90 = load double*, double** %10
%91 = getelementptr inbounds double, double* %90, i64 0
%92 = load double, double* %91
%93 = fsub double %89, %92
%94 = load double, double* %20
%95 = load double*, double** %10
%96 = getelementptr inbounds double, double* %95, i64 0
%97 = load double, double* %96
%98 = fsub double %94, %97
%99 = fmul double %93, %98
%100 = load double, double* %18
%101 = load double*, double** %10
%102 = getelementptr inbounds double, double* %101, i64 1
%103 = load double, double* %102
%104 = fsub double %100, %103
%105 = load double, double* %18
%106 = load double*, double** %10
%107 = getelementptr inbounds double, double* %106, i64 1
%108 = load double, double* %107
%109 = fsub double %105, %108
%110 = fmul double %104, %109
%111 = fcmp olt double %99, %110
br i1 %111, label %112, label %124
112: ; preds = %78
%113 = load double, double* %20
%114 = load double*, double** %10
%115 = getelementptr inbounds double, double* %114, i64 0
%116 = load double, double* %115
%117 = fsub double %113, %116
%118 = load double, double* %20
%119 = load double*, double** %10
%120 = getelementptr inbounds double, double* %119, i64 0
%121 = load double, double* %120
%122 = fsub double %118, %121
%123 = fmul double %117, %122
br label %136
124: ; preds = %78
%125 = load double, double* %18
%126 = load double*, double** %10
%127 = getelementptr inbounds double, double* %126, i64 1
%128 = load double, double* %127
%129 = fsub double %125, %128
%130 = load double, double* %18
%131 = load double*, double** %10
%132 = getelementptr inbounds double, double* %131, i64 1
%133 = load double, double* %132
%134 = fsub double %130, %133
%135 = fmul double %129, %134
br label %136
136: ; preds = %124, %112
%137 = phi double [ %123, %112 ], [ %135, %124 ]
store double %137, double* %16
%138 = load double, double* %16
%139 = load double, double* %20
%140 = load double*, double** %10
%141 = getelementptr inbounds double, double* %140, i64 1
%142 = load double, double* %141
%143 = fsub double %139, %142
%144 = load double, double* %20
%145 = load double*, double** %10
%146 = getelementptr inbounds double, double* %145, i64 1
%147 = load double, double* %146
%148 = fsub double %144, %147
%149 = fmul double %143, %148
%150 = fcmp olt double %138, %149
br i1 %150, label %151, label %153
151: ; preds = %136
%152 = load double, double* %16
br label %165
153: ; preds = %136
%154 = load double, double* %20
%155 = load double*, double** %10
%156 = getelementptr inbounds double, double* %155, i64 1
%157 = load double, double* %156
%158 = fsub double %154, %157
%159 = load double, double* %20
%160 = load double*, double** %10
%161 = getelementptr inbounds double, double* %160, i64 1
%162 = load double, double* %161
%163 = fsub double %159, %162
%164 = fmul double %158, %163
br label %165
165: ; preds = %153, %151
%166 = phi double [ %152, %151 ], [ %164, %153 ]
store double %166, double* %16
%167 = load double, double* %16
%168 = load double, double* %17
%169 = fadd double %168, %167
store double %169, double* %17
%170 = load double, double* %17
%171 = load double, double* %15
%172 = fcmp oge double %170, %171
br i1 %172, label %173, label %175
173: ; preds = %165
%174 = load double, double* %17
store double %174, double* %8
br label %678
175: ; preds = %165
%176 = load double*, double** %9
%177 = load i32, i32* %12
%178 = sub nsw i32 %177, 2
%179 = load i32, i32* %11
%180 = add nsw i32 %178, %179
%181 = sext i32 %180 to i64
%182 = getelementptr inbounds double, double* %176, i64 %181
%183 = load double, double* %182
%184 = load double, double* %13
%185 = fsub double %183, %184
%186 = load double, double* %14
%187 = fdiv double %185, %186
store double %187, double* %21
%188 = load double, double* %21
%189 = load double*, double** %10
%190 = load i32, i32* %12
%191 = sub nsw i32 %190, 1
%192 = sext i32 %191 to i64
%193 = getelementptr inbounds double, double* %189, i64 %192
%194 = load double, double* %193
%195 = fsub double %188, %194
%196 = load double, double* %21
%197 = load double*, double** %10
%198 = load i32, i32* %12
%199 = sub nsw i32 %198, 1
%200 = sext i32 %199 to i64
%201 = getelementptr inbounds double, double* %197, i64 %200
%202 = load double, double* %201
%203 = fsub double %196, %202
%204 = fmul double %195, %203
%205 = load double, double* %19
%206 = load double*, double** %10
%207 = load i32, i32* %12
%208 = sub nsw i32 %207, 2
%209 = sext i32 %208 to i64
%210 = getelementptr inbounds double, double* %206, i64 %209
%211 = load double, double* %210
%212 = fsub double %205, %211
%213 = load double, double* %19
%214 = load double*, double** %10
%215 = load i32, i32* %12
%216 = sub nsw i32 %215, 2
%217 = sext i32 %216 to i64
%218 = getelementptr inbounds double, double* %214, i64 %217
%219 = load double, double* %218
%220 = fsub double %213, %219
%221 = fmul double %212, %220
%222 = fcmp olt double %204, %221
br i1 %222, label %223, label %241
223: ; preds = %175
%224 = load double, double* %21
%225 = load double*, double** %10
%226 = load i32, i32* %12
%227 = sub nsw i32 %226, 1
%228 = sext i32 %227 to i64
%229 = getelementptr inbounds double, double* %225, i64 %228
%230 = load double, double* %229
%231 = fsub double %224, %230
%232 = load double, double* %21
%233 = load double*, double** %10
%234 = load i32, i32* %12
%235 = sub nsw i32 %234, 1
%236 = sext i32 %235 to i64
%237 = getelementptr inbounds double, double* %233, i64 %236
%238 = load double, double* %237
%239 = fsub double %232, %238
%240 = fmul double %231, %239
br label %259
241: ; preds = %175
%242 = load double, double* %19
%243 = load double*, double** %10
%244 = load i32, i32* %12
%245 = sub nsw i32 %244, 2
%246 = sext i32 %245 to i64
%247 = getelementptr inbounds double, double* %243, i64 %246
%248 = load double, double* %247
%249 = fsub double %242, %248
%250 = load double, double* %19
%251 = load double*, double** %10
%252 = load i32, i32* %12
%253 = sub nsw i32 %252, 2
%254 = sext i32 %253 to i64
%255 = getelementptr inbounds double, double* %251, i64 %254
%256 = load double, double* %255
%257 = fsub double %250, %256
%258 = fmul double %249, %257
br label %259
259: ; preds = %241, %223
%260 = phi double [ %240, %223 ], [ %258, %241 ]
store double %260, double* %16
%261 = load double, double* %16
%262 = load double, double* %21
%263 = load double*, double** %10
%264 = load i32, i32* %12
%265 = sub nsw i32 %264, 2
%266 = sext i32 %265 to i64
%267 = getelementptr inbounds double, double* %263, i64 %266
%268 = load double, double* %267
%269 = fsub double %262, %268
%270 = load double, double* %21
%271 = load double*, double** %10
%272 = load i32, i32* %12
%273 = sub nsw i32 %272, 2
%274 = sext i32 %273 to i64
%275 = getelementptr inbounds double, double* %271, i64 %274
%276 = load double, double* %275
%277 = fsub double %270, %276
%278 = fmul double %269, %277
%279 = fcmp olt double %261, %278
br i1 %279, label %280, label %282
280: ; preds = %259
%281 = load double, double* %16
br label %300
282: ; preds = %259
%283 = load double, double* %21
%284 = load double*, double** %10
%285 = load i32, i32* %12
%286 = sub nsw i32 %285, 2
%287 = sext i32 %286 to i64
%288 = getelementptr inbounds double, double* %284, i64 %287
%289 = load double, double* %288
%290 = fsub double %283, %289
%291 = load double, double* %21
%292 = load double*, double** %10
%293 = load i32, i32* %12
%294 = sub nsw i32 %293, 2
%295 = sext i32 %294 to i64
%296 = getelementptr inbounds double, double* %292, i64 %295
%297 = load double, double* %296
%298 = fsub double %291, %297
%299 = fmul double %290, %298
br label %300
300: ; preds = %282, %280
%301 = phi double [ %281, %280 ], [ %299, %282 ]
store double %301, double* %16
%302 = load double, double* %16
%303 = load double, double* %17
%304 = fadd double %303, %302
store double %304, double* %17
%305 = load double, double* %17
%306 = load double, double* %15
%307 = fcmp oge double %305, %306
br i1 %307, label %308, label %310
308: ; preds = %300
%309 = load double, double* %17
store double %309, double* %8
br label %678
310: ; preds = %300
%311 = load double*, double** %9
%312 = load i32, i32* %11
%313 = add nsw i32 %312, 2
%314 = sext i32 %313 to i64
%315 = getelementptr inbounds double, double* %311, i64 %314
%316 = load double, double* %315
%317 = load double, double* %13
%318 = fsub double %316, %317
%319 = load double, double* %14
%320 = fdiv double %318, %319
store double %320, double* %22
%321 = load double, double* %18
%322 = load double*, double** %10
%323 = getelementptr inbounds double, double* %322, i64 2
%324 = load double, double* %323
%325 = fsub double %321, %324
%326 = load double, double* %18
%327 = load double*, double** %10
%328 = getelementptr inbounds double, double* %327, i64 2
%329 = load double, double* %328
%330 = fsub double %326, %329
%331 = fmul double %325, %330
%332 = load double, double* %20
%333 = load double*, double** %10
%334 = getelementptr inbounds double, double* %333, i64 2
%335 = load double, double* %334
%336 = fsub double %332, %335
%337 = load double, double* %20
%338 = load double*, double** %10
%339 = getelementptr inbounds double, double* %338, i64 2
%340 = load double, double* %339
%341 = fsub double %337, %340
%342 = fmul double %336, %341
%343 = fcmp olt double %331, %342
br i1 %343, label %344, label %356
344: ; preds = %310
%345 = load double, double* %18
%346 = load double*, double** %10
%347 = getelementptr inbounds double, double* %346, i64 2
%348 = load double, double* %347
%349 = fsub double %345, %348
%350 = load double, double* %18
%351 = load double*, double** %10
%352 = getelementptr inbounds double, double* %351, i64 2
%353 = load double, double* %352
%354 = fsub double %350, %353
%355 = fmul double %349, %354
br label %368
356: ; preds = %310
%357 = load double, double* %20
%358 = load double*, double** %10
%359 = getelementptr inbounds double, double* %358, i64 2
%360 = load double, double* %359
%361 = fsub double %357, %360
%362 = load double, double* %20
%363 = load double*, double** %10
%364 = getelementptr inbounds double, double* %363, i64 2
%365 = load double, double* %364
%366 = fsub double %362, %365
%367 = fmul double %361, %366
br label %368
368: ; preds = %356, %344
%369 = phi double [ %355, %344 ], [ %367, %356 ]
store double %369, double* %16
%370 = load double, double* %16
%371 = load double, double* %22
%372 = load double*, double** %10
%373 = getelementptr inbounds double, double* %372, i64 2
%374 = load double, double* %373
%375 = fsub double %371, %374
%376 = load double, double* %22
%377 = load double*, double** %10
%378 = getelementptr inbounds double, double* %377, i64 2
%379 = load double, double* %378
%380 = fsub double %376, %379
%381 = fmul double %375, %380
%382 = fcmp olt double %370, %381
br i1 %382, label %383, label %385
383: ; preds = %368
%384 = load double, double* %16
br label %397
385: ; preds = %368
%386 = load double, double* %22
%387 = load double*, double** %10
%388 = getelementptr inbounds double, double* %387, i64 2
%389 = load double, double* %388
%390 = fsub double %386, %389
%391 = load double, double* %22
%392 = load double*, double** %10
%393 = getelementptr inbounds double, double* %392, i64 2
%394 = load double, double* %393
%395 = fsub double %391, %394
%396 = fmul double %390, %395
br label %397
397: ; preds = %385, %383
%398 = phi double [ %384, %383 ], [ %396, %385 ]
store double %398, double* %16
%399 = load double, double* %16
%400 = load double, double* %22
%401 = load double*, double** %10
%402 = getelementptr inbounds double, double* %401, i64 1
%403 = load double, double* %402
%404 = fsub double %400, %403
%405 = load double, double* %22
%406 = load double*, double** %10
%407 = getelementptr inbounds double, double* %406, i64 1
%408 = load double, double* %407
%409 = fsub double %405, %408
%410 = fmul double %404, %409
%411 = fcmp olt double %399, %410
br i1 %411, label %412, label %414
412: ; preds = %397
%413 = load double, double* %16
br label %426
414: ; preds = %397
%415 = load double, double* %22
%416 = load double*, double** %10
%417 = getelementptr inbounds double, double* %416, i64 1
%418 = load double, double* %417
%419 = fsub double %415, %418
%420 = load double, double* %22
%421 = load double*, double** %10
%422 = getelementptr inbounds double, double* %421, i64 1
%423 = load double, double* %422
%424 = fsub double %420, %423
%425 = fmul double %419, %424
br label %426
426: ; preds = %414, %412
%427 = phi double [ %413, %412 ], [ %425, %414 ]
store double %427, double* %16
%428 = load double, double* %16
%429 = load double, double* %22
%430 = load double*, double** %10
%431 = getelementptr inbounds double, double* %430, i64 0
%432 = load double, double* %431
%433 = fsub double %429, %432
%434 = load double, double* %22
%435 = load double*, double** %10
%436 = getelementptr inbounds double, double* %435, i64 0
%437 = load double, double* %436
%438 = fsub double %434, %437
%439 = fmul double %433, %438
%440 = fcmp olt double %428, %439
br i1 %440, label %441, label %443
441: ; preds = %426
%442 = load double, double* %16
br label %455
443: ; preds = %426
%444 = load double, double* %22
%445 = load double*, double** %10
%446 = getelementptr inbounds double, double* %445, i64 0
%447 = load double, double* %446
%448 = fsub double %444, %447
%449 = load double, double* %22
%450 = load double*, double** %10
%451 = getelementptr inbounds double, double* %450, i64 0
%452 = load double, double* %451
%453 = fsub double %449, %452
%454 = fmul double %448, %453
br label %455
455: ; preds = %443, %441
%456 = phi double [ %442, %441 ], [ %454, %443 ]
store double %456, double* %16
%457 = load double, double* %16
%458 = load double, double* %17
%459 = fadd double %458, %457
store double %459, double* %17
%460 = load double, double* %17
%461 = load double, double* %15
%462 = fcmp oge double %460, %461
br i1 %462, label %463, label %465
463: ; preds = %455
%464 = load double, double* %17
store double %464, double* %8
br label %678
465: ; preds = %455
%466 = load double*, double** %9
%467 = load i32, i32* %12
%468 = sub nsw i32 %467, 3
%469 = load i32, i32* %11
%470 = add nsw i32 %468, %469
%471 = sext i32 %470 to i64
%472 = getelementptr inbounds double, double* %466, i64 %471
%473 = load double, double* %472
%474 = load double, double* %13
%475 = fsub double %473, %474
%476 = load double, double* %14
%477 = fdiv double %475, %476
store double %477, double* %23
%478 = load double, double* %19
%479 = load double*, double** %10
%480 = load i32, i32* %12
%481 = sub nsw i32 %480, 3
%482 = sext i32 %481 to i64
%483 = getelementptr inbounds double, double* %479, i64 %482
%484 = load double, double* %483
%485 = fsub double %478, %484
%486 = load double, double* %19
%487 = load double*, double** %10
%488 = load i32, i32* %12
%489 = sub nsw i32 %488, 3
%490 = sext i32 %489 to i64
%491 = getelementptr inbounds double, double* %487, i64 %490
%492 = load double, double* %491
%493 = fsub double %486, %492
%494 = fmul double %485, %493
%495 = load double, double* %21
%496 = load double*, double** %10
%497 = load i32, i32* %12
%498 = sub nsw i32 %497, 3
%499 = sext i32 %498 to i64
%500 = getelementptr inbounds double, double* %496, i64 %499
%501 = load double, double* %500
%502 = fsub double %495, %501
%503 = load double, double* %21
%504 = load double*, double** %10
%505 = load i32, i32* %12
%506 = sub nsw i32 %505, 3
%507 = sext i32 %506 to i64
%508 = getelementptr inbounds double, double* %504, i64 %507
%509 = load double, double* %508
%510 = fsub double %503, %509
%511 = fmul double %502, %510
%512 = fcmp olt double %494, %511
br i1 %512, label %513, label %531
513: ; preds = %465
%514 = load double, double* %19
%515 = load double*, double** %10
%516 = load i32, i32* %12
%517 = sub nsw i32 %516, 3
%518 = sext i32 %517 to i64
%519 = getelementptr inbounds double, double* %515, i64 %518
%520 = load double, double* %519
%521 = fsub double %514, %520
%522 = load double, double* %19
%523 = load double*, double** %10
%524 = load i32, i32* %12
%525 = sub nsw i32 %524, 3
%526 = sext i32 %525 to i64
%527 = getelementptr inbounds double, double* %523, i64 %526
%528 = load double, double* %527
%529 = fsub double %522, %528
%530 = fmul double %521, %529
br label %549
531: ; preds = %465
%532 = load double, double* %21
%533 = load double*, double** %10
%534 = load i32, i32* %12
%535 = sub nsw i32 %534, 3
%536 = sext i32 %535 to i64
%537 = getelementptr inbounds double, double* %533, i64 %536
%538 = load double, double* %537
%539 = fsub double %532, %538
%540 = load double, double* %21
%541 = load double*, double** %10
%542 = load i32, i32* %12
%543 = sub nsw i32 %542, 3
%544 = sext i32 %543 to i64
%545 = getelementptr inbounds double, double* %541, i64 %544
%546 = load double, double* %545
%547 = fsub double %540, %546
%548 = fmul double %539, %547
br label %549
549: ; preds = %531, %513
%550 = phi double [ %530, %513 ], [ %548, %531 ]
store double %550, double* %16
%551 = load double, double* %16
%552 = load double, double* %23
%553 = load double*, double** %10
%554 = load i32, i32* %12
%555 = sub nsw i32 %554, 3
%556 = sext i32 %555 to i64
%557 = getelementptr inbounds double, double* %553, i64 %556
%558 = load double, double* %557
%559 = fsub double %552, %558
%560 = load double, double* %23
%561 = load double*, double** %10
%562 = load i32, i32* %12
%563 = sub nsw i32 %562, 3
%564 = sext i32 %563 to i64
%565 = getelementptr inbounds double, double* %561, i64 %564
%566 = load double, double* %565
%567 = fsub double %560, %566
%568 = fmul double %559, %567
%569 = fcmp olt double %551, %568
br i1 %569, label %570, label %572
570: ; preds = %549
%571 = load double, double* %16
br label %590
572: ; preds = %549
%573 = load double, double* %23
%574 = load double*, double** %10
%575 = load i32, i32* %12
%576 = sub nsw i32 %575, 3
%577 = sext i32 %576 to i64
%578 = getelementptr inbounds double, double* %574, i64 %577
%579 = load double, double* %578
%580 = fsub double %573, %579
%581 = load double, double* %23
%582 = load double*, double** %10
%583 = load i32, i32* %12
%584 = sub nsw i32 %583, 3
%585 = sext i32 %584 to i64
%586 = getelementptr inbounds double, double* %582, i64 %585
%587 = load double, double* %586
%588 = fsub double %581, %587
%589 = fmul double %580, %588
br label %590
590: ; preds = %572, %570
%591 = phi double [ %571, %570 ], [ %589, %572 ]
store double %591, double* %16
%592 = load double, double* %16
%593 = load double, double* %23
%594 = load double*, double** %10
%595 = load i32, i32* %12
%596 = sub nsw i32 %595, 2
%597 = sext i32 %596 to i64
%598 = getelementptr inbounds double, double* %594, i64 %597
%599 = load double, double* %598
%600 = fsub double %593, %599
%601 = load double, double* %23
%602 = load double*, double** %10
%603 = load i32, i32* %12
%604 = sub nsw i32 %603, 2
%605 = sext i32 %604 to i64
%606 = getelementptr inbounds double, double* %602, i64 %605
%607 = load double, double* %606
%608 = fsub double %601, %607
%609 = fmul double %600, %608
%610 = fcmp olt double %592, %609
br i1 %610, label %611, label %613
611: ; preds = %590
%612 = load double, double* %16
br label %631
613: ; preds = %590
%614 = load double, double* %23
%615 = load double*, double** %10
%616 = load i32, i32* %12
%617 = sub nsw i32 %616, 2
%618 = sext i32 %617 to i64
%619 = getelementptr inbounds double, double* %615, i64 %618
%620 = load double, double* %619
%621 = fsub double %614, %620
%622 = load double, double* %23
%623 = load double*, double** %10
%624 = load i32, i32* %12
%625 = sub nsw i32 %624, 2
%626 = sext i32 %625 to i64
%627 = getelementptr inbounds double, double* %623, i64 %626
%628 = load double, double* %627
%629 = fsub double %622, %628
%630 = fmul double %621, %629
br label %631
631: ; preds = %613, %611
%632 = phi double [ %612, %611 ], [ %630, %613 ]
store double %632, double* %16
%633 = load double, double* %16
%634 = load double, double* %23
%635 = load double*, double** %10
%636 = load i32, i32* %12
%637 = sub nsw i32 %636, 1
%638 = sext i32 %637 to i64
%639 = getelementptr inbounds double, double* %635, i64 %638
%640 = load double, double* %639
%641 = fsub double %634, %640
%642 = load double, double* %23
%643 = load double*, double** %10
%644 = load i32, i32* %12
%645 = sub nsw i32 %644, 1
%646 = sext i32 %645 to i64
%647 = getelementptr inbounds double, double* %643, i64 %646
%648 = load double, double* %647
%649 = fsub double %642, %648
%650 = fmul double %641, %649
%651 = fcmp olt double %633, %650
br i1 %651, label %652, label %654
652: ; preds = %631
%653 = load double, double* %16
br label %672
654: ; preds = %631
%655 = load double, double* %23
%656 = load double*, double** %10
%657 = load i32, i32* %12
%658 = sub nsw i32 %657, 1
%659 = sext i32 %658 to i64
%660 = getelementptr inbounds double, double* %656, i64 %659
%661 = load double, double* %660
%662 = fsub double %655, %661
%663 = load double, double* %23
%664 = load double*, double** %10
%665 = load i32, i32* %12
%666 = sub nsw i32 %665, 1
%667 = sext i32 %666 to i64
%668 = getelementptr inbounds double, double* %664, i64 %667
%669 = load double, double* %668
%670 = fsub double %663, %669
%671 = fmul double %662, %670
br label %672
672: ; preds = %654, %652
%673 = phi double [ %653, %652 ], [ %671, %654 ]
store double %673, double* %16
%674 = load double, double* %16
%675 = load double, double* %17
%676 = fadd double %675, %674
store double %676, double* %17
%677 = load double, double* %17
store double %677, double* %8
br label %678
678: ; preds = %672, %463, %308, %173, %76
%679 = load double, double* %8
ret double %679
}

LLVM IR (-O2):
define double @lb_kim_hierarchy(double* nocapture %0, double* nocapture %1, i32 %2, i32 %3, double %4, double %5, double %6) {
%8 = sext i32 %2 to i64
%9 = getelementptr inbounds double, double* %0, i64 %8
%10 = load double, double* %9
%11 = fsub double %10, %4
%12 = fdiv double %11, %5
%13 = add nsw i32 %3, -1
%14 = add nsw i32 %13, %2
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds double, double* %0, i64 %15
%17 = load double, double* %16
%18 = fsub double %17, %4
%19 = fdiv double %18, %5
%20 = load double, double* %1
%21 = fsub double %12, %20
%22 = sext i32 %13 to i64
%23 = getelementptr inbounds double, double* %1, i64 %22
%24 = load double, double* %23
%25 = fsub double %19, %24
%26 = fmul double %25, %25
%27 = tail call double @llvm.fmuladd.f64(double %21, double %21, double %26)
%28 = fcmp ult double %27, %6
br i1 %28, label %29, label %148
29: ; preds = %7
%30 = add nsw i32 %2, 1
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds double, double* %0, i64 %31
%33 = load double, double* %32
%34 = fsub double %33, %4
%35 = fdiv double %34, %5
%36 = getelementptr inbounds double, double* %1, i64 1
%37 = load double, double* %36
%38 = insertelement <2 x double> poison, double %35, i64 0
%39 = insertelement <2 x double> %38, double %12, i64 1
%40 = insertelement <2 x double> poison, double %20, i64 0
%41 = insertelement <2 x double> %40, double %37, i64 1
%42 = fsub <2 x double> %39, %41
%43 = fmul <2 x double> %42, %42
%44 = extractelement <2 x double> %43, i64 0
%45 = extractelement <2 x double> %43, i64 1
%46 = fcmp olt double %44, %45
%47 = select i1 %46, double %44, double %45
%48 = fsub double %35, %37
%49 = fmul double %48, %48
%50 = fcmp olt double %47, %49
%51 = select i1 %50, double %47, double %49
%52 = fadd double %27, %51
%53 = fcmp ult double %52, %6
br i1 %53, label %54, label %148
54: ; preds = %29
%55 = add nsw i32 %3, -2
%56 = add nsw i32 %55, %2
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds double, double* %0, i64 %57
%59 = load double, double* %58
%60 = fsub double %59, %4
%61 = fdiv double %60, %5
%62 = sext i32 %55 to i64
%63 = getelementptr inbounds double, double* %1, i64 %62
%64 = load double, double* %63
%65 = insertelement <2 x double> poison, double %61, i64 0
%66 = insertelement <2 x double> %65, double %19, i64 1
%67 = insertelement <2 x double> poison, double %24, i64 0
%68 = insertelement <2 x double> %67, double %64, i64 1
%69 = fsub <2 x double> %66, %68
%70 = fmul <2 x double> %69, %69
%71 = extractelement <2 x double> %70, i64 0
%72 = extractelement <2 x double> %70, i64 1
%73 = fcmp olt double %71, %72
%74 = select i1 %73, double %71, double %72
%75 = fsub double %61, %64
%76 = fmul double %75, %75
%77 = fcmp olt double %74, %76
%78 = select i1 %77, double %74, double %76
%79 = fadd double %52, %78
%80 = fcmp ult double %79, %6
br i1 %80, label %81, label %148
81: ; preds = %54
%82 = add nsw i32 %2, 2
%83 = sext i32 %82 to i64
%84 = getelementptr inbounds double, double* %0, i64 %83
%85 = load double, double* %84
%86 = fsub double %85, %4
%87 = fdiv double %86, %5
%88 = getelementptr inbounds double, double* %1, i64 2
%89 = load double, double* %88
%90 = insertelement <2 x double> poison, double %12, i64 0
%91 = insertelement <2 x double> %90, double %35, i64 1
%92 = insertelement <2 x double> poison, double %89, i64 0
%93 = shufflevector <2 x double> %92, <2 x double> poison, <2 x i32> zeroinitializer
%94 = fsub <2 x double> %91, %93
%95 = fmul <2 x double> %94, %94
%96 = extractelement <2 x double> %95, i64 0
%97 = extractelement <2 x double> %95, i64 1
%98 = fcmp olt double %96, %97
%99 = select i1 %98, double %96, double %97
%100 = fsub double %87, %89
%101 = fmul double %100, %100
%102 = fcmp olt double %99, %101
%103 = select i1 %102, double %99, double %101
%104 = fsub double %87, %37
%105 = fmul double %104, %104
%106 = fcmp olt double %103, %105
%107 = select i1 %106, double %103, double %105
%108 = fsub double %87, %20
%109 = fmul double %108, %108
%110 = fcmp olt double %107, %109
%111 = select i1 %110, double %107, double %109
%112 = fadd double %79, %111
%113 = fcmp ult double %112, %6
br i1 %113, label %114, label %148
114: ; preds = %81
%115 = add nsw i32 %3, -3
%116 = add nsw i32 %115, %2
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds double, double* %0, i64 %117
%119 = load double, double* %118
%120 = fsub double %119, %4
%121 = fdiv double %120, %5
%122 = sext i32 %115 to i64
%123 = getelementptr inbounds double, double* %1, i64 %122
%124 = load double, double* %123
%125 = insertelement <2 x double> poison, double %19, i64 0
%126 = insertelement <2 x double> %125, double %61, i64 1
%127 = insertelement <2 x double> poison, double %124, i64 0
%128 = shufflevector <2 x double> %127, <2 x double> poison, <2 x i32> zeroinitializer
%129 = fsub <2 x double> %126, %128
%130 = fmul <2 x double> %129, %129
%131 = extractelement <2 x double> %130, i64 0
%132 = extractelement <2 x double> %130, i64 1
%133 = fcmp olt double %131, %132
%134 = select i1 %133, double %131, double %132
%135 = fsub double %121, %124
%136 = fmul double %135, %135
%137 = fcmp olt double %134, %136
%138 = select i1 %137, double %134, double %136
%139 = fsub double %121, %64
%140 = fmul double %139, %139
%141 = fcmp olt double %138, %140
%142 = select i1 %141, double %138, double %140
%143 = fsub double %121, %24
%144 = fmul double %143, %143
%145 = fcmp olt double %142, %144
%146 = select i1 %145, double %142, double %144
%147 = fadd double %112, %146
br label %148
148: ; preds = %29, %114, %81, %54, %7
%149 = phi double [ %27, %7 ], [ %52, %29 ], [ %79, %54 ], [ %147, %114 ], [ %112, %81 ]
ret double %149
}