void kernel_dtrsv_t_3_lib4(int kmax, int inverted_diag, double *A, int sda,
                           double *x) {
  if (kmax <= 0)
    return;
  const int lda = 4;
  const int bs = 4;
  int k;
  double *tA, *tx;
  tA = A;
  tx = x;
  double x_0, x_1, x_2, x_3, y_0 = 0, y_1 = 0, y_2 = 0;
  k = 3;
  if (kmax > 4) {
    x_3 = x[3];
    y_0 += A[3 + lda * 0] * x_3;
    y_1 += A[3 + lda * 1] * x_3;
    y_2 += A[3 + lda * 2] * x_3;
    k = 4;
    A += 4 + (sda - 1) * lda;
    x += 4;
    for (; k < kmax - 7; k += 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[0 + lda * 1] * x_0;
      y_2 += A[0 + lda * 2] * x_0;
      y_0 += A[1 + lda * 0] * x_1;
      y_1 += A[1 + lda * 1] * x_1;
      y_2 += A[1 + lda * 2] * x_1;
      y_0 += A[2 + lda * 0] * x_2;
      y_1 += A[2 + lda * 1] * x_2;
      y_2 += A[2 + lda * 2] * x_2;
      y_0 += A[3 + lda * 0] * x_3;
      y_1 += A[3 + lda * 1] * x_3;
      y_2 += A[3 + lda * 2] * x_3;
      A += sda * bs;
      x += 4;
      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[0 + lda * 1] * x_0;
      y_2 += A[0 + lda * 2] * x_0;
      y_0 += A[1 + lda * 0] * x_1;
      y_1 += A[1 + lda * 1] * x_1;
      y_2 += A[1 + lda * 2] * x_1;
      y_0 += A[2 + lda * 0] * x_2;
      y_1 += A[2 + lda * 1] * x_2;
      y_2 += A[2 + lda * 2] * x_2;
      y_0 += A[3 + lda * 0] * x_3;
      y_1 += A[3 + lda * 1] * x_3;
      y_2 += A[3 + lda * 2] * x_3;
      A += sda * bs;
      x += 4;
    }
    for (; k < kmax - 3; k += 4) {
      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[0 + lda * 1] * x_0;
      y_2 += A[0 + lda * 2] * x_0;
      y_0 += A[1 + lda * 0] * x_1;
      y_1 += A[1 + lda * 1] * x_1;
      y_2 += A[1 + lda * 2] * x_1;
      y_0 += A[2 + lda * 0] * x_2;
      y_1 += A[2 + lda * 1] * x_2;
      y_2 += A[2 + lda * 2] * x_2;
      y_0 += A[3 + lda * 0] * x_3;
      y_1 += A[3 + lda * 1] * x_3;
      y_2 += A[3 + lda * 2] * x_3;
      A += sda * bs;
      x += 4;
    }
  } else {
    A += 3;
    x += 1;
  }
  for (; k < kmax; k++) {
    x_0 = x[0];
    y_0 += A[0 + lda * 0] * x_0;
    y_1 += A[0 + lda * 1] * x_0;
    y_2 += A[0 + lda * 2] * x_0;
    A += 1;
    x += 1;
  }
  A = tA;
  x = tx;
  if (inverted_diag) {
    y_2 = x[2] - y_2;
    y_2 *= A[2 + lda * 2];
    x[2] = y_2;
    y_0 += A[2 + lda * 0] * y_2;
    y_1 += A[2 + lda * 1] * y_2;
    y_1 = x[1] - y_1;
    y_1 *= A[1 + lda * 1];
    x[1] = y_1;
    y_0 = x[0] - A[1 + lda * 0] * y_1 - y_0;
    y_0 *= A[0 + lda * 0];
    x[0] = y_0;
  } else {
    y_2 = x[2] - y_2;
    y_2 /= A[2 + lda * 2];
    x[2] = y_2;
    y_0 += A[2 + lda * 0] * y_2;
    y_1 += A[2 + lda * 1] * y_2;
    y_1 = x[1] - y_1;
    y_1 /= A[1 + lda * 1];
    x[1] = y_1;
    y_0 = x[0] - A[1 + lda * 0] * y_1 - y_0;
    y_0 /= A[0 + lda * 0];
    x[0] = y_0;
  }
}


