void kernel_dtrsv_t_3_lib4_new(int kmax, double *A, int sda, int use_inv_diag_A,
                               double *inv_diag_A, 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;
    __builtin_prefetch(A);
    __builtin_prefetch(A + 8);
    for (; k < kmax - 7; k += 8) {
      __builtin_prefetch(A + sda * bs);
      __builtin_prefetch(A + sda * bs + 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;
      __builtin_prefetch(A + sda * bs);
      __builtin_prefetch(A + sda * bs + 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;
    }
    for (; k < kmax - 3; k += 4) {
      __builtin_prefetch(A + sda * bs);
      __builtin_prefetch(A + sda * bs + 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;
    }
  } else {
    A += 3;
    x += 3;
  }
  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 (use_inv_diag_A) {
    y_2 = x[2] - y_2;
    y_2 *= inv_diag_A[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 *= inv_diag_A[1];
    x[1] = y_1;
    y_0 = x[0] - A[1 + lda * 0] * y_1 - y_0;
    y_0 *= inv_diag_A[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_new>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
cmpl   $0x0,-0x4(%rbp)
jg     1128 <kernel_dtrsv_t_3_lib4_new+0x28>
jmp    1b7e <kernel_dtrsv_t_3_lib4_new+0xa7e>
movl   $0x4,-0x2c(%rbp)
movl   $0x4,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x48(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x80(%rbp)
movl   $0x3,-0x34(%rbp)
cmpl   $0x4,-0x4(%rbp)
jle    188c <kernel_dtrsv_t_3_lib4_new+0x78c>
mov    -0x28(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movl   $0x4,-0x34(%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    -0x28(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
add    $0x40,%rax
prefetcht0 (%rax)
mov    -0x34(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x7,%ecx
cmp    %ecx,%eax
jge    1657 <kernel_dtrsv_t_3_lib4_new+0x557>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0x40,%rax
prefetcht0 (%rax)
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%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  0x20(%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  0x40(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%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  0x28(%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  0x48(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%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  0x30(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%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    -0x28(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0x40,%rax
prefetcht0 (%rax)
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%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  0x20(%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  0x40(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%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  0x28(%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  0x48(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%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  0x30(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%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    -0x28(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x28(%rbp)
mov    -0x34(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x34(%rbp)
jmp    1220 <kernel_dtrsv_t_3_lib4_new+0x120>
jmp    165c <kernel_dtrsv_t_3_lib4_new+0x55c>
mov    -0x34(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1887 <kernel_dtrsv_t_3_lib4_new+0x787>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0x40,%rax
prefetcht0 (%rax)
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%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  0x20(%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  0x40(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%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  0x28(%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  0x48(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%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  0x30(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%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    -0x28(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x28(%rbp)
mov    -0x34(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x34(%rbp)
jmp    165c <kernel_dtrsv_t_3_lib4_new+0x55c>
jmp    18a4 <kernel_dtrsv_t_3_lib4_new+0x7a4>
mov    -0x10(%rbp),%rax
add    $0x18,%rax
mov    %rax,-0x10(%rbp)
mov    -0x28(%rbp),%rax
add    $0x18,%rax
mov    %rax,-0x28(%rbp)
jmp    18a9 <kernel_dtrsv_t_3_lib4_new+0x7a9>
mov    -0x34(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1947 <kernel_dtrsv_t_3_lib4_new+0x847>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%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  0x20(%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  0x40(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x28(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x28(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    18a9 <kernel_dtrsv_t_3_lib4_new+0x7a9>
mov    -0x40(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,-0x28(%rbp)
cmpl   $0x0,-0x18(%rbp)
je     1a6c <kernel_dtrsv_t_3_lib4_new+0x96c>
mov    -0x28(%rbp),%rax
movsd  0x10(%rax),%xmm0
subsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
mulsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x80(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x80(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
mulsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    1b7e <kernel_dtrsv_t_3_lib4_new+0xa7e>
mov    -0x28(%rbp),%rax
movsd  0x10(%rax),%xmm0
subsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm1
movsd  -0x80(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x80(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x80(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm1
movsd  -0x78(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  -0x70(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dtrsv_t_3_lib4_new>:
test   %edi,%edi
jle    15e8 <kernel_dtrsv_t_3_lib4_new+0x4e8>
push   %rbp
push   %r15
push   %r14
push   %rbx
cmp    $0x5,%edi
jb     133f <kernel_dtrsv_t_3_lib4_new+0x23f>
movsd  0x18(%r9),%xmm1
movsd  0x18(%rsi),%xmm0
movhpd 0x38(%rsi),%xmm0
movapd %xmm1,%xmm2
unpcklpd %xmm1,%xmm2
mulpd  %xmm0,%xmm2
xorpd  %xmm6,%xmm6
addpd  %xmm2,%xmm6
mulsd  0x58(%rsi),%xmm1
xorpd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
shl    $0x2,%edx
movslq %edx,%r11
prefetcht0 (%rsi,%r11,8)
prefetcht0 0x40(%rsi,%r11,8)
lea    0x20(%r9),%rax
cmp    $0xc,%edi
jb     135a <kernel_dtrsv_t_3_lib4_new+0x25a>
lea    -0x7(%rdi),%r14d
lea    -0xc(%rdi),%r10d
and    $0xfffffff8,%r10d
mov    %r11,%rbx
shl    $0x4,%rbx
lea    (%r11,%r11,2),%rdx
lea    0x40(,%rdx,8),%r15
mov    $0x4,%ebp
mov    %rsi,%rdx
nopl   (%rax)
prefetcht0 (%rdx,%rbx,1)
prefetcht0 0x40(%rdx,%rbx,1)
movsd  (%rax),%xmm2
movsd  0x8(%rax),%xmm5
movsd  0x10(%rax),%xmm3
movsd  0x18(%rax),%xmm11
movsd  (%rdx,%r11,8),%xmm7
movsd  0x8(%rdx,%r11,8),%xmm4
movsd  0x10(%rdx,%r11,8),%xmm9
movsd  0x18(%rdx,%r11,8),%xmm8
movhpd 0x20(%rdx,%r11,8),%xmm7
movapd %xmm2,%xmm1
unpcklpd %xmm2,%xmm1
mulpd  %xmm7,%xmm1
mulsd  0x40(%rdx,%r11,8),%xmm2
addpd  %xmm6,%xmm1
addsd  %xmm0,%xmm2
movhpd 0x28(%rdx,%r11,8),%xmm4
movapd %xmm5,%xmm0
unpcklpd %xmm5,%xmm0
mulpd  %xmm4,%xmm0
mulsd  0x48(%rdx,%r11,8),%xmm5
addpd  %xmm1,%xmm0
addsd  %xmm2,%xmm5
movhpd 0x30(%rdx,%r11,8),%xmm9
movapd %xmm3,%xmm1
unpcklpd %xmm3,%xmm1
mulpd  %xmm9,%xmm1
mulsd  0x50(%rdx,%r11,8),%xmm3
addpd  %xmm0,%xmm1
addsd  %xmm5,%xmm3
movhpd 0x38(%rdx,%r11,8),%xmm8
movapd %xmm11,%xmm2
unpcklpd %xmm11,%xmm2
mulpd  %xmm8,%xmm2
mulsd  0x58(%rdx,%r11,8),%xmm11
addpd  %xmm1,%xmm2
addsd  %xmm3,%xmm11
prefetcht0 -0x40(%rdx,%r15,1)
prefetcht0 (%rdx,%r15,1)
movsd  0x20(%rax),%xmm5
movsd  0x28(%rax),%xmm7
movsd  0x30(%rax),%xmm3
movsd  0x38(%rax),%xmm0
movsd  (%rdx,%rbx,1),%xmm1
movsd  0x8(%rdx,%rbx,1),%xmm10
movsd  0x10(%rdx,%rbx,1),%xmm9
movsd  0x18(%rdx,%rbx,1),%xmm8
movhpd 0x20(%rdx,%rbx,1),%xmm1
movapd %xmm5,%xmm4
unpcklpd %xmm5,%xmm4
mulpd  %xmm1,%xmm4
addpd  %xmm2,%xmm4
mulsd  0x40(%rdx,%rbx,1),%xmm5
addsd  %xmm11,%xmm5
movhpd 0x28(%rdx,%rbx,1),%xmm10
movapd %xmm7,%xmm6
mulsd  0x48(%rdx,%rbx,1),%xmm7
movhpd 0x30(%rdx,%rbx,1),%xmm9
movapd %xmm3,%xmm2
mulsd  0x50(%rdx,%rbx,1),%xmm3
movhpd 0x38(%rdx,%rbx,1),%xmm8
movapd %xmm0,%xmm1
mulsd  0x58(%rdx,%rbx,1),%xmm0
lea    (%rdx,%rbx,1),%rdx
unpcklpd %xmm6,%xmm6
mulpd  %xmm10,%xmm6
addpd  %xmm4,%xmm6
addsd  %xmm5,%xmm7
unpcklpd %xmm2,%xmm2
mulpd  %xmm9,%xmm2
addpd  %xmm6,%xmm2
addsd  %xmm7,%xmm3
unpcklpd %xmm1,%xmm1
mulpd  %xmm8,%xmm1
movapd %xmm1,%xmm6
addpd  %xmm2,%xmm6
addsd  %xmm3,%xmm0
add    $0x8,%ebp
add    $0x40,%rax
cmp    %r14d,%ebp
jl     1190 <kernel_dtrsv_t_3_lib4_new+0x90>
addpd  %xmm2,%xmm1
add    $0xc,%r10d
lea    (%rdx,%r11,8),%rdx
movapd %xmm1,%xmm6
jmp    1364 <kernel_dtrsv_t_3_lib4_new+0x264>
lea    0x18(%rsi),%rdx
lea    0x18(%r9),%rax
xorpd  %xmm6,%xmm6
xorpd  %xmm0,%xmm0
mov    $0x3,%r10d
jmp    1453 <kernel_dtrsv_t_3_lib4_new+0x353>
lea    (%rsi,%r11,8),%rdx
mov    $0x4,%r10d
lea    -0x3(%rdi),%ebx
cmp    %ebx,%r10d
jge    1453 <kernel_dtrsv_t_3_lib4_new+0x353>
lea    0x40(,%r11,8),%rbp
shl    $0x3,%r11
nopl   0x0(%rax)
prefetcht0 -0x40(%rdx,%rbp,1)
prefetcht0 (%rdx,%rbp,1)
movsd  (%rax),%xmm1
movsd  0x8(%rax),%xmm2
movapd %xmm1,%xmm3
mulsd  0x40(%rdx),%xmm1
movsd  0x10(%rax),%xmm4
addsd  %xmm0,%xmm1
movsd  0x18(%rax),%xmm8
movsd  (%rdx),%xmm5
movsd  0x8(%rdx),%xmm7
movsd  0x10(%rdx),%xmm0
movhpd 0x20(%rdx),%xmm5
movsd  0x18(%rdx),%xmm9
unpcklpd %xmm3,%xmm3
mulpd  %xmm5,%xmm3
addpd  %xmm6,%xmm3
movhpd 0x28(%rdx),%xmm7
movapd %xmm2,%xmm5
unpcklpd %xmm2,%xmm5
mulpd  %xmm7,%xmm5
addpd  %xmm3,%xmm5
mulsd  0x48(%rdx),%xmm2
addsd  %xmm1,%xmm2
movhpd 0x30(%rdx),%xmm0
movapd %xmm4,%xmm3
unpcklpd %xmm4,%xmm3
mulpd  %xmm0,%xmm3
addpd  %xmm5,%xmm3
mulsd  0x50(%rdx),%xmm4
addsd  %xmm2,%xmm4
movhpd 0x38(%rdx),%xmm9
movapd %xmm8,%xmm2
unpcklpd %xmm8,%xmm2
mulpd  %xmm9,%xmm2
movapd %xmm2,%xmm6
addpd  %xmm3,%xmm6
mulsd  0x58(%rdx),%xmm8
movapd %xmm8,%xmm0
addsd  %xmm4,%xmm0
add    $0x20,%rax
add    $0x4,%r10d
add    %r11,%rdx
cmp    %ebx,%r10d
jl     1380 <kernel_dtrsv_t_3_lib4_new+0x280>
addpd  %xmm3,%xmm2
movapd %xmm2,%xmm6
cmp    %edi,%r10d
jge    1470 <kernel_dtrsv_t_3_lib4_new+0x370>
mov    %edi,%ebx
sub    %r10d,%ebx
mov    %r10d,%ebp
not    %ebp
test   $0x1,%bl
jne    147d <kernel_dtrsv_t_3_lib4_new+0x37d>
add    %edi,%ebp
jne    14bb <kernel_dtrsv_t_3_lib4_new+0x3bb>
jmp    152a <kernel_dtrsv_t_3_lib4_new+0x42a>
movapd %xmm0,%xmm3
movapd %xmm6,%xmm2
jmp    152a <kernel_dtrsv_t_3_lib4_new+0x42a>
movsd  (%rax),%xmm3
movsd  (%rdx),%xmm1
movhpd 0x20(%rdx),%xmm1
movapd %xmm3,%xmm2
unpcklpd %xmm3,%xmm2
mulpd  %xmm1,%xmm2
addpd  %xmm6,%xmm2
mulsd  0x40(%rdx),%xmm3
addsd  %xmm0,%xmm3
add    $0x8,%rdx
add    $0x8,%rax
add    $0x1,%r10d
movapd %xmm3,%xmm0
movapd %xmm2,%xmm6
add    %edi,%ebp
je     152a <kernel_dtrsv_t_3_lib4_new+0x42a>
sub    %r10d,%edi
xor    %ebp,%ebp
movsd  (%rdx,%rbp,8),%xmm2
movhpd 0x20(%rdx,%rbp,8),%xmm2
movsd  (%rax,%rbp,8),%xmm3
movapd %xmm3,%xmm1
mulsd  0x40(%rdx,%rbp,8),%xmm3
movsd  0x8(%rdx,%rbp,8),%xmm4
addsd  %xmm0,%xmm3
movsd  0x8(%rax,%rbp,8),%xmm0
unpcklpd %xmm1,%xmm1
mulpd  %xmm2,%xmm1
addpd  %xmm6,%xmm1
movhpd 0x28(%rdx,%rbp,8),%xmm4
movapd %xmm0,%xmm2
unpcklpd %xmm0,%xmm2
mulpd  %xmm4,%xmm2
movapd %xmm2,%xmm6
mulsd  0x48(%rdx,%rbp,8),%xmm0
addpd  %xmm1,%xmm6
addsd  %xmm3,%xmm0
add    $0x2,%rbp
cmp    %ebp,%edi
jne    14c0 <kernel_dtrsv_t_3_lib4_new+0x3c0>
addpd  %xmm1,%xmm2
movapd %xmm0,%xmm3
movsd  0x10(%r9),%xmm0
subsd  %xmm3,%xmm0
test   %ecx,%ecx
je     158d <kernel_dtrsv_t_3_lib4_new+0x48d>
mulsd  0x10(%r8),%xmm0
movsd  %xmm0,0x10(%r9)
movsd  0x10(%rsi),%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
unpckhpd %xmm2,%xmm2
mulsd  0x30(%rsi),%xmm0
addsd  %xmm2,%xmm0
movsd  0x8(%r9),%xmm2
subsd  %xmm0,%xmm2
mulsd  0x8(%r8),%xmm2
movsd  (%r9),%xmm0
movsd  %xmm2,0x8(%r9)
mulsd  0x8(%rsi),%xmm2
subsd  %xmm2,%xmm0
subsd  %xmm1,%xmm0
mulsd  (%r8),%xmm0
jmp    15dd <kernel_dtrsv_t_3_lib4_new+0x4dd>
divsd  0x50(%rsi),%xmm0
movsd  %xmm0,0x10(%r9)
movsd  0x10(%rsi),%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
unpckhpd %xmm2,%xmm2
mulsd  0x30(%rsi),%xmm0
addsd  %xmm2,%xmm0
movsd  0x8(%r9),%xmm2
subsd  %xmm0,%xmm2
divsd  0x28(%rsi),%xmm2
movsd  (%r9),%xmm0
movsd  %xmm2,0x8(%r9)
mulsd  0x8(%rsi),%xmm2
subsd  %xmm2,%xmm0
subsd  %xmm1,%xmm0
divsd  (%rsi),%xmm0
movsd  %xmm0,(%r9)
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

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