void matrix_mean_cov_3d(const double *X, int n, double mean[3], double cov[9]) {
  mean[0] = mean[1] = mean[2] = 0;
  for (int i = 0; i < n; i++) {
    mean[0] += X[i * 3 + 0];
    mean[1] += X[i * 3 + 1];
    mean[2] += X[i * 3 + 2];
  }
  mean[0] /= n;
  mean[1] /= n;
  mean[2] /= n;
  cov[0] = cov[1] = cov[2] = cov[4] = cov[5] = cov[8] = 0;
  for (int i = 0; i < n; i++) {
    double da = X[i * 3 + 0] - mean[0];
    double db = X[i * 3 + 1] - mean[1];
    double dc = X[i * 3 + 2] - mean[2];
    cov[0] += da * da;
    cov[1] += da * db;
    cov[2] += da * dc;
    cov[4] += db * db;
    cov[5] += db * dc;
    cov[8] += dc * dc;
  }
  cov[0] /= n;
  cov[1] /= n;
  cov[2] /= n;
  cov[4] /= n;
  cov[5] /= n;
  cov[8] /= n;
  cov[3] = cov[1];
  cov[6] = cov[2];
  cov[7] = cov[5];
}


x86 assembly (clang, -O0):
<matrix_mean_cov_3d>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11b8 <matrix_mean_cov_3d+0xb8>
mov    -0x8(%rbp),%rax
imul   $0x3,-0x24(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
imul   $0x3,-0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
addsd  0x8(%rax),%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
imul   $0x3,-0x24(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
addsd  0x10(%rax),%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    113d <matrix_mean_cov_3d+0x3d>
cvtsi2sdl -0xc(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
cvtsi2sdl -0xc(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
cvtsi2sdl -0xc(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x40(%rax)
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x28(%rax)
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x20(%rax)
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1383 <matrix_mean_cov_3d+0x283>
mov    -0x8(%rbp),%rax
imul   $0x3,-0x28(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
subsd  (%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
imul   $0x3,-0x28(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
imul   $0x3,-0x28(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
movsd  -0x30(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rax)
movsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
mov    -0x20(%rbp),%rax
movsd  0x20(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x20(%rax)
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
mov    -0x20(%rbp),%rax
movsd  0x28(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x28(%rax)
movsd  -0x40(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
mov    -0x20(%rbp),%rax
movsd  0x40(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x40(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1249 <matrix_mean_cov_3d+0x149>
cvtsi2sdl -0xc(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
cvtsi2sdl -0xc(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
cvtsi2sdl -0xc(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rax)
cvtsi2sdl -0xc(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movsd  0x20(%rax),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,0x20(%rax)
cvtsi2sdl -0xc(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movsd  0x28(%rax),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,0x28(%rax)
cvtsi2sdl -0xc(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movsd  0x40(%rax),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,0x40(%rax)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x30(%rax)
mov    -0x20(%rbp),%rax
movsd  0x28(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x38(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<matrix_mean_cov_3d>:
xorpd  %xmm0,%xmm0
movupd %xmm0,(%rdx)
movq   $0x0,0x10(%rdx)
xorpd  %xmm1,%xmm1
mov    %esi,%r8d
xorpd  %xmm4,%xmm4
xorpd  %xmm5,%xmm5
test   %esi,%esi
jle    116c <matrix_mean_cov_3d+0x6c>
lea    0x0(,%r8,8),%rax
lea    (%rax,%rax,2),%r9
xorpd  %xmm4,%xmm4
xor    %eax,%eax
xorpd  %xmm2,%xmm2
xorpd  %xmm5,%xmm5
nopl   (%rax)
addsd  (%rdi,%rax,1),%xmm5
movsd  %xmm5,(%rdx)
addsd  0x8(%rdi,%rax,1),%xmm2
movsd  %xmm2,0x8(%rdx)
addsd  0x10(%rdi,%rax,1),%xmm4
movsd  %xmm4,0x10(%rdx)
add    $0x18,%rax
cmp    %rax,%r9
jne    1140 <matrix_mean_cov_3d+0x40>
unpcklpd %xmm2,%xmm5
cvtsi2sd %esi,%xmm8
movapd %xmm8,%xmm3
unpcklpd %xmm8,%xmm3
divpd  %xmm3,%xmm5
movupd %xmm5,(%rdx)
divsd  %xmm8,%xmm4
movsd  %xmm4,0x10(%rdx)
movq   $0x0,0x40(%rcx)
movupd %xmm0,(%rcx)
movq   $0x0,0x10(%rcx)
movupd %xmm0,0x20(%rcx)
xorpd  %xmm5,%xmm5
xorpd  %xmm4,%xmm4
test   %esi,%esi
jle    1245 <matrix_mean_cov_3d+0x145>
shl    $0x3,%r8
lea    (%r8,%r8,2),%rax
xorpd  %xmm0,%xmm0
xor    %esi,%esi
xorpd  %xmm4,%xmm4
xorpd  %xmm1,%xmm1
nopl   0x0(%rax)
movupd (%rdi,%rsi,1),%xmm5
movupd (%rdx),%xmm6
subpd  %xmm6,%xmm5
movsd  0x10(%rdi,%rsi,1),%xmm6
subsd  0x10(%rdx),%xmm6
movapd %xmm5,%xmm7
unpcklpd %xmm5,%xmm7
mulpd  %xmm5,%xmm7
addpd  %xmm7,%xmm0
movupd %xmm0,(%rcx)
movapd %xmm6,%xmm7
unpcklpd %xmm5,%xmm7
movapd %xmm5,%xmm2
shufpd $0x1,%xmm6,%xmm5
unpcklpd %xmm6,%xmm6
mulpd  %xmm7,%xmm6
addpd  %xmm6,%xmm1
movhpd %xmm1,0x10(%rcx)
unpckhpd %xmm2,%xmm2
mulpd  %xmm2,%xmm5
addpd  %xmm5,%xmm4
movupd %xmm4,0x20(%rcx)
movlpd %xmm1,0x40(%rcx)
add    $0x18,%rsi
cmp    %rsi,%rax
jne    11d0 <matrix_mean_cov_3d+0xd0>
movapd %xmm1,%xmm5
unpckhpd %xmm1,%xmm5
divpd  %xmm3,%xmm0
movupd %xmm0,(%rcx)
divsd  %xmm8,%xmm5
movsd  %xmm5,0x10(%rcx)
divpd  %xmm3,%xmm4
movupd %xmm4,0x20(%rcx)
divsd  %xmm8,%xmm1
movsd  %xmm1,0x40(%rcx)
movhpd %xmm0,0x18(%rcx)
movsd  %xmm5,0x30(%rcx)
movhpd %xmm4,0x38(%rcx)
ret

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

LLVM IR (-O2):
define void @matrix_mean_cov_3d(double* nocapture %0, i32 %1, double* nocapture %2, double* nocapture %3) {
%5 = getelementptr inbounds double, double* %2, i64 2
%6 = getelementptr inbounds double, double* %2, i64 1
%7 = icmp sgt i32 %1, 0
%8 = bitcast double* %2 to i8*
br i1 %7, label %9, label %14
9: ; preds = %4
%10 = zext i32 %1 to i64
br label %33
11: ; preds = %33
%12 = insertelement <2 x double> poison, double %41, i64 0
%13 = insertelement <2 x double> %12, double %45, i64 1
br label %14
14: ; preds = %11, %4
%15 = phi double [ 0.000000e+00, %4 ], [ %49, %11 ]
%16 = phi <2 x double> [ zeroinitializer, %4 ], [ %13, %11 ]
%17 = sitofp i32 %1 to double
%18 = insertelement <2 x double> poison, double %17, i64 0
%19 = shufflevector <2 x double> %18, <2 x double> poison, <2 x i32> zeroinitializer
%20 = fdiv <2 x double> %16, %19
%21 = bitcast double* %2 to <2 x double>*
store <2 x double> %20, <2 x double>* %21
%22 = fdiv double %15, %17
store double %22, double* %5
%23 = getelementptr inbounds double, double* %3, i64 8
store double 0.000000e+00, double* %23
%24 = getelementptr inbounds double, double* %3, i64 4
%25 = getelementptr inbounds double, double* %3, i64 2
%26 = bitcast double* %3 to i8*
%27 = bitcast double* %24 to i8*
br i1 %7, label %28, label %54
28: ; preds = %14
%29 = zext i32 %1 to i64
%30 = bitcast double* %2 to <2 x double>*
%31 = bitcast double* %3 to <2 x double>*
%32 = bitcast double* %24 to <2 x double>*
br label %70
33: ; preds = %9, %33
%34 = phi double [ 0.000000e+00, %9 ], [ %49, %33 ]
%35 = phi double [ 0.000000e+00, %9 ], [ %45, %33 ]
%36 = phi double [ 0.000000e+00, %9 ], [ %41, %33 ]
%37 = phi i64 [ 0, %9 ], [ %50, %33 ]
%38 = mul nuw nsw i64 %37, 3
%39 = getelementptr inbounds double, double* %0, i64 %38
%40 = load double, double* %39
%41 = fadd double %40, %36
store double %41, double* %2
%42 = add nuw nsw i64 %38, 1
%43 = getelementptr inbounds double, double* %0, i64 %42
%44 = load double, double* %43
%45 = fadd double %44, %35
store double %45, double* %6
%46 = add nuw nsw i64 %38, 2
%47 = getelementptr inbounds double, double* %0, i64 %46
%48 = load double, double* %47
%49 = fadd double %48, %34
store double %49, double* %5
%50 = add nuw nsw i64 %37, 1
%51 = icmp eq i64 %50, %10
br i1 %51, label %11, label %33
52: ; preds = %70
%53 = extractelement <2 x double> %92, i64 0
br label %54
54: ; preds = %52, %14
%55 = phi double [ 0.000000e+00, %14 ], [ %53, %52 ]
%56 = phi double [ 0.000000e+00, %14 ], [ %93, %52 ]
%57 = phi <2 x double> [ zeroinitializer, %14 ], [ %88, %52 ]
%58 = phi <2 x double> [ zeroinitializer, %14 ], [ %98, %52 ]
%59 = fdiv <2 x double> %57, %19
%60 = bitcast double* %3 to <2 x double>*
store <2 x double> %59, <2 x double>* %60
%61 = fdiv double %56, %17
store double %61, double* %25
%62 = fdiv <2 x double> %58, %19
%63 = bitcast double* %24 to <2 x double>*
store <2 x double> %62, <2 x double>* %63
%64 = fdiv double %55, %17
store double %64, double* %23
%65 = getelementptr inbounds double, double* %3, i64 3
%66 = extractelement <2 x double> %59, i64 1
store double %66, double* %65
%67 = getelementptr inbounds double, double* %3, i64 6
store double %61, double* %67
%68 = getelementptr inbounds double, double* %3, i64 7
%69 = extractelement <2 x double> %62, i64 1
store double %69, double* %68
ret void
70: ; preds = %28, %70
%71 = phi i64 [ 0, %28 ], [ %100, %70 ]
%72 = phi <2 x double> [ zeroinitializer, %28 ], [ %87, %70 ]
%73 = phi <2 x double> [ zeroinitializer, %28 ], [ %97, %70 ]
%74 = phi <2 x double> [ zeroinitializer, %28 ], [ %92, %70 ]
%75 = mul nuw nsw i64 %71, 3
%76 = getelementptr inbounds double, double* %0, i64 %75
%77 = bitcast double* %76 to <2 x double>*
%78 = load <2 x double>, <2 x double>* %77
%79 = load <2 x double>, <2 x double>* %30
%80 = fsub <2 x double> %78, %79
%81 = add nuw nsw i64 %75, 2
%82 = getelementptr inbounds double, double* %0, i64 %81
%83 = load double, double* %82
%84 = load double, double* %5
%85 = fsub double %83, %84
%86 = shufflevector <2 x double> %80, <2 x double> undef, <2 x i32> zeroinitializer
%87 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %86, <2 x double> %80, <2 x double> %72)
%88 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %86, <2 x double> %80, <2 x double> %72)
store <2 x double> %88, <2 x double>* %31
%89 = insertelement <2 x double> poison, double %85, i64 0
%90 = shufflevector <2 x double> %89, <2 x double> %80, <2 x i32> <i32 0, i32 2>
%91 = shufflevector <2 x double> %89, <2 x double> poison, <2 x i32> zeroinitializer
%92 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %90, <2 x double> %91, <2 x double> %74)
%93 = extractelement <2 x double> %92, i64 1
store double %93, double* %25
%94 = shufflevector <2 x double> %80, <2 x double> undef, <2 x i32> <i32 1, i32 undef>
%95 = shufflevector <2 x double> %80, <2 x double> poison, <2 x i32> <i32 1, i32 1>
%96 = insertelement <2 x double> %94, double %85, i64 1
%97 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %95, <2 x double> %96, <2 x double> %73)
%98 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %95, <2 x double> %96, <2 x double> %73)
store <2 x double> %98, <2 x double>* %32
%99 = extractelement <2 x double> %92, i64 0
store double %99, double* %23
%100 = add nuw nsw i64 %71, 1
%101 = icmp eq i64 %100, %29
br i1 %101, label %52, label %70
}