void kernel_dsyrk_dpotrf_nt_2x2_vs_lib4(int km, int kn, int tri, int kadd,
                                        int ksub, double *Ap, double *Bp,
                                        double *Am, double *Bm, double *C,
                                        double *D, double *fact, int alg,
                                        int fast_rsqrt) {
  const int bs = 4;
  int k;
  double a_0, a_1, b_0, b_1, c_00 = 0, c_10 = 0, c_11 = 0;
  k = 0;
  if (kadd > 0) {
    if (tri == 1) {
      if (kadd >= 2) {
        a_0 = Ap[0 + bs * 0];
        b_0 = Bp[0 + bs * 0];
        c_00 += a_0 * b_0;
        a_0 = Ap[0 + bs * 1];
        a_1 = Ap[1 + bs * 1];
        b_0 = Bp[0 + bs * 1];
        b_1 = Bp[1 + bs * 1];
        c_00 += a_0 * b_0;
        c_10 += a_1 * b_0;
        c_11 += a_1 * b_1;
        Ap += 8;
        Bp += 8;
        k += 2;
      } else {
        a_0 = Ap[0 + bs * 0];
        b_0 = Bp[0 + bs * 0];
        c_00 += a_0 * b_0;
        k += 1;
      }
    }
    for (; k < kadd - 3; k += 4) {
      a_0 = Ap[0 + bs * 0];
      a_1 = Ap[1 + bs * 0];
      b_0 = Bp[0 + bs * 0];
      b_1 = Bp[1 + bs * 0];
      c_00 += a_0 * b_0;
      c_10 += a_1 * b_0;
      c_11 += a_1 * b_1;
      a_0 = Ap[0 + bs * 1];
      a_1 = Ap[1 + bs * 1];
      b_0 = Bp[0 + bs * 1];
      b_1 = Bp[1 + bs * 1];
      c_00 += a_0 * b_0;
      c_10 += a_1 * b_0;
      c_11 += a_1 * b_1;
      a_0 = Ap[0 + bs * 2];
      a_1 = Ap[1 + bs * 2];
      b_0 = Bp[0 + bs * 2];
      b_1 = Bp[1 + bs * 2];
      c_00 += a_0 * b_0;
      c_10 += a_1 * b_0;
      c_11 += a_1 * b_1;
      a_0 = Ap[0 + bs * 3];
      a_1 = Ap[1 + bs * 3];
      b_0 = Bp[0 + bs * 3];
      b_1 = Bp[1 + bs * 3];
      c_00 += a_0 * b_0;
      c_10 += a_1 * b_0;
      c_11 += a_1 * b_1;
      Ap += 16;
      Bp += 16;
    }
    for (; k < kadd; k++) {
      a_0 = Ap[0 + bs * 0];
      a_1 = Ap[1 + bs * 0];
      b_0 = Bp[0 + bs * 0];
      b_1 = Bp[1 + bs * 0];
      c_00 += a_0 * b_0;
      c_10 += a_1 * b_0;
      c_11 += a_1 * b_1;
      Ap += 4;
      Bp += 4;
    }
  }
  for (k = 0; k < ksub - 3; k += 4) {
    a_0 = Am[0 + bs * 0];
    a_1 = Am[1 + bs * 0];
    b_0 = Bm[0 + bs * 0];
    b_1 = Bm[1 + bs * 0];
    c_00 -= a_0 * b_0;
    c_10 -= a_1 * b_0;
    c_11 -= a_1 * b_1;
    a_0 = Am[0 + bs * 1];
    a_1 = Am[1 + bs * 1];
    b_0 = Bm[0 + bs * 1];
    b_1 = Bm[1 + bs * 1];
    c_00 -= a_0 * b_0;
    c_10 -= a_1 * b_0;
    c_11 -= a_1 * b_1;
    a_0 = Am[0 + bs * 2];
    a_1 = Am[1 + bs * 2];
    b_0 = Bm[0 + bs * 2];
    b_1 = Bm[1 + bs * 2];
    c_00 -= a_0 * b_0;
    c_10 -= a_1 * b_0;
    c_11 -= a_1 * b_1;
    a_0 = Am[0 + bs * 3];
    a_1 = Am[1 + bs * 3];
    b_0 = Bm[0 + bs * 3];
    b_1 = Bm[1 + bs * 3];
    c_00 -= a_0 * b_0;
    c_10 -= a_1 * b_0;
    c_11 -= a_1 * b_1;
    Am += 16;
    Bm += 16;
  }
  if (alg != 0) {
    c_00 += C[0 + bs * 0];
    c_10 += C[1 + bs * 0];
    c_11 += C[1 + bs * 1];
  }
  if (c_00 > 1e-15) {
    c_00 = sqrt(c_00);
    D[0 + bs * 0] = c_00;
    c_00 = 1.0 / c_00;
    fact[0] = c_00;
    c_10 *= c_00;
  } else {
    c_00 = 0.0;
    D[0 + bs * 0] = c_00;
    fact[0] = c_00;
  }
  if (km >= 2) {
    D[1 + bs * 0] = c_10;
    fact[1] = c_10;
  }
  if (kn == 1)
    return;
  c_11 -= c_10 * c_10;
  if (c_11 > 1e-15) {
    c_11 = sqrt(c_11);
    D[1 + bs * 1] = c_11;
    c_11 = 1.0 / c_11;
    fact[2] = c_11;
  } else {
    c_11 = 0.0;
    D[1 + bs * 1] = c_11;
    fact[2] = c_11;
  }
}


