void kernel_dtrmv_u_t_2_lib4(int kmax, double *A, int sda, double *x, double *y,
                             int alg) {
  __builtin_prefetch(A);
  const int lda = 4;
  const int bs = 4;
  int k;
  double x_0, x_1, x_2, x_3, y_0 = 0, y_1 = 0;
  k = 0;
  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;
  }
  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_1 += A[1 + lda * 1] * x_1;
  if (alg == 0) {
    y[0] = y_0;
    y[1] = y_1;
  } else if (alg == 1) {
    y[0] += y_0;
    y[1] += y_1;
  } else {
    y[0] -= y_0;
    y[1] -= y_1;
  }
}


x86 assembly (clang, -O0):
<kernel_dtrmv_u_t_2_lib4>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
mov    -0x10(%rbp),%rax
prefetcht0 (%rax)
movl   $0x4,-0x30(%rbp)
movl   $0x4,-0x34(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x7,%ecx
cmp    %ecx,%eax
jge    1447 <kernel_dtrmv_u_t_2_lib4+0x347>
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,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%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  0x10(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%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  0x18(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%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,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%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  0x10(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%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  0x18(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%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    -0x38(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x38(%rbp)
jmp    1146 <kernel_dtrmv_u_t_2_lib4+0x46>
jmp    144c <kernel_dtrmv_u_t_2_lib4+0x34c>
mov    -0x38(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    15dc <kernel_dtrmv_u_t_2_lib4+0x4dc>
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,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%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  0x10(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%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  0x18(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%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    -0x38(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x38(%rbp)
jmp    144c <kernel_dtrmv_u_t_2_lib4+0x34c>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x40(%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  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
cmpl   $0x0,-0x2c(%rbp)
jne    169c <kernel_dtrmv_u_t_2_lib4+0x59c>
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x8(%rax)
jmp    1700 <kernel_dtrmv_u_t_2_lib4+0x600>
cmpl   $0x1,-0x2c(%rbp)
jne    16cf <kernel_dtrmv_u_t_2_lib4+0x5cf>
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
addsd  0x8(%rax),%xmm0
movsd  %xmm0,0x8(%rax)
jmp    16fb <kernel_dtrmv_u_t_2_lib4+0x5fb>
movsd  -0x60(%rbp),%xmm1
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
movsd  -0x68(%rbp),%xmm1
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
jmp    1700 <kernel_dtrmv_u_t_2_lib4+0x600>
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dtrmv_u_t_2_lib4>:
push   %rbx
prefetcht0 (%rsi)
cmp    $0x8,%edi
jl     123f <kernel_dtrmv_u_t_2_lib4+0x13f>
lea    -0x7(%rdi),%r10d
lea    0x0(,%rdx,4),%eax
movslq %eax,%r11
lea    0x0(,%r11,8),%rax
shl    $0x4,%r11
xorpd  %xmm2,%xmm2
xor    %ebx,%ebx
nopl   (%rax)
prefetcht0 (%rsi,%rax,1)
movsd  (%rsi),%xmm0
movsd  0x8(%rsi),%xmm3
movsd  0x10(%rsi),%xmm4
movhpd 0x20(%rsi),%xmm0
movsd  0x18(%rsi),%xmm8
movsd  (%rcx),%xmm6
movsd  0x8(%rcx),%xmm7
movsd  0x10(%rcx),%xmm5
movsd  0x18(%rcx),%xmm1
unpcklpd %xmm6,%xmm6
mulpd  %xmm0,%xmm6
addpd  %xmm2,%xmm6
movhpd 0x28(%rsi),%xmm3
unpcklpd %xmm7,%xmm7
mulpd  %xmm3,%xmm7
addpd  %xmm6,%xmm7
movhpd 0x30(%rsi),%xmm4
unpcklpd %xmm5,%xmm5
mulpd  %xmm4,%xmm5
addpd  %xmm7,%xmm5
movhpd 0x38(%rsi),%xmm8
unpcklpd %xmm1,%xmm1
mulpd  %xmm8,%xmm1
addpd  %xmm5,%xmm1
prefetcht0 (%rsi,%r11,1)
movsd  (%rsi,%rax,1),%xmm5
movsd  0x8(%rsi,%rax,1),%xmm4
movsd  0x10(%rsi,%rax,1),%xmm3
movsd  0x18(%rsi,%rax,1),%xmm8
movhpd 0x20(%rsi,%rax,1),%xmm5
movhpd 0x28(%rsi,%rax,1),%xmm4
movhpd 0x30(%rsi,%rax,1),%xmm3
movhpd 0x38(%rsi,%rax,1),%xmm8
lea    (%rsi,%r11,1),%rsi
movsd  0x20(%rcx),%xmm7
movsd  0x28(%rcx),%xmm2
movsd  0x30(%rcx),%xmm6
movsd  0x38(%rcx),%xmm0
unpcklpd %xmm7,%xmm7
mulpd  %xmm5,%xmm7
addpd  %xmm1,%xmm7
unpcklpd %xmm2,%xmm2
mulpd  %xmm4,%xmm2
addpd  %xmm7,%xmm2
unpcklpd %xmm6,%xmm6
mulpd  %xmm3,%xmm6
addpd  %xmm2,%xmm6
unpcklpd %xmm0,%xmm0
mulpd  %xmm8,%xmm0
movapd %xmm0,%xmm2
addpd  %xmm6,%xmm2
add    $0x40,%rcx
add    $0x8,%ebx
cmp    %r10d,%ebx
jl     1130 <kernel_dtrmv_u_t_2_lib4+0x30>
addpd  %xmm6,%xmm0
mov    %edi,%eax
and    $0xfffffff8,%eax
jmp    1245 <kernel_dtrmv_u_t_2_lib4+0x145>
xorpd  %xmm0,%xmm0
xor    %eax,%eax
add    $0xfffffffd,%edi
cmp    %edi,%eax
jge    12ef <kernel_dtrmv_u_t_2_lib4+0x1ef>
shl    $0x2,%edx
movslq %edx,%rdx
shl    $0x3,%rdx
nopw   0x0(%rax,%rax,1)
prefetcht0 (%rsi,%rdx,1)
movsd  (%rsi),%xmm4
movsd  0x8(%rsi),%xmm3
movsd  0x10(%rsi),%xmm2
movsd  0x18(%rsi),%xmm8
movhpd 0x20(%rsi),%xmm4
movhpd 0x28(%rsi),%xmm3
movhpd 0x30(%rsi),%xmm2
movhpd 0x38(%rsi),%xmm8
add    %rdx,%rsi
movsd  (%rcx),%xmm7
movsd  0x8(%rcx),%xmm1
movsd  0x10(%rcx),%xmm6
movsd  0x18(%rcx),%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,%rcx
add    $0x4,%eax
cmp    %edi,%eax
jl     1260 <kernel_dtrmv_u_t_2_lib4+0x160>
addpd  %xmm6,%xmm5
movapd %xmm5,%xmm0
movupd (%rcx),%xmm2
movapd %xmm0,%xmm1
unpckhpd %xmm0,%xmm1
movsd  0x20(%rsi),%xmm3
mulsd  %xmm2,%xmm3
addsd  %xmm1,%xmm3
movsd  (%rsi),%xmm1
movhpd 0x28(%rsi),%xmm1
unpcklpd %xmm3,%xmm0
mulpd  %xmm2,%xmm1
addpd  %xmm0,%xmm1
cmp    $0x1,%r9d
je     1338 <kernel_dtrmv_u_t_2_lib4+0x238>
test   %r9d,%r9d
je     1341 <kernel_dtrmv_u_t_2_lib4+0x241>
movupd (%r8),%xmm0
subpd  %xmm1,%xmm0
movupd %xmm0,(%r8)
pop    %rbx
ret
movupd (%r8),%xmm0
addpd  %xmm0,%xmm1
movupd %xmm1,(%r8)
pop    %rbx
ret

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

LLVM IR (-O2):
define void @kernel_dtrmv_u_t_2_lib4(i32 %0, double* nocapture %1, i32 %2, double* nocapture %3, double* nocapture %4, i32 %5) {
%7 = bitcast double* %1 to i8*
tail call void @llvm.prefetch.p0i8(i8* %7, i32 0, i32 3, i32 1)
%8 = add nsw i32 %0, -7
%9 = icmp sgt i32 %0, 7
br i1 %9, label %10, label %23
10: ; preds = %6
%11 = shl nsw i32 %2, 2
%12 = sext i32 %11 to i64
br label %33
13: ; preds = %33
%14 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %51, <2 x double> %53, <2 x double> %37)
%15 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %60, <2 x double> %62, <2 x double> %14)
%16 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %69, <2 x double> %71, <2 x double> %15)
%17 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %78, <2 x double> %80, <2 x double> %16)
%18 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %96, <2 x double> %98, <2 x double> %17)
%19 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %105, <2 x double> %107, <2 x double> %18)
%20 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %114, <2 x double> %116, <2 x double> %19)
%21 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %123, <2 x double> %125, <2 x double> %20)
%22 = and i32 %0, -8
br label %23
23: ; preds = %13, %6
%24 = phi double* [ %3, %6 ], [ %127, %13 ]
%25 = phi double* [ %1, %6 ], [ %83, %13 ]
%26 = phi i32 [ 0, %6 ], [ %22, %13 ]
%27 = phi <2 x double> [ zeroinitializer, %6 ], [ %21, %13 ]
%28 = add nsw i32 %0, -3
%29 = icmp slt i32 %26, %28
br i1 %29, label %30, label %187
30: ; preds = %23
%31 = shl nsw i32 %2, 2
%32 = sext i32 %31 to i64
br label %130
33: ; preds = %10, %33
%34 = phi i32 [ 0, %10 ], [ %128, %33 ]
%35 = phi double* [ %1, %10 ], [ %83, %33 ]
%36 = phi double* [ %3, %10 ], [ %127, %33 ]
%37 = phi <2 x double> [ zeroinitializer, %10 ], [ %126, %33 ]
%38 = getelementptr inbounds double, double* %35, i64 %12
%39 = bitcast double* %38 to i8*
tail call void @llvm.prefetch.p0i8(i8* %39, i32 0, i32 3, i32 1)
%40 = load double, double* %36
%41 = getelementptr inbounds double, double* %36, i64 1
%42 = load double, double* %41
%43 = getelementptr inbounds double, double* %36, i64 2
%44 = load double, double* %43
%45 = getelementptr inbounds double, double* %36, i64 3
%46 = load double, double* %45
%47 = load double, double* %35
%48 = getelementptr inbounds double, double* %35, i64 4
%49 = load double, double* %48
%50 = insertelement <2 x double> poison, double %47, i64 0
%51 = insertelement <2 x double> %50, double %49, i64 1
%52 = insertelement <2 x double> poison, double %40, i64 0
%53 = shufflevector <2 x double> %52, <2 x double> poison, <2 x i32> zeroinitializer
%54 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %51, <2 x double> %53, <2 x double> %37)
%55 = getelementptr inbounds double, double* %35, i64 1
%56 = load double, double* %55
%57 = getelementptr inbounds double, double* %35, i64 5
%58 = load double, double* %57
%59 = insertelement <2 x double> poison, double %56, i64 0
%60 = insertelement <2 x double> %59, double %58, i64 1
%61 = insertelement <2 x double> poison, double %42, i64 0
%62 = shufflevector <2 x double> %61, <2 x double> poison, <2 x i32> zeroinitializer
%63 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %60, <2 x double> %62, <2 x double> %54)
%64 = getelementptr inbounds double, double* %35, i64 2
%65 = load double, double* %64
%66 = getelementptr inbounds double, double* %35, i64 6
%67 = load double, double* %66
%68 = insertelement <2 x double> poison, double %65, i64 0
%69 = insertelement <2 x double> %68, double %67, i64 1
%70 = insertelement <2 x double> poison, double %44, i64 0
%71 = shufflevector <2 x double> %70, <2 x double> poison, <2 x i32> zeroinitializer
%72 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %69, <2 x double> %71, <2 x double> %63)
%73 = getelementptr inbounds double, double* %35, i64 3
%74 = load double, double* %73
%75 = getelementptr inbounds double, double* %35, i64 7
%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 %46, 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> %72)
%82 = getelementptr inbounds double, double* %36, i64 4
%83 = getelementptr inbounds double, double* %38, i64 %12
%84 = bitcast double* %83 to i8*
tail call void @llvm.prefetch.p0i8(i8* %84, i32 0, i32 3, i32 1)
%85 = load double, double* %82
%86 = getelementptr inbounds double, double* %36, i64 5
%87 = load double, double* %86
%88 = getelementptr inbounds double, double* %36, i64 6
%89 = load double, double* %88
%90 = getelementptr inbounds double, double* %36, i64 7
%91 = load double, double* %90
%92 = load double, double* %38
%93 = getelementptr inbounds double, double* %38, i64 4
%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 %85, 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> %81)
%100 = getelementptr inbounds double, double* %38, i64 1
%101 = load double, double* %100
%102 = getelementptr inbounds double, double* %38, i64 5
%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 %87, 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* %38, i64 2
%110 = load double, double* %109
%111 = getelementptr inbounds double, double* %38, i64 6
%112 = load double, double* %111
%113 = insertelement <2 x double> poison, double %110, i64 0
%114 = insertelement <2 x double> %113, double %112, i64 1
%115 = insertelement <2 x double> poison, double %89, i64 0
%116 = shufflevector <2 x double> %115, <2 x double> poison, <2 x i32> zeroinitializer
%117 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %114, <2 x double> %116, <2 x double> %108)
%118 = getelementptr inbounds double, double* %38, i64 3
%119 = load double, double* %118
%120 = getelementptr inbounds double, double* %38, i64 7
%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 %91, 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> %117)
%127 = getelementptr inbounds double, double* %36, i64 8
%128 = add nuw nsw i32 %34, 8
%129 = icmp slt i32 %128, %8
br i1 %129, label %33, label %13
130: ; preds = %30, %130
%131 = phi i32 [ %26, %30 ], [ %180, %130 ]
%132 = phi double* [ %25, %30 ], [ %135, %130 ]
%133 = phi double* [ %24, %30 ], [ %179, %130 ]
%134 = phi <2 x double> [ %27, %30 ], [ %178, %130 ]
%135 = getelementptr inbounds double, double* %132, i64 %32
%136 = bitcast double* %135 to i8*
tail call void @llvm.prefetch.p0i8(i8* %136, i32 0, i32 3, i32 1)
%137 = load double, double* %133
%138 = getelementptr inbounds double, double* %133, i64 1
%139 = load double, double* %138
%140 = getelementptr inbounds double, double* %133, i64 2
%141 = load double, double* %140
%142 = getelementptr inbounds double, double* %133, i64 3
%143 = load double, double* %142
%144 = load double, double* %132
%145 = getelementptr inbounds double, double* %132, i64 4
%146 = load double, double* %145
%147 = insertelement <2 x double> poison, double %144, i64 0
%148 = insertelement <2 x double> %147, double %146, i64 1
%149 = insertelement <2 x double> poison, double %137, i64 0
%150 = shufflevector <2 x double> %149, <2 x double> poison, <2 x i32> zeroinitializer
%151 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %148, <2 x double> %150, <2 x double> %134)
%152 = getelementptr inbounds double, double* %132, i64 1
%153 = load double, double* %152
%154 = getelementptr inbounds double, double* %132, i64 5
%155 = load double, double* %154
%156 = insertelement <2 x double> poison, double %153, i64 0
%157 = insertelement <2 x double> %156, double %155, i64 1
%158 = insertelement <2 x double> poison, double %139, i64 0
%159 = shufflevector <2 x double> %158, <2 x double> poison, <2 x i32> zeroinitializer
%160 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %157, <2 x double> %159, <2 x double> %151)
%161 = getelementptr inbounds double, double* %132, i64 2
%162 = load double, double* %161
%163 = getelementptr inbounds double, double* %132, i64 6
%164 = load double, double* %163
%165 = insertelement <2 x double> poison, double %162, i64 0
%166 = insertelement <2 x double> %165, double %164, i64 1
%167 = insertelement <2 x double> poison, double %141, i64 0
%168 = shufflevector <2 x double> %167, <2 x double> poison, <2 x i32> zeroinitializer
%169 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %166, <2 x double> %168, <2 x double> %160)
%170 = getelementptr inbounds double, double* %132, i64 3
%171 = load double, double* %170
%172 = getelementptr inbounds double, double* %132, i64 7
%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 %143, 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> %169)
%179 = getelementptr inbounds double, double* %133, i64 4
%180 = add nuw nsw i32 %131, 4
%181 = icmp slt i32 %180, %28
br i1 %181, label %130, label %182
182: ; preds = %130
%183 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %148, <2 x double> %150, <2 x double> %134)
%184 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %157, <2 x double> %159, <2 x double> %183)
%185 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %166, <2 x double> %168, <2 x double> %184)
%186 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %175, <2 x double> %177, <2 x double> %185)
br label %187
187: ; preds = %182, %23
%188 = phi double* [ %24, %23 ], [ %179, %182 ]
%189 = phi double* [ %25, %23 ], [ %135, %182 ]
%190 = phi <2 x double> [ %27, %23 ], [ %186, %182 ]
%191 = bitcast double* %188 to <2 x double>*
%192 = load <2 x double>, <2 x double>* %191
%193 = load double, double* %189
%194 = getelementptr inbounds double, double* %189, i64 4
%195 = load double, double* %194
%196 = extractelement <2 x double> %192, i64 0
%197 = extractelement <2 x double> %190, i64 1
%198 = tail call double @llvm.fmuladd.f64(double %195, double %196, double %197)
%199 = getelementptr inbounds double, double* %189, i64 5
%200 = load double, double* %199
%201 = insertelement <2 x double> poison, double %193, i64 0
%202 = insertelement <2 x double> %201, double %200, i64 1
%203 = insertelement <2 x double> %190, double %198, i64 1
%204 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %202, <2 x double> %192, <2 x double> %203)
switch i32 %5, label %212 [
i32 0, label %205
i32 1, label %207
]
205: ; preds = %187
%206 = bitcast double* %4 to <2 x double>*
store <2 x double> %204, <2 x double>* %206
br label %217
207: ; preds = %187
%208 = bitcast double* %4 to <2 x double>*
%209 = load <2 x double>, <2 x double>* %208
%210 = fadd <2 x double> %204, %209
%211 = bitcast double* %4 to <2 x double>*
store <2 x double> %210, <2 x double>* %211
br label %217
212: ; preds = %187
%213 = bitcast double* %4 to <2 x double>*
%214 = load <2 x double>, <2 x double>* %213
%215 = fsub <2 x double> %214, %204
%216 = bitcast double* %4 to <2 x double>*
store <2 x double> %215, <2 x double>* %216
br label %217
217: ; preds = %207, %212, %205
ret void
}