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


x86 assembly (clang, -O0):
<kernel_dtrsv_t_3_lib4>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8,-0x20(%rbp)
cmpl   $0x0,-0x4(%rbp)
jg     1124 <kernel_dtrsv_t_3_lib4+0x24>
jmp    1b7a <kernel_dtrsv_t_3_lib4+0xa7a>
movl   $0x4,-0x24(%rbp)
movl   $0x4,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x40(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
movl   $0x3,-0x2c(%rbp)
cmpl   $0x4,-0x4(%rbp)
jle    1888 <kernel_dtrsv_t_3_lib4+0x788>
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movl   $0x4,-0x2c(%rbp)
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
shl    $0x2,%ecx
add    $0x4,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
add    $0x40,%rax
prefetcht0 (%rax)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x7,%ecx
cmp    %ecx,%eax
jge    1653 <kernel_dtrsv_t_3_lib4+0x553>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0x40,%rax
prefetcht0 (%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0x40,%rax
prefetcht0 (%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x2c(%rbp)
jmp    121c <kernel_dtrsv_t_3_lib4+0x11c>
jmp    1658 <kernel_dtrsv_t_3_lib4+0x558>
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1883 <kernel_dtrsv_t_3_lib4+0x783>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0x40,%rax
prefetcht0 (%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x2c(%rbp)
jmp    1658 <kernel_dtrsv_t_3_lib4+0x558>
jmp    18a0 <kernel_dtrsv_t_3_lib4+0x7a0>
mov    -0x10(%rbp),%rax
add    $0x18,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x18,%rax
mov    %rax,-0x20(%rbp)
jmp    18a5 <kernel_dtrsv_t_3_lib4+0x7a5>
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1943 <kernel_dtrsv_t_3_lib4+0x843>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    18a5 <kernel_dtrsv_t_3_lib4+0x7a5>
mov    -0x38(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x20(%rbp)
cmpl   $0x0,-0x8(%rbp)
je     1a68 <kernel_dtrsv_t_3_lib4+0x968>
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
subsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
mulsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x70(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mulsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    1b7a <kernel_dtrsv_t_3_lib4+0xa7a>
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
subsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm1
movsd  -0x78(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm1
movsd  -0x70(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x70(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  -0x68(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
pop    %rbp
ret

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

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

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