void kernel_dtrmv_u_n_2_lib4(int kmax, double *A, double *x, double *y,
                             int alg) {
  if (kmax <= 0)
    return;
  const int lda = 4;
  int k;
  double x_0, x_1, x_2, x_3, y_0 = 0, y_1 = 0;
  x_0 = x[0];
  x_1 = x[1];
  y_0 += A[0 + lda * 0] * x_0;
  y_0 += A[0 + lda * 1] * x_1;
  y_1 += A[1 + lda * 1] * x_1;
  A += 2 * lda;
  x += 2;
  k = 2;
  for (; k < kmax - 3; k += 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[1 + lda * 0] * x_0;
    y_0 += A[0 + lda * 1] * x_1;
    y_1 += A[1 + lda * 1] * x_1;
    y_0 += A[0 + lda * 2] * x_2;
    y_1 += A[1 + lda * 2] * x_2;
    y_0 += A[0 + lda * 3] * x_3;
    y_1 += A[1 + lda * 3] * x_3;
    A += 4 * lda;
    x += 4;
  }
  for (; k < kmax; k++) {
    x_0 = x[0];
    y_0 += A[0 + lda * 0] * x_0;
    y_1 += A[1 + lda * 0] * x_0;
    A += 1 * lda;
    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_n_2_lib4>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
cmpl   $0x0,-0x4(%rbp)
jg     1126 <kernel_dtrmv_u_n_2_lib4+0x26>
jmp    1456 <kernel_dtrmv_u_n_2_lib4+0x356>
movl   $0x4,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x18(%rbp)
movl   $0x2,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1345 <kernel_dtrmv_u_n_2_lib4+0x245>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x38(%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  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%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  0x40(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%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  0x60(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x18(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x2c(%rbp)
jmp    11d6 <kernel_dtrmv_u_n_2_lib4+0xd6>
jmp    134a <kernel_dtrmv_u_n_2_lib4+0x24a>
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    13c8 <kernel_dtrmv_u_n_2_lib4+0x2c8>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x18(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    134a <kernel_dtrmv_u_n_2_lib4+0x24a>
cmpl   $0x0,-0x24(%rbp)
jne    13f2 <kernel_dtrmv_u_n_2_lib4+0x2f2>
movsd  -0x58(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x60(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
jmp    1456 <kernel_dtrmv_u_n_2_lib4+0x356>
cmpl   $0x1,-0x24(%rbp)
jne    1425 <kernel_dtrmv_u_n_2_lib4+0x325>
movsd  -0x58(%rbp),%xmm0
mov    -0x20(%rbp),%rax
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
movsd  -0x60(%rbp),%xmm0
mov    -0x20(%rbp),%rax
addsd  0x8(%rax),%xmm0
movsd  %xmm0,0x8(%rax)
jmp    1451 <kernel_dtrmv_u_n_2_lib4+0x351>
movsd  -0x58(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
movsd  -0x60(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
jmp    1456 <kernel_dtrmv_u_n_2_lib4+0x356>
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dtrmv_u_n_2_lib4>:
test   %edi,%edi
jle    1299 <kernel_dtrmv_u_n_2_lib4+0x199>
movsd  (%rsi),%xmm0
mulsd  (%rdx),%xmm0
xorpd  %xmm1,%xmm1
addsd  %xmm0,%xmm1
movupd 0x20(%rsi),%xmm0
movsd  0x8(%rdx),%xmm2
unpcklpd %xmm2,%xmm2
mulpd  %xmm0,%xmm2
movq   %xmm1,%xmm0
addpd  %xmm2,%xmm0
add    $0x40,%rsi
add    $0x10,%rdx
mov    $0x2,%r9d
cmp    $0x6,%edi
jb     11d8 <kernel_dtrmv_u_n_2_lib4+0xd8>
lea    -0x3(%rdi),%r10d
lea    -0x6(%rdi),%r9d
and    $0xfffffffc,%r9d
mov    $0x2,%eax
nopw   0x0(%rax,%rax,1)
movupd (%rsi),%xmm3
movupd 0x20(%rsi),%xmm4
movupd 0x40(%rsi),%xmm5
movupd 0x60(%rsi),%xmm8
movsd  (%rdx),%xmm7
movsd  0x8(%rdx),%xmm6
movsd  0x10(%rdx),%xmm2
movsd  0x18(%rdx),%xmm1
unpcklpd %xmm7,%xmm7
mulpd  %xmm3,%xmm7
addpd  %xmm0,%xmm7
unpcklpd %xmm6,%xmm6
mulpd  %xmm4,%xmm6
addpd  %xmm7,%xmm6
unpcklpd %xmm2,%xmm2
mulpd  %xmm5,%xmm2
addpd  %xmm6,%xmm2
unpcklpd %xmm1,%xmm1
mulpd  %xmm8,%xmm1
movapd %xmm1,%xmm0
addpd  %xmm2,%xmm0
sub    $0xffffffffffffff80,%rsi
add    $0x20,%rdx
add    $0x4,%eax
cmp    %r10d,%eax
jl     1160 <kernel_dtrmv_u_n_2_lib4+0x60>
addpd  %xmm2,%xmm1
add    $0x6,%r9d
movapd %xmm1,%xmm0
cmp    %edi,%r9d
jge    11f3 <kernel_dtrmv_u_n_2_lib4+0xf3>
mov    %edi,%eax
sub    %r9d,%eax
mov    %r9d,%r10d
not    %r10d
test   $0x1,%al
jne    11f9 <kernel_dtrmv_u_n_2_lib4+0xf9>
add    %edi,%r10d
jne    1222 <kernel_dtrmv_u_n_2_lib4+0x122>
jmp    1270 <kernel_dtrmv_u_n_2_lib4+0x170>
movapd %xmm0,%xmm1
jmp    1270 <kernel_dtrmv_u_n_2_lib4+0x170>
movupd (%rsi),%xmm2
movsd  (%rdx),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm2,%xmm1
addpd  %xmm0,%xmm1
add    $0x20,%rsi
add    $0x8,%rdx
add    $0x1,%r9d
movapd %xmm1,%xmm0
add    %edi,%r10d
je     1270 <kernel_dtrmv_u_n_2_lib4+0x170>
sub    %r9d,%edi
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movsd  (%rdx,%rax,8),%xmm3
movsd  0x8(%rdx,%rax,8),%xmm1
unpcklpd %xmm3,%xmm3
movupd (%rsi),%xmm2
mulpd  %xmm3,%xmm2
addpd  %xmm0,%xmm2
movupd 0x20(%rsi),%xmm0
unpcklpd %xmm1,%xmm1
mulpd  %xmm0,%xmm1
movapd %xmm1,%xmm0
addpd  %xmm2,%xmm0
add    $0x2,%rax
add    $0x40,%rsi
cmp    %eax,%edi
jne    1230 <kernel_dtrmv_u_n_2_lib4+0x130>
addpd  %xmm2,%xmm1
cmp    $0x1,%r8d
je     1280 <kernel_dtrmv_u_n_2_lib4+0x180>
test   %r8d,%r8d
jne    128d <kernel_dtrmv_u_n_2_lib4+0x18d>
movupd %xmm1,(%rcx)
ret
movupd (%rcx),%xmm0
addpd  %xmm0,%xmm1
movupd %xmm1,(%rcx)
ret
movupd (%rcx),%xmm0
subpd  %xmm1,%xmm0
movupd %xmm0,(%rcx)
ret

LLVM IR (-O0):
define void @kernel_dtrmv_u_n_2_lib4(i32 %0, double* %1, double* %2, double* %3, i32 %4) {
%6 = alloca i32
%7 = alloca double*
%8 = alloca double*
%9 = alloca double*
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca double
store i32 %0, i32* %6
store double* %1, double** %7
store double* %2, double** %8
store double* %3, double** %9
store i32 %4, i32* %10
%19 = load i32, i32* %6
%20 = icmp sle i32 %19, 0
br i1 %20, label %21, label %22
21: ; preds = %5
br label %188
22: ; preds = %5
store i32 4, i32* %11
store double 0.000000e+00, double* %17
store double 0.000000e+00, double* %18
%23 = load double*, double** %8
%24 = getelementptr inbounds double, double* %23, i64 0
%25 = load double, double* %24
store double %25, double* %13
%26 = load double*, double** %8
%27 = getelementptr inbounds double, double* %26, i64 1
%28 = load double, double* %27
store double %28, double* %14
%29 = load double*, double** %7
%30 = getelementptr inbounds double, double* %29, i64 0
%31 = load double, double* %30
%32 = load double, double* %13
%33 = load double, double* %17
%34 = call double @llvm.fmuladd.f64(double %31, double %32, double %33)
store double %34, double* %17
%35 = load double*, double** %7
%36 = getelementptr inbounds double, double* %35, i64 4
%37 = load double, double* %36
%38 = load double, double* %14
%39 = load double, double* %17
%40 = call double @llvm.fmuladd.f64(double %37, double %38, double %39)
store double %40, double* %17
%41 = load double*, double** %7
%42 = getelementptr inbounds double, double* %41, i64 5
%43 = load double, double* %42
%44 = load double, double* %14
%45 = load double, double* %18
%46 = call double @llvm.fmuladd.f64(double %43, double %44, double %45)
store double %46, double* %18
%47 = load double*, double** %7
%48 = getelementptr inbounds double, double* %47, i64 8
store double* %48, double** %7
%49 = load double*, double** %8
%50 = getelementptr inbounds double, double* %49, i64 2
store double* %50, double** %8
store i32 2, i32* %12
br label %51
51: ; preds = %121, %22
%52 = load i32, i32* %12
%53 = load i32, i32* %6
%54 = sub nsw i32 %53, 3
%55 = icmp slt i32 %52, %54
br i1 %55, label %56, label %124
56: ; preds = %51
%57 = load double*, double** %8
%58 = getelementptr inbounds double, double* %57, i64 0
%59 = load double, double* %58
store double %59, double* %13
%60 = load double*, double** %8
%61 = getelementptr inbounds double, double* %60, i64 1
%62 = load double, double* %61
store double %62, double* %14
%63 = load double*, double** %8
%64 = getelementptr inbounds double, double* %63, i64 2
%65 = load double, double* %64
store double %65, double* %15
%66 = load double*, double** %8
%67 = getelementptr inbounds double, double* %66, i64 3
%68 = load double, double* %67
store double %68, double* %16
%69 = load double*, double** %7
%70 = getelementptr inbounds double, double* %69, i64 0
%71 = load double, double* %70
%72 = load double, double* %13
%73 = load double, double* %17
%74 = call double @llvm.fmuladd.f64(double %71, double %72, double %73)
store double %74, double* %17
%75 = load double*, double** %7
%76 = getelementptr inbounds double, double* %75, i64 1
%77 = load double, double* %76
%78 = load double, double* %13
%79 = load double, double* %18
%80 = call double @llvm.fmuladd.f64(double %77, double %78, double %79)
store double %80, double* %18
%81 = load double*, double** %7
%82 = getelementptr inbounds double, double* %81, i64 4
%83 = load double, double* %82
%84 = load double, double* %14
%85 = load double, double* %17
%86 = call double @llvm.fmuladd.f64(double %83, double %84, double %85)
store double %86, double* %17
%87 = load double*, double** %7
%88 = getelementptr inbounds double, double* %87, i64 5
%89 = load double, double* %88
%90 = load double, double* %14
%91 = load double, double* %18
%92 = call double @llvm.fmuladd.f64(double %89, double %90, double %91)
store double %92, double* %18
%93 = load double*, double** %7
%94 = getelementptr inbounds double, double* %93, i64 8
%95 = load double, double* %94
%96 = load double, double* %15
%97 = load double, double* %17
%98 = call double @llvm.fmuladd.f64(double %95, double %96, double %97)
store double %98, double* %17
%99 = load double*, double** %7
%100 = getelementptr inbounds double, double* %99, i64 9
%101 = load double, double* %100
%102 = load double, double* %15
%103 = load double, double* %18
%104 = call double @llvm.fmuladd.f64(double %101, double %102, double %103)
store double %104, double* %18
%105 = load double*, double** %7
%106 = getelementptr inbounds double, double* %105, i64 12
%107 = load double, double* %106
%108 = load double, double* %16
%109 = load double, double* %17
%110 = call double @llvm.fmuladd.f64(double %107, double %108, double %109)
store double %110, double* %17
%111 = load double*, double** %7
%112 = getelementptr inbounds double, double* %111, i64 13
%113 = load double, double* %112
%114 = load double, double* %16
%115 = load double, double* %18
%116 = call double @llvm.fmuladd.f64(double %113, double %114, double %115)
store double %116, double* %18
%117 = load double*, double** %7
%118 = getelementptr inbounds double, double* %117, i64 16
store double* %118, double** %7
%119 = load double*, double** %8
%120 = getelementptr inbounds double, double* %119, i64 4
store double* %120, double** %8
br label %121
121: ; preds = %56
%122 = load i32, i32* %12
%123 = add nsw i32 %122, 4
store i32 %123, i32* %12
br label %51
124: ; preds = %51
br label %125
125: ; preds = %149, %124
%126 = load i32, i32* %12
%127 = load i32, i32* %6
%128 = icmp slt i32 %126, %127
br i1 %128, label %129, label %152
129: ; preds = %125
%130 = load double*, double** %8
%131 = getelementptr inbounds double, double* %130, i64 0
%132 = load double, double* %131
store double %132, double* %13
%133 = load double*, double** %7
%134 = getelementptr inbounds double, double* %133, i64 0
%135 = load double, double* %134
%136 = load double, double* %13
%137 = load double, double* %17
%138 = call double @llvm.fmuladd.f64(double %135, double %136, double %137)
store double %138, double* %17
%139 = load double*, double** %7
%140 = getelementptr inbounds double, double* %139, i64 1
%141 = load double, double* %140
%142 = load double, double* %13
%143 = load double, double* %18
%144 = call double @llvm.fmuladd.f64(double %141, double %142, double %143)
store double %144, double* %18
%145 = load double*, double** %7
%146 = getelementptr inbounds double, double* %145, i64 4
store double* %146, double** %7
%147 = load double*, double** %8
%148 = getelementptr inbounds double, double* %147, i64 1
store double* %148, double** %8
br label %149
149: ; preds = %129
%150 = load i32, i32* %12
%151 = add nsw i32 %150, 1
store i32 %151, i32* %12
br label %125
152: ; preds = %125
%153 = load i32, i32* %10
%154 = icmp eq i32 %153, 0
br i1 %154, label %155, label %162
155: ; preds = %152
%156 = load double, double* %17
%157 = load double*, double** %9
%158 = getelementptr inbounds double, double* %157, i64 0
store double %156, double* %158
%159 = load double, double* %18
%160 = load double*, double** %9
%161 = getelementptr inbounds double, double* %160, i64 1
store double %159, double* %161
br label %188
162: ; preds = %152
%163 = load i32, i32* %10
%164 = icmp eq i32 %163, 1
br i1 %164, label %165, label %176
165: ; preds = %162
%166 = load double, double* %17
%167 = load double*, double** %9
%168 = getelementptr inbounds double, double* %167, i64 0
%169 = load double, double* %168
%170 = fadd double %169, %166
store double %170, double* %168
%171 = load double, double* %18
%172 = load double*, double** %9
%173 = getelementptr inbounds double, double* %172, i64 1
%174 = load double, double* %173
%175 = fadd double %174, %171
store double %175, double* %173
br label %187
176: ; preds = %162
%177 = load double, double* %17
%178 = load double*, double** %9
%179 = getelementptr inbounds double, double* %178, i64 0
%180 = load double, double* %179
%181 = fsub double %180, %177
store double %181, double* %179
%182 = load double, double* %18
%183 = load double*, double** %9
%184 = getelementptr inbounds double, double* %183, i64 1
%185 = load double, double* %184
%186 = fsub double %185, %182
store double %186, double* %184
br label %187
187: ; preds = %176, %165
br label %188
188: ; preds = %21, %187, %155
ret void
}

LLVM IR (-O2):
define void @kernel_dtrmv_u_n_2_lib4(i32 %0, double* nocapture %1, double* nocapture %2, double* nocapture %3, i32 %4) {
%6 = icmp slt i32 %0, 1
br i1 %6, label %141, label %7
7: ; preds = %5
%8 = load double, double* %2
%9 = getelementptr inbounds double, double* %2, i64 1
%10 = load double, double* %9
%11 = load double, double* %1
%12 = tail call double @llvm.fmuladd.f64(double %11, double %8, double 0.000000e+00)
%13 = getelementptr inbounds double, double* %1, i64 4
%14 = bitcast double* %13 to <2 x double>*
%15 = load <2 x double>, <2 x double>* %14
%16 = insertelement <2 x double> poison, double %10, i64 0
%17 = shufflevector <2 x double> %16, <2 x double> poison, <2 x i32> zeroinitializer
%18 = insertelement <2 x double> <double poison, double 0.000000e+00>, double %12, i64 0
%19 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %15, <2 x double> %17, <2 x double> %18)
%20 = getelementptr inbounds double, double* %1, i64 8
%21 = getelementptr inbounds double, double* %2, i64 2
%22 = add nsw i32 %0, -3
%23 = icmp ugt i32 %0, 5
br i1 %23, label %24, label %33
24: ; preds = %7
%25 = add nsw i32 %0, -6
%26 = and i32 %25, -4
br label %63
27: ; preds = %63
%28 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %76, <2 x double> %78, <2 x double> %67)
%29 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %82, <2 x double> %84, <2 x double> %28)
%30 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %88, <2 x double> %90, <2 x double> %29)
%31 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %94, <2 x double> %96, <2 x double> %30)
%32 = add i32 %26, 6
br label %33
33: ; preds = %27, %7
%34 = phi i32 [ 2, %7 ], [ %32, %27 ]
%35 = phi double* [ %21, %7 ], [ %99, %27 ]
%36 = phi double* [ %20, %7 ], [ %98, %27 ]
%37 = phi <2 x double> [ %19, %7 ], [ %31, %27 ]
%38 = icmp slt i32 %34, %0
br i1 %38, label %39, label %127
39: ; preds = %33
%40 = sub i32 %0, %34
%41 = xor i32 %34, -1
%42 = and i32 %40, 1
%43 = icmp eq i32 %42, 0
br i1 %43, label %55, label %44
44: ; preds = %39
%45 = load double, double* %35
%46 = bitcast double* %36 to <2 x double>*
%47 = load <2 x double>, <2 x double>* %46
%48 = insertelement <2 x double> poison, double %45, i64 0
%49 = shufflevector <2 x double> %48, <2 x double> poison, <2 x i32> zeroinitializer
%50 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %47, <2 x double> %49, <2 x double> %37)
%51 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %47, <2 x double> %49, <2 x double> %37)
%52 = getelementptr inbounds double, double* %36, i64 4
%53 = getelementptr inbounds double, double* %35, i64 1
%54 = add nuw nsw i32 %34, 1
br label %55
55: ; preds = %44, %39
%56 = phi <2 x double> [ undef, %39 ], [ %51, %44 ]
%57 = phi double* [ %36, %39 ], [ %52, %44 ]
%58 = phi double* [ %35, %39 ], [ %53, %44 ]
%59 = phi i32 [ %34, %39 ], [ %54, %44 ]
%60 = phi <2 x double> [ %37, %39 ], [ %50, %44 ]
%61 = sub i32 0, %0
%62 = icmp eq i32 %41, %61
br i1 %62, label %127, label %102
63: ; preds = %24, %63
%64 = phi double* [ %98, %63 ], [ %20, %24 ]
%65 = phi double* [ %99, %63 ], [ %21, %24 ]
%66 = phi i32 [ %100, %63 ], [ 2, %24 ]
%67 = phi <2 x double> [ %97, %63 ], [ %19, %24 ]
%68 = load double, double* %65
%69 = getelementptr inbounds double, double* %65, i64 1
%70 = load double, double* %69
%71 = getelementptr inbounds double, double* %65, i64 2
%72 = load double, double* %71
%73 = getelementptr inbounds double, double* %65, i64 3
%74 = load double, double* %73
%75 = bitcast double* %64 to <2 x double>*
%76 = load <2 x double>, <2 x double>* %75
%77 = insertelement <2 x double> poison, double %68, 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> %67)
%80 = getelementptr inbounds double, double* %64, i64 4
%81 = bitcast double* %80 to <2 x double>*
%82 = load <2 x double>, <2 x double>* %81
%83 = insertelement <2 x double> poison, double %70, i64 0
%84 = shufflevector <2 x double> %83, <2 x double> poison, <2 x i32> zeroinitializer
%85 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %82, <2 x double> %84, <2 x double> %79)
%86 = getelementptr inbounds double, double* %64, i64 8
%87 = bitcast double* %86 to <2 x double>*
%88 = load <2 x double>, <2 x double>* %87
%89 = insertelement <2 x double> poison, double %72, 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> %85)
%92 = getelementptr inbounds double, double* %64, i64 12
%93 = bitcast double* %92 to <2 x double>*
%94 = load <2 x double>, <2 x double>* %93
%95 = insertelement <2 x double> poison, double %74, i64 0
%96 = shufflevector <2 x double> %95, <2 x double> poison, <2 x i32> zeroinitializer
%97 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %94, <2 x double> %96, <2 x double> %91)
%98 = getelementptr inbounds double, double* %64, i64 16
%99 = getelementptr inbounds double, double* %65, i64 4
%100 = add nuw nsw i32 %66, 4
%101 = icmp slt i32 %100, %22
br i1 %101, label %63, label %27
102: ; preds = %55, %102
%103 = phi double* [ %121, %102 ], [ %57, %55 ]
%104 = phi double* [ %122, %102 ], [ %58, %55 ]
%105 = phi i32 [ %123, %102 ], [ %59, %55 ]
%106 = phi <2 x double> [ %120, %102 ], [ %60, %55 ]
%107 = load double, double* %104
%108 = bitcast double* %103 to <2 x double>*
%109 = load <2 x double>, <2 x double>* %108
%110 = insertelement <2 x double> poison, double %107, i64 0
%111 = shufflevector <2 x double> %110, <2 x double> poison, <2 x i32> zeroinitializer
%112 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %109, <2 x double> %111, <2 x double> %106)
%113 = getelementptr inbounds double, double* %103, i64 4
%114 = getelementptr inbounds double, double* %104, i64 1
%115 = load double, double* %114
%116 = bitcast double* %113 to <2 x double>*
%117 = load <2 x double>, <2 x double>* %116
%118 = insertelement <2 x double> poison, double %115, i64 0
%119 = shufflevector <2 x double> %118, <2 x double> poison, <2 x i32> zeroinitializer
%120 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %117, <2 x double> %119, <2 x double> %112)
%121 = getelementptr inbounds double, double* %103, i64 8
%122 = getelementptr inbounds double, double* %104, i64 2
%123 = add nuw nsw i32 %105, 2
%124 = icmp eq i32 %123, %0
br i1 %124, label %125, label %102
125: ; preds = %102
%126 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %117, <2 x double> %119, <2 x double> %112)
br label %127
127: ; preds = %125, %55, %33
%128 = phi <2 x double> [ %37, %33 ], [ %56, %55 ], [ %126, %125 ]
switch i32 %4, label %136 [
i32 0, label %129
i32 1, label %131
]
129: ; preds = %127
%130 = bitcast double* %3 to <2 x double>*
store <2 x double> %128, <2 x double>* %130
br label %141
131: ; preds = %127
%132 = bitcast double* %3 to <2 x double>*
%133 = load <2 x double>, <2 x double>* %132
%134 = fadd <2 x double> %128, %133
%135 = bitcast double* %3 to <2 x double>*
store <2 x double> %134, <2 x double>* %135
br label %141
136: ; preds = %127
%137 = bitcast double* %3 to <2 x double>*
%138 = load <2 x double>, <2 x double>* %137
%139 = fsub <2 x double> %138, %128
%140 = bitcast double* %3 to <2 x double>*
store <2 x double> %139, <2 x double>* %140
br label %141
141: ; preds = %129, %136, %131, %5
ret void
}