void kernel_dtrsv_n_4_lib4(int kmax, int inverted_diag, double *A, double *x,
                           double *y) {
  __builtin_prefetch(A);
  __builtin_prefetch(A + 8);
  const int lda = 4;
  int k;
  double x_0, x_1, x_2, x_3, y_0 = 0, y_1 = 0, y_2 = 0, y_3 = 0;
  k = 0;
  for (; k < kmax - 3; k += 4) {
    __builtin_prefetch(A + 4 * lda);
    __builtin_prefetch(A + 4 * lda + 8);
    x_0 = x[0];
    x_1 = x[1];
    x_2 = x[2];
    x_3 = x[3];
    y_0 += A[0 + lda * 0] * x_0;
    y_1 += A[1 + lda * 0] * x_0;
    y_2 += A[2 + lda * 0] * x_0;
    y_3 += A[3 + lda * 0] * x_0;
    y_0 += A[0 + lda * 1] * x_1;
    y_1 += A[1 + lda * 1] * x_1;
    y_2 += A[2 + lda * 1] * x_1;
    y_3 += A[3 + lda * 1] * x_1;
    y_0 += A[0 + lda * 2] * x_2;
    y_1 += A[1 + lda * 2] * x_2;
    y_2 += A[2 + lda * 2] * x_2;
    y_3 += A[3 + lda * 2] * x_2;
    y_0 += A[0 + lda * 3] * x_3;
    y_1 += A[1 + lda * 3] * x_3;
    y_2 += A[2 + lda * 3] * x_3;
    y_3 += A[3 + lda * 3] * x_3;
    A += 4 * lda;
    x += 4;
  }
  y_0 = y[0] - y_0;
  y_1 = y[1] - y_1;
  y_2 = y[2] - y_2;
  y_3 = y[3] - y_3;
  double a_00, a_10, a_20, a_30, a_11, a_21, a_31;
  if (inverted_diag) {
    a_00 = A[0 + lda * 0];
    a_10 = A[1 + lda * 0];
    a_20 = A[2 + lda * 0];
    a_30 = A[3 + lda * 0];
    y_0 *= a_00;
    y[0] = y_0;
    y_1 -= a_10 * y_0;
    y_2 -= a_20 * y_0;
    y_3 -= a_30 * y_0;
    a_11 = A[1 + lda * 1];
    a_21 = A[2 + lda * 1];
    a_31 = A[3 + lda * 1];
    y_1 *= a_11;
    y[1] = y_1;
    y_2 -= a_21 * y_1;
    y_3 -= a_31 * y_1;
    a_00 = A[2 + lda * 2];
    a_10 = A[3 + lda * 2];
    y_2 *= a_00;
    y[2] = y_2;
    y_3 -= a_10 * y_2;
    a_11 = A[3 + lda * 3];
    y_3 *= a_11;
    y[3] = y_3;
  } else {
    a_00 = 1.0 / A[0 + lda * 0];
    a_10 = A[1 + lda * 0];
    a_20 = A[2 + lda * 0];
    a_30 = A[3 + lda * 0];
    y_0 *= a_00;
    y[0] = y_0;
    y_1 -= a_10 * y_0;
    y_2 -= a_20 * y_0;
    y_3 -= a_30 * y_0;
    a_11 = 1.0 / A[1 + lda * 1];
    a_21 = A[2 + lda * 1];
    a_31 = A[3 + lda * 1];
    y_1 *= a_11;
    y[1] = y_1;
    y_2 -= a_21 * y_1;
    y_3 -= a_31 * y_1;
    a_00 = 1.0 / A[2 + lda * 2];
    a_10 = A[3 + lda * 2];
    y_2 *= a_00;
    y[2] = y_2;
    y_3 -= a_10 * y_2;
    a_11 = 1.0 / A[3 + lda * 3];
    y_3 *= a_11;
    y[3] = y_3;
  }
}


