void kernel_dtrsv_t_2_lib4(int kmax, int inverted_diag, double *A, int sda,
                           double *x) {
  if (kmax <= 0)
    return;
  const int lda = 4;
  const int bs = 4;
  int k;
  double *tA, *tx;
  tA = A;
  tx = x;
  double x_0, x_1, x_2, x_3, y_0 = 0, y_1 = 0;
  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 (inverted_diag) {
    y_1 = x[1] - y_1;
    y_1 *= A[1 + lda * 1];
    x[1] = y_1;
    y_0 = x[0] - A[1 + lda * 0] * y_1 - y_0;
    y_0 *= A[0 + lda * 0];
    x[0] = y_0;
  } else {
    y_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>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8,-0x20(%rbp)
cmpl   $0x0,-0x4(%rbp)
jg     1124 <kernel_dtrsv_t_2_lib4+0x24>
jmp    18b8 <kernel_dtrsv_t_2_lib4+0x7b8>
movl   $0x4,-0x24(%rbp)
movl   $0x4,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x40(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
movl   $0x2,-0x2c(%rbp)
cmpl   $0x4,-0x4(%rbp)
jle    16d2 <kernel_dtrsv_t_2_lib4+0x5d2>
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movl   $0x4,-0x2c(%rbp)
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
shl    $0x2,%ecx
add    $0x4,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
prefetcht0 (%rax)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x7,%ecx
cmp    %ecx,%eax
jge    1538 <kernel_dtrsv_t_2_lib4+0x438>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
prefetcht0 (%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
prefetcht0 (%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x2c(%rbp)
jmp    1237 <kernel_dtrsv_t_2_lib4+0x137>
jmp    153d <kernel_dtrsv_t_2_lib4+0x43d>
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    16cd <kernel_dtrsv_t_2_lib4+0x5cd>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
prefetcht0 (%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x2c(%rbp)
jmp    153d <kernel_dtrsv_t_2_lib4+0x43d>
jmp    16ea <kernel_dtrsv_t_2_lib4+0x5ea>
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x20(%rbp)
jmp    16ef <kernel_dtrsv_t_2_lib4+0x5ef>
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    176d <kernel_dtrsv_t_2_lib4+0x66d>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    16ef <kernel_dtrsv_t_2_lib4+0x5ef>
mov    -0x38(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x20(%rbp)
cmpl   $0x0,-0x8(%rbp)
je     181e <kernel_dtrsv_t_2_lib4+0x71e>
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x70(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mulsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    18b8 <kernel_dtrsv_t_2_lib4+0x7b8>
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm1
movsd  -0x70(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x70(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  -0x68(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dtrsv_t_2_lib4>:
test   %edi,%edi
jle    14a4 <kernel_dtrsv_t_2_lib4+0x3a4>
push   %rbp
push   %r14
push   %rbx
cmp    $0x5,%edi
jb     12b4 <kernel_dtrsv_t_2_lib4+0x1b4>
movsd  0x10(%rdx),%xmm1
movsd  0x18(%rdx),%xmm2
movhpd 0x30(%rdx),%xmm1
movsd  0x10(%r8),%xmm3
movsd  0x18(%r8),%xmm0
unpcklpd %xmm3,%xmm3
mulpd  %xmm1,%xmm3
xorpd  %xmm1,%xmm1
addpd  %xmm3,%xmm1
movhpd 0x38(%rdx),%xmm2
unpcklpd %xmm0,%xmm0
mulpd  %xmm2,%xmm0
addpd  %xmm1,%xmm0
shl    $0x2,%ecx
movslq %ecx,%r11
prefetcht0 (%rdx,%r11,8)
lea    0x20(%r8),%rax
cmp    $0xc,%edi
jb     12cb <kernel_dtrsv_t_2_lib4+0x1cb>
lea    -0x7(%rdi),%r10d
lea    -0xc(%rdi),%r9d
and    $0xfffffff8,%r9d
mov    %r11,%rcx
shl    $0x4,%rcx
lea    0x0(,%r11,8),%rbx
lea    (%rbx,%rbx,2),%r14
mov    $0x4,%ebp
mov    %rdx,%rbx
prefetcht0 (%rbx,%rcx,1)
movsd  (%rbx,%r11,8),%xmm1
movsd  0x8(%rbx,%r11,8),%xmm6
movsd  0x10(%rbx,%r11,8),%xmm8
movhpd 0x20(%rbx,%r11,8),%xmm1
movsd  0x18(%rbx,%r11,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(%rbx,%r11,8),%xmm6
unpcklpd %xmm5,%xmm5
mulpd  %xmm6,%xmm5
movhpd 0x30(%rbx,%r11,8),%xmm8
movhpd 0x38(%rbx,%r11,8),%xmm3
addpd  %xmm7,%xmm5
prefetcht0 (%rbx,%r14,1)
movsd  (%rbx,%rcx,1),%xmm1
movsd  0x8(%rbx,%rcx,1),%xmm7
movsd  0x10(%rbx,%rcx,1),%xmm6
movsd  0x18(%rbx,%rcx,1),%xmm9
movhpd 0x20(%rbx,%rcx,1),%xmm1
movhpd 0x28(%rbx,%rcx,1),%xmm7
movhpd 0x30(%rbx,%rcx,1),%xmm6
movhpd 0x38(%rbx,%rcx,1),%xmm9
lea    (%rbx,%rcx,1),%rbx
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    %r10d,%ebp
jl     1190 <kernel_dtrsv_t_2_lib4+0x90>
addpd  %xmm4,%xmm3
add    $0xc,%r9d
lea    (%rbx,%r11,8),%r10
movapd %xmm3,%xmm0
jmp    12d5 <kernel_dtrsv_t_2_lib4+0x1d5>
lea    0x10(%rdx),%r10
lea    0x10(%r8),%rax
xorpd  %xmm0,%xmm0
mov    $0x2,%r9d
jmp    1388 <kernel_dtrsv_t_2_lib4+0x288>
lea    (%rdx,%r11,8),%r10
mov    $0x4,%r9d
lea    -0x3(%rdi),%ecx
cmp    %ecx,%r9d
jge    1388 <kernel_dtrsv_t_2_lib4+0x288>
shl    $0x3,%r11
cs nopw 0x0(%rax,%rax,1)
nop
prefetcht0 (%r10,%r11,1)
movsd  (%r10),%xmm4
movsd  0x8(%r10),%xmm3
movsd  0x10(%r10),%xmm2
movsd  0x18(%r10),%xmm8
movhpd 0x20(%r10),%xmm4
movhpd 0x28(%r10),%xmm3
movhpd 0x30(%r10),%xmm2
movhpd 0x38(%r10),%xmm8
add    %r11,%r10
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,%r9d
cmp    %ecx,%r9d
jl     12f0 <kernel_dtrsv_t_2_lib4+0x1f0>
addpd  %xmm6,%xmm5
movapd %xmm5,%xmm0
cmp    %edi,%r9d
jge    13a6 <kernel_dtrsv_t_2_lib4+0x2a6>
mov    %edi,%ebp
sub    %r9d,%ebp
mov    %r9d,%ecx
not    %ecx
test   $0x1,%bpl
jne    13af <kernel_dtrsv_t_2_lib4+0x2af>
add    %edi,%ecx
jne    13de <kernel_dtrsv_t_2_lib4+0x2de>
jmp    143e <kernel_dtrsv_t_2_lib4+0x33e>
movapd %xmm0,%xmm1
jmp    143e <kernel_dtrsv_t_2_lib4+0x33e>
movsd  (%r10),%xmm2
movhpd 0x20(%r10),%xmm2
movsd  (%rax),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm2,%xmm1
addpd  %xmm0,%xmm1
add    $0x8,%r10
add    $0x8,%rax
add    $0x1,%r9d
movapd %xmm1,%xmm0
add    %edi,%ecx
je     143e <kernel_dtrsv_t_2_lib4+0x33e>
sub    %r9d,%edi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  (%r10,%rcx,8),%xmm3
movsd  0x8(%r10,%rcx,8),%xmm4
movhpd 0x20(%r10,%rcx,8),%xmm3
movsd  (%rax,%rcx,8),%xmm2
movsd  0x8(%rax,%rcx,8),%xmm1
unpcklpd %xmm2,%xmm2
mulpd  %xmm3,%xmm2
addpd  %xmm0,%xmm2
movhpd 0x28(%r10,%rcx,8),%xmm4
unpcklpd %xmm1,%xmm1
mulpd  %xmm4,%xmm1
movapd %xmm1,%xmm0
addpd  %xmm2,%xmm0
add    $0x2,%rcx
cmp    %ecx,%edi
jne    13f0 <kernel_dtrsv_t_2_lib4+0x2f0>
addpd  %xmm2,%xmm1
movsd  0x8(%r8),%xmm0
movapd %xmm1,%xmm2
unpckhpd %xmm1,%xmm2
subsd  %xmm2,%xmm0
movsd  0x28(%rdx),%xmm2
test   %esi,%esi
je     147b <kernel_dtrsv_t_2_lib4+0x37b>
mulsd  %xmm2,%xmm0
movsd  %xmm0,0x8(%r8)
movsd  (%r8),%xmm2
mulsd  0x8(%rdx),%xmm0
subsd  %xmm0,%xmm2
subsd  %xmm1,%xmm2
mulsd  (%rdx),%xmm2
jmp    149b <kernel_dtrsv_t_2_lib4+0x39b>
divsd  %xmm2,%xmm0
movsd  %xmm0,0x8(%r8)
movsd  (%r8),%xmm2
mulsd  0x8(%rdx),%xmm0
subsd  %xmm0,%xmm2
subsd  %xmm1,%xmm2
divsd  (%rdx),%xmm2
movsd  %xmm2,(%r8)
pop    %rbx
pop    %r14
pop    %rbp
ret

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

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