void kernel_dtrsv_t_2_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;
  k = 2;
  if (kmax > 4) {
    x_2 = x[2];
    x_3 = x[3];
    y_0 += A[2 + lda * 0] * x_2;
    y_1 += A[2 + lda * 1] * x_2;
    y_0 += A[3 + lda * 0] * x_3;
    y_1 += A[3 + lda * 1] * x_3;
    k = 4;
    A += 4 + (sda - 1) * lda;
    x += 4;
    __builtin_prefetch(A);
    for (; k < kmax - 7; k += 8) {
      __builtin_prefetch(A + sda * bs);
      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_0 += A[1 + lda * 0] * x_1;
      y_1 += A[1 + lda * 1] * x_1;
      y_0 += A[2 + lda * 0] * x_2;
      y_1 += A[2 + lda * 1] * x_2;
      y_0 += A[3 + lda * 0] * x_3;
      y_1 += A[3 + lda * 1] * x_3;
      A += sda * bs;
      x += 4;
      __builtin_prefetch(A + sda * bs);
      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_0 += A[1 + lda * 0] * x_1;
      y_1 += A[1 + lda * 1] * x_1;
      y_0 += A[2 + lda * 0] * x_2;
      y_1 += A[2 + lda * 1] * x_2;
      y_0 += A[3 + lda * 0] * x_3;
      y_1 += A[3 + lda * 1] * x_3;
      A += sda * bs;
      x += 4;
    }
    for (; k < kmax - 3; k += 4) {
      __builtin_prefetch(A + sda * bs);
      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_0 += A[1 + lda * 0] * x_1;
      y_1 += A[1 + lda * 1] * x_1;
      y_0 += A[2 + lda * 0] * x_2;
      y_1 += A[2 + lda * 1] * x_2;
      y_0 += A[3 + lda * 0] * x_3;
      y_1 += A[3 + lda * 1] * x_3;
      A += sda * bs;
      x += 4;
    }
  } else {
    A += 2;
    x += 2;
  }
  for (; k < kmax; k++) {
    x_0 = x[0];
    y_0 += A[0 + lda * 0] * x_0;
    y_1 += A[0 + lda * 1] * x_0;
    A += 1;
    x += 1;
  }
  A = tA;
  x = tx;
  if (use_inv_diag_A) {
    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_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_2_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_2_lib4_new+0x28>
jmp    18bc <kernel_dtrsv_t_2_lib4_new+0x7bc>
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)
movl   $0x2,-0x34(%rbp)
cmpl   $0x4,-0x4(%rbp)
jle    16d6 <kernel_dtrsv_t_2_lib4_new+0x5d6>
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  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  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)
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    -0x34(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x7,%ecx
cmp    %ecx,%eax
jge    153c <kernel_dtrsv_t_2_lib4_new+0x43c>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%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  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  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  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    -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    -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  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  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  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    -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    123b <kernel_dtrsv_t_2_lib4_new+0x13b>
jmp    1541 <kernel_dtrsv_t_2_lib4_new+0x441>
mov    -0x34(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    16d1 <kernel_dtrsv_t_2_lib4_new+0x5d1>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%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  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  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  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    -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    1541 <kernel_dtrsv_t_2_lib4_new+0x441>
jmp    16ee <kernel_dtrsv_t_2_lib4_new+0x5ee>
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x10(%rbp)
mov    -0x28(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x28(%rbp)
jmp    16f3 <kernel_dtrsv_t_2_lib4_new+0x5f3>
mov    -0x34(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1771 <kernel_dtrsv_t_2_lib4_new+0x671>
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
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    16f3 <kernel_dtrsv_t_2_lib4_new+0x5f3>
mov    -0x40(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,-0x28(%rbp)
cmpl   $0x0,-0x18(%rbp)
je     1822 <kernel_dtrsv_t_2_lib4_new+0x722>
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    18bc <kernel_dtrsv_t_2_lib4_new+0x7bc>
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_2_lib4_new>:
test   %edi,%edi
jle    14b5 <kernel_dtrsv_t_2_lib4_new+0x3b5>
push   %rbp
push   %r15
push   %r14
push   %rbx
cmp    $0x5,%edi
jb     12c4 <kernel_dtrsv_t_2_lib4_new+0x1c4>
movsd  0x10(%rsi),%xmm1
movsd  0x18(%rsi),%xmm2
movhpd 0x30(%rsi),%xmm1
movsd  0x10(%r9),%xmm3
movsd  0x18(%r9),%xmm0
unpcklpd %xmm3,%xmm3
mulpd  %xmm1,%xmm3
xorpd  %xmm1,%xmm1
addpd  %xmm3,%xmm1
movhpd 0x38(%rsi),%xmm2
unpcklpd %xmm0,%xmm0
mulpd  %xmm2,%xmm0
addpd  %xmm1,%xmm0
shl    $0x2,%edx
movslq %edx,%r15
prefetcht0 (%rsi,%r15,8)
lea    0x20(%r9),%rax
cmp    $0xc,%edi
jb     12db <kernel_dtrsv_t_2_lib4_new+0x1db>
lea    -0x7(%rdi),%r11d
lea    -0xc(%rdi),%r10d
and    $0xfffffff8,%r10d
mov    %r15,%rbx
shl    $0x4,%rbx
lea    0x0(,%r15,8),%rdx
lea    (%rdx,%rdx,2),%r14
mov    $0x4,%ebp
mov    %rsi,%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
prefetcht0 (%rdx,%rbx,1)
movsd  (%rdx,%r15,8),%xmm1
movsd  0x8(%rdx,%r15,8),%xmm6
movsd  0x10(%rdx,%r15,8),%xmm8
movhpd 0x20(%rdx,%r15,8),%xmm1
movsd  0x18(%rdx,%r15,8),%xmm3
movsd  (%rax),%xmm7
movsd  0x8(%rax),%xmm5
movsd  0x10(%rax),%xmm4
movsd  0x18(%rax),%xmm2
unpcklpd %xmm7,%xmm7
mulpd  %xmm1,%xmm7
addpd  %xmm0,%xmm7
movhpd 0x28(%rdx,%r15,8),%xmm6
unpcklpd %xmm5,%xmm5
mulpd  %xmm6,%xmm5
movhpd 0x30(%rdx,%r15,8),%xmm8
movhpd 0x38(%rdx,%r15,8),%xmm3
addpd  %xmm7,%xmm5
prefetcht0 (%rdx,%r14,1)
movsd  (%rdx,%rbx,1),%xmm1
movsd  0x8(%rdx,%rbx,1),%xmm7
movsd  0x10(%rdx,%rbx,1),%xmm6
movsd  0x18(%rdx,%rbx,1),%xmm9
movhpd 0x20(%rdx,%rbx,1),%xmm1
movhpd 0x28(%rdx,%rbx,1),%xmm7
movhpd 0x30(%rdx,%rbx,1),%xmm6
movhpd 0x38(%rdx,%rbx,1),%xmm9
lea    (%rdx,%rbx,1),%rdx
unpcklpd %xmm4,%xmm4
mulpd  %xmm8,%xmm4
addpd  %xmm5,%xmm4
unpcklpd %xmm2,%xmm2
mulpd  %xmm3,%xmm2
addpd  %xmm4,%xmm2
movsd  0x20(%rax),%xmm5
movsd  0x28(%rax),%xmm0
movsd  0x30(%rax),%xmm4
movsd  0x38(%rax),%xmm3
unpcklpd %xmm5,%xmm5
mulpd  %xmm1,%xmm5
addpd  %xmm2,%xmm5
unpcklpd %xmm0,%xmm0
mulpd  %xmm7,%xmm0
addpd  %xmm5,%xmm0
unpcklpd %xmm4,%xmm4
mulpd  %xmm6,%xmm4
addpd  %xmm0,%xmm4
unpcklpd %xmm3,%xmm3
mulpd  %xmm9,%xmm3
movapd %xmm3,%xmm0
addpd  %xmm4,%xmm0
add    $0x8,%ebp
add    $0x40,%rax
cmp    %r11d,%ebp
jl     11a0 <kernel_dtrsv_t_2_lib4_new+0xa0>
addpd  %xmm4,%xmm3
add    $0xc,%r10d
lea    (%rdx,%r15,8),%r11
movapd %xmm3,%xmm0
jmp    12e5 <kernel_dtrsv_t_2_lib4_new+0x1e5>
lea    0x10(%rsi),%r11
lea    0x10(%r9),%rax
xorpd  %xmm0,%xmm0
mov    $0x2,%r10d
jmp    1398 <kernel_dtrsv_t_2_lib4_new+0x298>
lea    (%rsi,%r15,8),%r11
mov    $0x4,%r10d
lea    -0x3(%rdi),%edx
cmp    %edx,%r10d
jge    1398 <kernel_dtrsv_t_2_lib4_new+0x298>
shl    $0x3,%r15
cs nopw 0x0(%rax,%rax,1)
nop
prefetcht0 (%r11,%r15,1)
movsd  (%r11),%xmm4
movsd  0x8(%r11),%xmm3
movsd  0x10(%r11),%xmm2
movsd  0x18(%r11),%xmm8
movhpd 0x20(%r11),%xmm4
movhpd 0x28(%r11),%xmm3
movhpd 0x30(%r11),%xmm2
movhpd 0x38(%r11),%xmm8
add    %r15,%r11
movsd  (%rax),%xmm7
movsd  0x8(%rax),%xmm1
movsd  0x10(%rax),%xmm6
movsd  0x18(%rax),%xmm5
unpcklpd %xmm7,%xmm7
mulpd  %xmm4,%xmm7
addpd  %xmm0,%xmm7
unpcklpd %xmm1,%xmm1
mulpd  %xmm3,%xmm1
addpd  %xmm7,%xmm1
unpcklpd %xmm6,%xmm6
mulpd  %xmm2,%xmm6
addpd  %xmm1,%xmm6
unpcklpd %xmm5,%xmm5
mulpd  %xmm8,%xmm5
movapd %xmm5,%xmm0
addpd  %xmm6,%xmm0
add    $0x20,%rax
add    $0x4,%r10d
cmp    %edx,%r10d
jl     1300 <kernel_dtrsv_t_2_lib4_new+0x200>
addpd  %xmm6,%xmm5
movapd %xmm5,%xmm0
cmp    %edi,%r10d
jge    13b5 <kernel_dtrsv_t_2_lib4_new+0x2b5>
mov    %edi,%ebx
sub    %r10d,%ebx
mov    %r10d,%edx
not    %edx
test   $0x1,%bl
jne    13be <kernel_dtrsv_t_2_lib4_new+0x2be>
add    %edi,%edx
jne    13ed <kernel_dtrsv_t_2_lib4_new+0x2ed>
jmp    144e <kernel_dtrsv_t_2_lib4_new+0x34e>
movapd %xmm0,%xmm1
jmp    144e <kernel_dtrsv_t_2_lib4_new+0x34e>
movsd  (%r11),%xmm2
movhpd 0x20(%r11),%xmm2
movsd  (%rax),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm2,%xmm1
addpd  %xmm0,%xmm1
add    $0x8,%r11
add    $0x8,%rax
add    $0x1,%r10d
movapd %xmm1,%xmm0
add    %edi,%edx
je     144e <kernel_dtrsv_t_2_lib4_new+0x34e>
sub    %r10d,%edi
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  (%r11,%rdx,8),%xmm3
movsd  0x8(%r11,%rdx,8),%xmm4
movhpd 0x20(%r11,%rdx,8),%xmm3
movsd  (%rax,%rdx,8),%xmm2
movsd  0x8(%rax,%rdx,8),%xmm1
unpcklpd %xmm2,%xmm2
mulpd  %xmm3,%xmm2
addpd  %xmm0,%xmm2
movhpd 0x28(%r11,%rdx,8),%xmm4
unpcklpd %xmm1,%xmm1
mulpd  %xmm4,%xmm1
movapd %xmm1,%xmm0
addpd  %xmm2,%xmm0
add    $0x2,%rdx
cmp    %edx,%edi
jne    1400 <kernel_dtrsv_t_2_lib4_new+0x300>
addpd  %xmm2,%xmm1
movsd  0x8(%r9),%xmm0
movapd %xmm1,%xmm2
unpckhpd %xmm1,%xmm2
subsd  %xmm2,%xmm0
test   %ecx,%ecx
je     1489 <kernel_dtrsv_t_2_lib4_new+0x389>
mulsd  0x8(%r8),%xmm0
movsd  %xmm0,0x8(%r9)
movsd  (%r9),%xmm2
mulsd  0x8(%rsi),%xmm0
subsd  %xmm0,%xmm2
subsd  %xmm1,%xmm2
mulsd  (%r8),%xmm2
jmp    14aa <kernel_dtrsv_t_2_lib4_new+0x3aa>
divsd  0x28(%rsi),%xmm0
movsd  %xmm0,0x8(%r9)
movsd  (%r9),%xmm2
mulsd  0x8(%rsi),%xmm0
subsd  %xmm0,%xmm2
subsd  %xmm1,%xmm2
divsd  (%rsi),%xmm2
movsd  %xmm2,(%r9)
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

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