x86 assembly (clang, -O0):
<kernel_dtrsv_n_4_lib4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    -0x10(%rbp),%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
add    $0x40,%rax
prefetcht0 (%rax)
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)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    13e7 <kernel_dtrsv_n_4_lib4+0x2e7>
mov    -0x10(%rbp),%rax
add    $0x80,%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
add    $0x80,%rax
add    $0x40,%rax
prefetcht0 (%rax)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x28(%rbp)
jmp    115a <kernel_dtrsv_n_4_lib4+0x5a>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
subsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
subsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
cmpl   $0x0,-0x8(%rbp)
je     168f <kernel_dtrsv_n_4_lib4+0x58f>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x70(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x78(%rbp),%xmm0
movsd  -0x50(%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  -0x80(%rbp),%xmm0
movsd  -0x50(%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  -0x88(%rbp),%xmm0
ff
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x98(%rbp),%xmm0
ff
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  -0xa0(%rbp),%xmm0
ff
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x70(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x78(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
mulsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x18(%rax)
jmp    18fd <kernel_dtrsv_n_4_lib4+0x7fd>
mov    -0x10(%rbp),%rax
movsd  0x965(%rip),%xmm0
divsd  (%rax),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x70(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x78(%rbp),%xmm0
movsd  -0x50(%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  -0x80(%rbp),%xmm0
movsd  -0x50(%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  -0x88(%rbp),%xmm0
ff
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x86b(%rip),%xmm0
divsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x98(%rbp),%xmm0
ff
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  -0xa0(%rbp),%xmm0
ff
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x7a4(%rip),%xmm0
divsd  0x50(%rax),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x70(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x78(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x730(%rip),%xmm0
divsd  0x78(%rax),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
mulsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x18(%rax)
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dtrsv_n_4_lib4>:
prefetcht0 (%rdx)
prefetcht0 0x40(%rdx)
xorpd  %xmm5,%xmm5
cmp    $0x4,%edi
jl     11fb <kernel_dtrsv_n_4_lib4+0xfb>
add    $0xfffffffd,%edi
xorpd  %xmm7,%xmm7
xor    %eax,%eax
xorpd  %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
prefetcht0 0x80(%rdx)
prefetcht0 0xc0(%rdx)
movupd (%rdx),%xmm9
movupd 0x10(%rdx),%xmm5
movupd 0x20(%rdx),%xmm8
movupd 0x30(%rdx),%xmm2
movsd  (%rcx,%rax,8),%xmm6
unpcklpd %xmm6,%xmm6
mulpd  %xmm6,%xmm9
addpd  %xmm7,%xmm9
movupd 0x50(%rdx),%xmm10
movupd 0x40(%rdx),%xmm4
movupd 0x60(%rdx),%xmm11
movupd 0x70(%rdx),%xmm3
lea    0x80(%rdx),%rdx
mulpd  %xmm5,%xmm6
movsd  0x8(%rcx,%rax,8),%xmm7
addpd  %xmm0,%xmm6
movsd  0x10(%rcx,%rax,8),%xmm1
unpcklpd %xmm7,%xmm7
mulpd  %xmm7,%xmm2
addpd  %xmm6,%xmm2
movsd  0x18(%rcx,%rax,8),%xmm5
mulpd  %xmm8,%xmm7
addpd  %xmm9,%xmm7
unpcklpd %xmm1,%xmm1
mulpd  %xmm1,%xmm4
addpd  %xmm7,%xmm4
mulpd  %xmm10,%xmm1
addpd  %xmm2,%xmm1
unpcklpd %xmm5,%xmm5
mulpd  %xmm5,%xmm3
movapd %xmm3,%xmm0
addpd  %xmm1,%xmm0
mulpd  %xmm11,%xmm5
movapd %xmm5,%xmm7
addpd  %xmm4,%xmm7
add    $0x4,%rax
cmp    %edi,%eax
jl     1130 <kernel_dtrsv_n_4_lib4+0x30>
addpd  %xmm4,%xmm5
addpd  %xmm1,%xmm3
jmp    11ff <kernel_dtrsv_n_4_lib4+0xff>
xorpd  %xmm3,%xmm3
movsd  (%r8),%xmm4
movsd  0x8(%r8),%xmm2
subsd  %xmm5,%xmm4
unpckhpd %xmm5,%xmm5
subsd  %xmm5,%xmm2
movsd  0x10(%r8),%xmm1
subsd  %xmm3,%xmm1
movsd  0x18(%r8),%xmm0
unpckhpd %xmm3,%xmm3
subsd  %xmm3,%xmm0
movsd  (%rdx),%xmm5
test   %esi,%esi
je     12af <kernel_dtrsv_n_4_lib4+0x1af>
mulsd  %xmm5,%xmm4
movsd  0x8(%rdx),%xmm3
mulsd  %xmm4,%xmm3
movsd  0x10(%rdx),%xmm5
mulsd  %xmm4,%xmm5
movsd  0x18(%rdx),%xmm6
mulsd  %xmm4,%xmm6
movsd  %xmm4,(%r8)
subsd  %xmm3,%xmm2
subsd  %xmm5,%xmm1
mulsd  0x28(%rdx),%xmm2
subsd  %xmm6,%xmm0
movsd  0x30(%rdx),%xmm3
mulsd  %xmm2,%xmm3
subsd  %xmm3,%xmm1
movsd  0x38(%rdx),%xmm3
mulsd  %xmm2,%xmm3
subsd  %xmm3,%xmm0
movsd  %xmm2,0x8(%r8)
mulsd  0x50(%rdx),%xmm1
movsd  0x58(%rdx),%xmm2
mulsd  %xmm1,%xmm2
subsd  %xmm2,%xmm0
movsd  %xmm1,0x10(%r8)
mulsd  0x78(%rdx),%xmm0
movsd  %xmm0,0x18(%r8)
ret
movsd  0xd49(%rip),%xmm3
movapd %xmm3,%xmm6
divsd  %xmm5,%xmm6
mulsd  %xmm6,%xmm4
movsd  0x8(%rdx),%xmm5
mulsd  %xmm4,%xmm5
movsd  0x10(%rdx),%xmm6
mulsd  %xmm4,%xmm6
movsd  0x18(%rdx),%xmm7
mulsd  %xmm4,%xmm7
movsd  %xmm4,(%r8)
subsd  %xmm5,%xmm2
subsd  %xmm6,%xmm1
subsd  %xmm7,%xmm0
movapd %xmm3,%xmm4
divsd  0x28(%rdx),%xmm4
mulsd  %xmm2,%xmm4
movsd  0x30(%rdx),%xmm2
mulsd  %xmm4,%xmm2
subsd  %xmm2,%xmm1
movsd  0x38(%rdx),%xmm2
mulsd  %xmm4,%xmm2
subsd  %xmm2,%xmm0
movsd  %xmm4,0x8(%r8)
movapd %xmm3,%xmm2
divsd  0x50(%rdx),%xmm2
mulsd  %xmm1,%xmm2
movsd  0x58(%rdx),%xmm1
mulsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm2,0x10(%r8)
divsd  0x78(%rdx),%xmm3
mulsd  %xmm3,%xmm0
movsd  %xmm0,0x18(%r8)
ret

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

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