void _inner_vec2_ddot(double *y0, int incY, const double *a0, const double *a1,
                      const double *x0, int incX, double alpha, int nC) {
  register int i;
  register double ytmp0, ytmp1;
  ytmp0 = 0.0;
  ytmp1 = 0.0;
  for (i = 0; i < nC - 3; i += 4) {
    ytmp0 += a0[0] * x0[0];
    ytmp1 += a1[0] * x0[0];
    ytmp0 += a0[1] * x0[incX];
    ytmp1 += a1[1] * x0[incX];
    ytmp0 += a0[2] * x0[2 * incX];
    ytmp1 += a1[2] * x0[2 * incX];
    ytmp0 += a0[3] * x0[3 * incX];
    ytmp1 += a1[3] * x0[3 * incX];
    x0 += incX << 2;
    a0 += 4;
    a1 += 4;
  }
  if (i == nC)
    goto update;
  if (i < nC - 1) {
    ytmp0 += a0[0] * x0[0];
    ytmp1 += a1[0] * x0[0];
    ytmp0 += a0[1] * x0[incX];
    ytmp1 += a1[1] * x0[incX];
    x0 += incX << 1;
    a0 += 2;
    a1 += 2;
    i += 2;
  }
  if (i < nC) {
    ytmp0 += a0[0] * x0[0];
    ytmp1 += a1[0] * x0[0];
    x0 += incX;
    i++;
  }
update:
  y0[0] += ytmp0 * alpha;
  y0[incY] += ytmp1 * alpha;
}


x86 assembly (clang, -O0):
<_inner_vec2_ddot>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
movsd  %xmm0,-0x38(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
mov    0x10(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    12cd <_inner_vec2_ddot+0x1cd>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm2
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x28(%rbp),%rax
imul   $0x3,-0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x28(%rbp),%rax
imul   $0x3,-0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x2c(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x3c(%rbp)
jmp    113a <_inner_vec2_ddot+0x3a>
mov    -0x3c(%rbp),%eax
cmp    0x10(%rbp),%eax
jne    12de <_inner_vec2_ddot+0x1de>
jmp    142f <_inner_vec2_ddot+0x32f>
mov    -0x3c(%rbp),%eax
mov    0x10(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    13bc <_inner_vec2_ddot+0x2bc>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm2
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x20(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    0x10(%rbp),%eax
jge    142a <_inner_vec2_ddot+0x32a>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm2
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x2c(%rbp),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    142f <_inner_vec2_ddot+0x32f>
movsd  -0x48(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
movsd  -0x50(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
pop    %rbp
ret

x86 assembly (clang, -O2):
<_inner_vec2_ddot>:
push   %rbp
push   %r15
push   %r14
push   %rbx
mov    0x28(%rsp),%r10d
cmp    $0x4,%r10d
jl     11d9 <_inner_vec2_ddot+0xd9>
lea    -0x3(%r10),%r11d
movslq %r9d,%rax
lea    (%rax,%rax,1),%ebx
movslq %ebx,%r14
lea    (%rax,%rax,2),%ebx
movslq %ebx,%r15
lea    0x0(,%rax,4),%ebx
movslq %ebx,%rbx
shl    $0x3,%rbx
xorpd  %xmm2,%xmm2
xor    %ebp,%ebp
nopl   0x0(%rax)
movsd  (%rdx),%xmm1
movsd  0x8(%rdx),%xmm3
movsd  0x10(%rdx),%xmm4
movhpd (%rcx),%xmm1
movsd  0x18(%rdx),%xmm5
movsd  (%r8),%xmm6
unpcklpd %xmm6,%xmm6
mulpd  %xmm1,%xmm6
addpd  %xmm2,%xmm6
movhpd 0x8(%rcx),%xmm3
movsd  (%r8,%rax,8),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm3,%xmm1
movhpd 0x10(%rcx),%xmm4
addpd  %xmm6,%xmm1
movsd  (%r8,%r14,8),%xmm3
unpcklpd %xmm3,%xmm3
mulpd  %xmm4,%xmm3
addpd  %xmm1,%xmm3
movhpd 0x18(%rcx),%xmm5
movsd  (%r8,%r15,8),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm5,%xmm1
movapd %xmm1,%xmm2
addpd  %xmm3,%xmm2
add    $0x20,%rdx
add    $0x20,%rcx
add    $0x4,%ebp
add    %rbx,%r8
cmp    %r11d,%ebp
jl     1140 <_inner_vec2_ddot+0x40>
addpd  %xmm3,%xmm1
mov    %r10d,%eax
and    $0xfffffffc,%eax
cmp    %r10d,%eax
jne    11e4 <_inner_vec2_ddot+0xe4>
jmp    1257 <_inner_vec2_ddot+0x157>
xorpd  %xmm1,%xmm1
xor    %eax,%eax
cmp    %r10d,%eax
je     1257 <_inner_vec2_ddot+0x157>
lea    -0x1(%r10),%ebp
cmp    %ebp,%eax
jge    1239 <_inner_vec2_ddot+0x139>
movsd  (%rdx),%xmm2
movsd  0x8(%rdx),%xmm3
movhpd (%rcx),%xmm2
movsd  (%r8),%xmm4
unpcklpd %xmm4,%xmm4
mulpd  %xmm2,%xmm4
addpd  %xmm1,%xmm4
movslq %r9d,%rbp
movhpd 0x8(%rcx),%xmm3
movsd  (%r8,%rbp,8),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm3,%xmm1
addpd  %xmm4,%xmm1
add    %r9d,%r9d
movslq %r9d,%rbp
lea    (%r8,%rbp,8),%r8
add    $0x10,%rdx
add    $0x10,%rcx
or     $0x2,%eax
cmp    %r10d,%eax
jge    1257 <_inner_vec2_ddot+0x157>
movsd  (%rdx),%xmm2
movhpd (%rcx),%xmm2
movsd  (%r8),%xmm3
unpcklpd %xmm3,%xmm3
mulpd  %xmm2,%xmm3
addpd  %xmm3,%xmm1
movapd %xmm1,%xmm2
mulsd  %xmm0,%xmm2
addsd  (%rdi),%xmm2
movsd  %xmm2,(%rdi)
movslq %esi,%rax
unpckhpd %xmm1,%xmm1
mulsd  %xmm0,%xmm1
addsd  (%rdi,%rax,8),%xmm1
movsd  %xmm1,(%rdi,%rax,8)
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

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