x86 assembly (clang, -O0):
<kernel_dtrsv_t_3_lib4>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8,-0x20(%rbp)
cmpl   $0x0,-0x4(%rbp)
jg     1124 <kernel_dtrsv_t_3_lib4+0x24>
jmp    1ad2 <kernel_dtrsv_t_3_lib4+0x9d2>
movl   $0x4,-0x24(%rbp)
movl   $0x4,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x40(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
movl   $0x3,-0x2c(%rbp)
cmpl   $0x4,-0x4(%rbp)
jle    17e0 <kernel_dtrsv_t_3_lib4+0x6e0>
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movl   $0x4,-0x2c(%rbp)
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
shl    $0x2,%ecx
add    $0x4,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x7,%ecx
cmp    %ecx,%eax
jge    15dd <kernel_dtrsv_t_3_lib4+0x4dd>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x48(%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  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x48(%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  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x2c(%rbp)
jmp    120a <kernel_dtrsv_t_3_lib4+0x10a>
jmp    15e2 <kernel_dtrsv_t_3_lib4+0x4e2>
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    17db <kernel_dtrsv_t_3_lib4+0x6db>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x48(%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  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x2c(%rbp)
jmp    15e2 <kernel_dtrsv_t_3_lib4+0x4e2>
jmp    17f8 <kernel_dtrsv_t_3_lib4+0x6f8>
mov    -0x10(%rbp),%rax
add    $0x18,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
jmp    17fd <kernel_dtrsv_t_3_lib4+0x6fd>
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    189b <kernel_dtrsv_t_3_lib4+0x79b>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x48(%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  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    17fd <kernel_dtrsv_t_3_lib4+0x6fd>
mov    -0x38(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x20(%rbp)
cmpl   $0x0,-0x8(%rbp)
je     19c0 <kernel_dtrsv_t_3_lib4+0x8c0>
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
subsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
mulsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x70(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mulsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    1ad2 <kernel_dtrsv_t_3_lib4+0x9d2>
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
subsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm1
movsd  -0x78(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm1
movsd  -0x70(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x70(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  -0x68(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dtrsv_t_3_lib4>:
test   %edi,%edi
jle    15b9 <kernel_dtrsv_t_3_lib4+0x4b9>
push   %rbp
push   %r15
push   %r14
push   %rbx
cmp    $0x5,%edi
jb     1418 <kernel_dtrsv_t_3_lib4+0x318>
movsd  0x18(%r8),%xmm2
movsd  0x18(%rdx),%xmm0
movhpd 0x38(%rdx),%xmm0
movapd %xmm2,%xmm3
unpcklpd %xmm2,%xmm3
mulpd  %xmm0,%xmm3
xorpd  %xmm1,%xmm1
addpd  %xmm3,%xmm1
mulsd  0x58(%rdx),%xmm2
xorpd  %xmm0,%xmm0
addsd  %xmm2,%xmm0
shl    $0x2,%ecx
movslq %ecx,%r10
lea    (%rdx,%r10,8),%rbp
lea    0x20(%r8),%rax
mov    $0x4,%r9d
cmp    $0xc,%edi
jb     131e <kernel_dtrsv_t_3_lib4+0x21e>
lea    -0x7(%rdi),%r11d
lea    -0xc(%rdi),%r9d
and    $0xfffffff8,%r9d
mov    %r10,%r14
shl    $0x4,%r14
lea    0x0(,%r10,8),%rbx
mov    $0x4,%r15d
cs nopw 0x0(%rax,%rax,1)
mov    %rbp,%rcx
movsd  (%rax),%xmm2
movsd  0x8(%rax),%xmm4
movsd  0x10(%rax),%xmm3
movsd  0x18(%rax),%xmm10
movsd  0x0(%rbp),%xmm7
movsd  0x8(%rbp),%xmm5
movsd  0x10(%rbp),%xmm9
movhpd 0x20(%rbp),%xmm7
movsd  0x18(%rbp),%xmm8
movapd %xmm2,%xmm6
unpcklpd %xmm2,%xmm6
mulpd  %xmm7,%xmm6
addpd  %xmm1,%xmm6
mulsd  0x40(%rbp),%xmm2
movhpd 0x28(%rbp),%xmm5
addsd  %xmm0,%xmm2
movapd %xmm4,%xmm0
unpcklpd %xmm4,%xmm0
mulpd  %xmm5,%xmm0
addpd  %xmm6,%xmm0
mulsd  0x48(%rbp),%xmm4
movhpd 0x30(%rbp),%xmm9
addsd  %xmm2,%xmm4
movapd %xmm3,%xmm1
unpcklpd %xmm3,%xmm1
mulpd  %xmm9,%xmm1
addpd  %xmm0,%xmm1
mulsd  0x50(%rbp),%xmm3
movhpd 0x38(%rbp),%xmm8
addsd  %xmm4,%xmm3
movapd %xmm10,%xmm2
unpcklpd %xmm10,%xmm2
mulpd  %xmm8,%xmm2
addpd  %xmm1,%xmm2
mulsd  0x58(%rbp),%xmm10
addsd  %xmm3,%xmm10
movsd  0x20(%rax),%xmm4
movsd  0x28(%rax),%xmm1
movsd  0x30(%rax),%xmm3
movsd  0x38(%rax),%xmm0
lea    0x0(%rbp,%rbx,1),%rbp
movsd  (%rcx,%rbx,1),%xmm6
movsd  0x8(%rcx,%rbx,1),%xmm7
movsd  0x10(%rcx,%rbx,1),%xmm9
movsd  0x18(%rcx,%rbx,1),%xmm8
movhpd 0x20(%rcx,%rbx,1),%xmm6
movapd %xmm4,%xmm5
unpcklpd %xmm4,%xmm5
mulpd  %xmm6,%xmm5
addpd  %xmm2,%xmm5
mulsd  0x40(%rcx,%rbx,1),%xmm4
addsd  %xmm10,%xmm4
movhpd 0x28(%rcx,%rbx,1),%xmm7
movapd %xmm1,%xmm6
unpcklpd %xmm1,%xmm6
mulpd  %xmm7,%xmm6
addpd  %xmm5,%xmm6
mulsd  0x48(%rcx,%rbx,1),%xmm1
addsd  %xmm4,%xmm1
movhpd 0x30(%rcx,%rbx,1),%xmm9
movapd %xmm3,%xmm2
unpcklpd %xmm3,%xmm2
mulpd  %xmm9,%xmm2
addpd  %xmm6,%xmm2
mulsd  0x50(%rcx,%rbx,1),%xmm3
addsd  %xmm1,%xmm3
movhpd 0x38(%rcx,%rbx,1),%xmm8
movapd %xmm0,%xmm5
unpcklpd %xmm0,%xmm5
mulpd  %xmm8,%xmm5
movapd %xmm5,%xmm1
addpd  %xmm2,%xmm1
mulsd  0x58(%rcx,%rbx,1),%xmm0
addsd  %xmm3,%xmm0
add    $0x8,%r15d
add    $0x40,%rax
add    %rbx,%rbp
cmp    %r11d,%r15d
jl     1190 <kernel_dtrsv_t_3_lib4+0x90>
add    %r14,%rcx
addpd  %xmm2,%xmm5
add    $0xc,%r9d
mov    %rcx,%rbp
movapd %xmm5,%xmm1
lea    -0x3(%rdi),%ecx
cmp    %ecx,%r9d
jge    13fb <kernel_dtrsv_t_3_lib4+0x2fb>
shl    $0x3,%r10
xchg   %ax,%ax
movsd  (%rax),%xmm3
movsd  0x8(%rax),%xmm2
movapd %xmm3,%xmm5
mulsd  0x40(%rbp),%xmm3
movsd  0x10(%rax),%xmm4
addsd  %xmm0,%xmm3
movsd  0x18(%rax),%xmm8
movsd  0x0(%rbp),%xmm6
movsd  0x8(%rbp),%xmm7
movsd  0x10(%rbp),%xmm0
movhpd 0x20(%rbp),%xmm6
movsd  0x18(%rbp),%xmm9
unpcklpd %xmm5,%xmm5
mulpd  %xmm6,%xmm5
addpd  %xmm1,%xmm5
movhpd 0x28(%rbp),%xmm7
movapd %xmm2,%xmm1
unpcklpd %xmm2,%xmm1
mulpd  %xmm7,%xmm1
addpd  %xmm5,%xmm1
mulsd  0x48(%rbp),%xmm2
addsd  %xmm3,%xmm2
movhpd 0x30(%rbp),%xmm0
movapd %xmm4,%xmm3
unpcklpd %xmm4,%xmm3
mulpd  %xmm0,%xmm3
addpd  %xmm1,%xmm3
mulsd  0x50(%rbp),%xmm4
addsd  %xmm2,%xmm4
movhpd 0x38(%rbp),%xmm9
movapd %xmm8,%xmm2
unpcklpd %xmm8,%xmm2
mulpd  %xmm9,%xmm2
movapd %xmm2,%xmm1
addpd  %xmm3,%xmm1
mulsd  0x58(%rbp),%xmm8
movapd %xmm8,%xmm0
addsd  %xmm4,%xmm0
add    $0x20,%rax
add    $0x4,%r9d
add    %r10,%rbp
cmp    %ecx,%r9d
jl     1330 <kernel_dtrsv_t_3_lib4+0x230>
addpd  %xmm3,%xmm2
movapd %xmm2,%xmm1
cmp    %edi,%r9d
jge    1433 <kernel_dtrsv_t_3_lib4+0x333>
mov    %edi,%ebx
sub    %r9d,%ebx
mov    %r9d,%ecx
not    %ecx
test   $0x1,%bl
jne    1440 <kernel_dtrsv_t_3_lib4+0x340>
add    %edi,%ecx
jne    147f <kernel_dtrsv_t_3_lib4+0x37f>
jmp    14fb <kernel_dtrsv_t_3_lib4+0x3fb>
lea    0x18(%rdx),%rbp
lea    0x8(%r8),%rax
xorpd  %xmm1,%xmm1
xorpd  %xmm0,%xmm0
mov    $0x3,%r9d
cmp    %edi,%r9d
jl     1400 <kernel_dtrsv_t_3_lib4+0x300>
movapd %xmm0,%xmm3
movapd %xmm1,%xmm2
jmp    14fb <kernel_dtrsv_t_3_lib4+0x3fb>
movsd  (%rax),%xmm3
movsd  0x0(%rbp),%xmm4
movhpd 0x20(%rbp),%xmm4
movapd %xmm3,%xmm2
unpcklpd %xmm3,%xmm2
mulpd  %xmm4,%xmm2
addpd  %xmm1,%xmm2
mulsd  0x40(%rbp),%xmm3
addsd  %xmm0,%xmm3
add    $0x8,%rbp
add    $0x8,%rax
add    $0x1,%r9d
movapd %xmm3,%xmm0
movapd %xmm2,%xmm1
add    %edi,%ecx
je     14fb <kernel_dtrsv_t_3_lib4+0x3fb>
sub    %r9d,%edi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  0x0(%rbp,%rcx,8),%xmm2
movhpd 0x20(%rbp,%rcx,8),%xmm2
movsd  (%rax,%rcx,8),%xmm4
movapd %xmm4,%xmm3
mulsd  0x40(%rbp,%rcx,8),%xmm4
movsd  0x8(%rbp,%rcx,8),%xmm5
addsd  %xmm0,%xmm4
movsd  0x8(%rax,%rcx,8),%xmm0
unpcklpd %xmm3,%xmm3
mulpd  %xmm2,%xmm3
addpd  %xmm1,%xmm3
movhpd 0x28(%rbp,%rcx,8),%xmm5
movapd %xmm0,%xmm2
unpcklpd %xmm0,%xmm2
mulpd  %xmm5,%xmm2
movapd %xmm2,%xmm1
mulsd  0x48(%rbp,%rcx,8),%xmm0
addpd  %xmm3,%xmm1
addsd  %xmm4,%xmm0
add    $0x2,%rcx
cmp    %ecx,%edi
jne    1490 <kernel_dtrsv_t_3_lib4+0x390>
addpd  %xmm3,%xmm2
movapd %xmm0,%xmm3
movsd  0x10(%r8),%xmm0
subsd  %xmm3,%xmm0
movsd  0x50(%rdx),%xmm1
test   %esi,%esi
je     155f <kernel_dtrsv_t_3_lib4+0x45f>
mulsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%r8)
movsd  0x10(%rdx),%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
unpckhpd %xmm2,%xmm2
mulsd  0x30(%rdx),%xmm0
addsd  %xmm2,%xmm0
movsd  0x8(%r8),%xmm2
subsd  %xmm0,%xmm2
mulsd  0x28(%rdx),%xmm2
movsd  (%r8),%xmm0
movsd  %xmm2,0x8(%r8)
mulsd  0x8(%rdx),%xmm2
subsd  %xmm2,%xmm0
subsd  %xmm1,%xmm0
mulsd  (%rdx),%xmm0
jmp    15ae <kernel_dtrsv_t_3_lib4+0x4ae>
divsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%r8)
movsd  0x10(%rdx),%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
unpckhpd %xmm2,%xmm2
mulsd  0x30(%rdx),%xmm0
addsd  %xmm2,%xmm0
movsd  0x8(%r8),%xmm2
subsd  %xmm0,%xmm2
divsd  0x28(%rdx),%xmm2
movsd  (%r8),%xmm0
movsd  %xmm2,0x8(%r8)
mulsd  0x8(%rdx),%xmm2
subsd  %xmm2,%xmm0
subsd  %xmm1,%xmm0
divsd  (%rdx),%xmm0
movsd  %xmm0,(%r8)
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

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