x86 assembly (clang, -O0):
<kernel_dsyrk_dpotrf_nt_2x2_vs_lib4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    0x48(%rbp),%eax
mov    0x40(%rbp),%eax
mov    0x38(%rbp),%rax
mov    0x30(%rbp),%rax
mov    0x28(%rbp),%rax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    %r9,-0x20(%rbp)
movl   $0x4,-0x24(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
movl   $0x0,-0x28(%rbp)
cmpl   $0x0,-0x10(%rbp)
jle    15ee <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x4de>
cmpl   $0x1,-0xc(%rbp)
jne    12ba <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x1aa>
cmpl   $0x2,-0x10(%rbp)
jl     1276 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x166>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x20(%rbp)
mov    0x10(%rbp),%rax
add    $0x40,%rax
mov    %rax,0x10(%rbp)
mov    -0x28(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x28(%rbp)
jmp    12b5 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x1a5>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    12ba <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x1aa>
jmp    12bf <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x1af>
mov    -0x28(%rbp),%eax
mov    -0x10(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1528 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x418>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x20(%rbp)
mov    0x10(%rbp),%rax
add    $0x80,%rax
mov    %rax,0x10(%rbp)
mov    -0x28(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x28(%rbp)
jmp    12bf <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x1af>
jmp    152d <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x41d>
mov    -0x28(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    15e9 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x4d9>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    0x10(%rbp),%rax
add    $0x20,%rax
mov    %rax,0x10(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    152d <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x41d>
jmp    15ee <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x4de>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1972 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x862>
mov    0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    0x18(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    0x18(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    0x20(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    0x20(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    0x18(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    0x18(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    0x20(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    0x20(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    0x18(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    0x18(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    0x20(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    0x20(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    0x18(%rbp),%rax
add    $0x80,%rax
mov    %rax,0x18(%rbp)
mov    0x20(%rbp),%rax
add    $0x80,%rax
mov    %rax,0x20(%rbp)
mov    -0x28(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x28(%rbp)
jmp    15f5 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x4e5>
cmpl   $0x0,0x40(%rbp)
je     19b4 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x8a4>
mov    0x28(%rbp),%rax
movsd  (%rax),%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
addsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    0x28(%rbp),%rax
movsd  0x28(%rax),%xmm0
addsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  0x63f(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1a1a <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x90a>
movsd  -0x50(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
mov    0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0x619(%rip),%xmm0
divsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
mov    0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x50(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    1a3c <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x92c>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
mov    0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x50(%rbp),%xmm0
mov    0x38(%rbp),%rax
movsd  %xmm0,(%rax)
cmpl   $0x2,-0x4(%rbp)
jl     1a62 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x952>
movsd  -0x58(%rbp),%xmm0
mov    0x30(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x58(%rbp),%xmm0
mov    0x38(%rbp),%rax
movsd  %xmm0,0x8(%rax)
cmpl   $0x1,-0x8(%rbp)
jne    1a71 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x961>
jmp    1b21 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0xa11>
movsd  -0x58(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm0
movsd  0x54f(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1afd <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x9ed>
movsd  -0x60(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    0x30(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  0x528(%rip),%xmm0
divsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    0x38(%rbp),%rax
movsd  %xmm0,0x10(%rax)
jmp    1b21 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0xa11>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    0x30(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x60(%rbp),%xmm0
mov    0x38(%rbp),%rax
movsd  %xmm0,0x10(%rax)
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dsyrk_dpotrf_nt_2x2_vs_lib4>:
push   %rbp
push   %r15
push   %r14
push   %rbx
sub    $0x18,%rsp
mov    %esi,%r14d
mov    %edi,%r15d
test   %ecx,%ecx
jle    1185 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x75>
mov    0x40(%rsp),%rax
xorpd  %xmm7,%xmm7
cmp    $0x1,%edx
jne    1192 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x82>
movsd  (%r9),%xmm0
mulsd  (%rax),%xmm0
xorpd  %xmm1,%xmm1
addsd  %xmm0,%xmm1
mov    $0x1,%edx
cmp    $0x2,%ecx
jb     1198 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x88>
movupd 0x20(%rax),%xmm0
movsd  0x20(%r9),%xmm2
mulsd  %xmm0,%xmm2
addsd  %xmm2,%xmm1
movsd  0x28(%r9),%xmm3
unpcklpd %xmm3,%xmm3
mulpd  %xmm0,%xmm3
xorpd  %xmm7,%xmm7
addpd  %xmm3,%xmm7
add    $0x40,%r9
add    $0x40,%rax
mov    $0x2,%edx
jmp    1198 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x88>
xorpd  %xmm2,%xmm2
xorpd  %xmm0,%xmm0
jmp    1333 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x223>
xorpd  %xmm1,%xmm1
xor    %edx,%edx
lea    -0x3(%rcx),%esi
cmp    %esi,%edx
jge    126a <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x15a>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movupd (%rax),%xmm6
movupd 0x20(%rax),%xmm10
movupd 0x40(%rax),%xmm9
movupd 0x60(%rax),%xmm8
movsd  (%r9),%xmm4
mulsd  %xmm6,%xmm4
addsd  %xmm1,%xmm4
movsd  0x8(%r9),%xmm1
movsd  0x28(%r9),%xmm5
movsd  0x48(%r9),%xmm3
movsd  0x68(%r9),%xmm0
unpcklpd %xmm1,%xmm1
mulpd  %xmm6,%xmm1
addpd  %xmm7,%xmm1
movsd  0x20(%r9),%xmm2
mulsd  %xmm10,%xmm2
addsd  %xmm4,%xmm2
unpcklpd %xmm5,%xmm5
mulpd  %xmm10,%xmm5
addpd  %xmm1,%xmm5
movsd  0x40(%r9),%xmm4
mulsd  %xmm9,%xmm4
addsd  %xmm2,%xmm4
unpcklpd %xmm3,%xmm3
mulpd  %xmm9,%xmm3
addpd  %xmm5,%xmm3
movsd  0x60(%r9),%xmm1
mulsd  %xmm8,%xmm1
addsd  %xmm4,%xmm1
unpcklpd %xmm0,%xmm0
mulpd  %xmm8,%xmm0
movapd %xmm0,%xmm7
addpd  %xmm3,%xmm7
sub    $0xffffffffffffff80,%r9
sub    $0xffffffffffffff80,%rax
add    $0x4,%edx
cmp    %esi,%edx
jl     11b0 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0xa0>
addpd  %xmm3,%xmm0
movapd %xmm0,%xmm7
cmp    %ecx,%edx
jge    1285 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x175>
mov    %ecx,%edi
sub    %edx,%edi
mov    %edx,%esi
not    %esi
test   $0x1,%dil
jne    1292 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x182>
add    %ecx,%esi
jne    12cc <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x1bc>
jmp    1333 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x223>
movapd %xmm1,%xmm0
movapd %xmm7,%xmm2
jmp    1333 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x223>
movupd (%rax),%xmm3
movsd  (%r9),%xmm0
mulsd  %xmm3,%xmm0
addsd  %xmm1,%xmm0
movsd  0x8(%r9),%xmm2
unpcklpd %xmm2,%xmm2
mulpd  %xmm3,%xmm2
addpd  %xmm7,%xmm2
add    $0x20,%r9
add    $0x20,%rax
add    $0x1,%edx
movapd %xmm0,%xmm1
movapd %xmm2,%xmm7
add    %ecx,%esi
je     1333 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x223>
sub    %edx,%ecx
xor    %edx,%edx
movupd (%rax,%rdx,1),%xmm3
movupd 0x20(%rax,%rdx,1),%xmm4
movsd  (%r9,%rdx,1),%xmm5
mulsd  %xmm3,%xmm5
addsd  %xmm1,%xmm5
movsd  0x8(%r9,%rdx,1),%xmm0
movsd  0x28(%r9,%rdx,1),%xmm2
unpcklpd %xmm0,%xmm0
mulpd  %xmm3,%xmm0
addpd  %xmm7,%xmm0
movsd  0x20(%r9,%rdx,1),%xmm1
mulsd  %xmm4,%xmm1
addsd  %xmm5,%xmm1
unpcklpd %xmm2,%xmm2
mulpd  %xmm4,%xmm2
movapd %xmm2,%xmm7
addpd  %xmm0,%xmm7
add    $0x40,%rdx
add    $0xfffffffe,%ecx
jne    12d0 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x1c0>
addpd  %xmm0,%xmm2
movapd %xmm1,%xmm0
mov    0x70(%rsp),%eax
cmp    $0x4,%r8d
jl     1470 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x360>
mov    0x50(%rsp),%rcx
mov    0x48(%rsp),%rdx
add    $0xfffffffd,%r8d
xor    %esi,%esi
movapd 0xca6(%rip),%xmm8
xor    %edi,%edi
nopl   0x0(%rax)
movapd %xmm2,%xmm9
movupd (%rcx,%rsi,1),%xmm6
movupd 0x20(%rcx,%rsi,1),%xmm5
movupd 0x40(%rcx,%rsi,1),%xmm11
movupd 0x60(%rcx,%rsi,1),%xmm10
movsd  (%rdx,%rsi,1),%xmm1
mulsd  %xmm6,%xmm1
subsd  %xmm1,%xmm0
movsd  0x8(%rdx,%rsi,1),%xmm4
movsd  0x28(%rdx,%rsi,1),%xmm3
movsd  0x48(%rdx,%rsi,1),%xmm7
movsd  0x68(%rdx,%rsi,1),%xmm12
movapd %xmm4,%xmm1
unpcklpd %xmm4,%xmm1
mulpd  %xmm6,%xmm1
subpd  %xmm1,%xmm2
movsd  0x20(%rdx,%rsi,1),%xmm1
mulsd  %xmm5,%xmm1
subsd  %xmm1,%xmm0
movapd %xmm3,%xmm1
unpcklpd %xmm3,%xmm1
mulpd  %xmm5,%xmm1
subpd  %xmm1,%xmm2
movsd  0x40(%rdx,%rsi,1),%xmm1
mulsd  %xmm11,%xmm1
subsd  %xmm1,%xmm0
movapd %xmm7,%xmm1
unpcklpd %xmm7,%xmm1
mulpd  %xmm11,%xmm1
subpd  %xmm1,%xmm2
movsd  0x60(%rdx,%rsi,1),%xmm1
mulsd  %xmm10,%xmm1
subsd  %xmm1,%xmm0
movapd %xmm12,%xmm1
unpcklpd %xmm12,%xmm1
mulpd  %xmm10,%xmm1
subpd  %xmm1,%xmm2
add    $0x4,%edi
sub    $0xffffffffffffff80,%rsi
cmp    %r8d,%edi
jl     1360 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x250>
xorpd  %xmm8,%xmm4
pshufd $0x44,%xmm4,%xmm1
xorpd  %xmm8,%xmm3
pshufd $0x44,%xmm3,%xmm3
xorpd  %xmm8,%xmm7
pshufd $0x44,%xmm7,%xmm4
xorpd  %xmm8,%xmm12
pshufd $0x44,%xmm12,%xmm2
mulpd  %xmm6,%xmm1
addpd  %xmm9,%xmm1
mulpd  %xmm5,%xmm3
addpd  %xmm1,%xmm3
mulpd  %xmm11,%xmm4
addpd  %xmm3,%xmm4
mulpd  %xmm10,%xmm2
addpd  %xmm4,%xmm2
test   %eax,%eax
je     148b <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x37b>
mov    0x58(%rsp),%rax
addsd  (%rax),%xmm0
movsd  0x8(%rax),%xmm1
movhpd 0x28(%rax),%xmm1
addpd  %xmm1,%xmm2
mov    0x68(%rsp),%rbx
mov    0x60(%rsp),%rbp
ucomisd 0xb73(%rip),%xmm0
jbe    14af <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x39f>
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     14ca <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x3ba>
sqrtsd %xmm0,%xmm0
jmp    14d9 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x3c9>
movq   $0x0,0x0(%rbp)
movq   $0x0,(%rbx)
movapd %xmm2,%xmm1
cmp    $0x2,%r15d
jge    14f8 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x3e8>
jmp    1502 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x3f2>
movapd %xmm2,(%rsp)
call   1030 <sqrt@plt>
movapd (%rsp),%xmm2
movsd  %xmm0,0x0(%rbp)
movsd  0xb32(%rip),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%rbx)
mulsd  %xmm2,%xmm1
cmp    $0x2,%r15d
jl     1502 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x3f2>
movsd  %xmm1,0x8(%rbp)
movsd  %xmm1,0x8(%rbx)
cmp    $0x1,%r14d
je     155e <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x44e>
unpckhpd %xmm2,%xmm2
mulsd  %xmm1,%xmm1
subsd  %xmm1,%xmm2
ucomisd 0xaf4(%rip),%xmm2
jbe    1531 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x421>
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm2
jb     153f <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x42f>
xorps  %xmm0,%xmm0
sqrtsd %xmm2,%xmm0
jmp    1548 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x438>
movq   $0x0,0x28(%rbp)
xorpd  %xmm1,%xmm1
jmp    1559 <kernel_dsyrk_dpotrf_nt_2x2_vs_lib4+0x449>
movapd %xmm2,%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,0x28(%rbp)
movsd  0xac3(%rip),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,0x10(%rbx)
add    $0x18,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

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