void c_fit_ols(double *x, double *y, int *n, double *beta) {
  double sumx = 0;
  double sumy = 0;
  double sumx2 = 0;
  double sumxy = 0;
  for (int i = 0; i < 10; i++) {
    sumx += x[i];
    sumy += y[i];
    sumx2 += x[i] * x[i];
    sumxy += x[i] * y[i];
  }
  double nd;
  nd = (double)*n;
  double xbar = sumx / nd;
  double ybar = sumy / nd;
  double x2bar = sumx2 / nd;
  double xybar = sumxy / nd;
  beta[1] = (xybar - xbar * ybar) / (x2bar - xbar * xbar);
  beta[0] = ybar - beta[1] * xbar;
}


x86 assembly (clang, -O0):
<c_fit_ols>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
cmpl   $0xa,-0x44(%rbp)
jge    11d9 <c_fit_ols+0xd9>
mov    -0x8(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x38(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    113b <c_fit_ols+0x3b>
mov    -0x18(%rbp),%rax
cvtsi2sdl (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x28(%rbp),%xmm0
divsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x30(%rbp),%xmm0
divsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
divsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
divsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm1
movsd  -0x58(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
movsd  -0x58(%rbp),%xmm3
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x60(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<c_fit_ols>:
movsd  (%rdi),%xmm3
movsd  0x8(%rdi),%xmm2
xorpd  %xmm4,%xmm4
movapd %xmm3,%xmm1
addsd  %xmm4,%xmm1
movsd  (%rsi),%xmm0
movsd  0x8(%rsi),%xmm5
movapd %xmm3,%xmm6
mulsd  %xmm3,%xmm6
addsd  %xmm4,%xmm6
mulsd  %xmm0,%xmm3
addsd  %xmm4,%xmm0
addsd  %xmm4,%xmm3
addsd  %xmm2,%xmm1
addsd  %xmm5,%xmm0
movapd %xmm2,%xmm4
mulsd  %xmm2,%xmm4
addsd  %xmm6,%xmm4
mulsd  %xmm5,%xmm2
addsd  %xmm3,%xmm2
movsd  0x10(%rdi),%xmm3
addsd  %xmm3,%xmm1
movsd  0x10(%rsi),%xmm5
addsd  %xmm5,%xmm0
movapd %xmm3,%xmm6
mulsd  %xmm3,%xmm6
addsd  %xmm4,%xmm6
mulsd  %xmm5,%xmm3
addsd  %xmm2,%xmm3
movsd  0x18(%rdi),%xmm2
addsd  %xmm2,%xmm1
movsd  0x18(%rsi),%xmm4
addsd  %xmm4,%xmm0
movapd %xmm2,%xmm5
mulsd  %xmm2,%xmm5
addsd  %xmm6,%xmm5
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
movsd  0x20(%rdi),%xmm3
addsd  %xmm3,%xmm1
movsd  0x20(%rsi),%xmm4
addsd  %xmm4,%xmm0
movapd %xmm3,%xmm6
mulsd  %xmm3,%xmm6
addsd  %xmm5,%xmm6
mulsd  %xmm4,%xmm3
addsd  %xmm2,%xmm3
movsd  0x28(%rdi),%xmm2
addsd  %xmm2,%xmm1
movsd  0x28(%rsi),%xmm4
addsd  %xmm4,%xmm0
movapd %xmm2,%xmm5
mulsd  %xmm2,%xmm5
addsd  %xmm6,%xmm5
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
movsd  0x30(%rdi),%xmm3
addsd  %xmm3,%xmm1
movsd  0x30(%rsi),%xmm4
addsd  %xmm4,%xmm0
movapd %xmm3,%xmm6
mulsd  %xmm3,%xmm6
addsd  %xmm5,%xmm6
mulsd  %xmm4,%xmm3
addsd  %xmm2,%xmm3
movsd  0x38(%rdi),%xmm2
addsd  %xmm2,%xmm1
movsd  0x38(%rsi),%xmm4
addsd  %xmm4,%xmm0
movapd %xmm2,%xmm5
mulsd  %xmm2,%xmm5
addsd  %xmm6,%xmm5
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
movsd  0x40(%rdi),%xmm3
addsd  %xmm3,%xmm1
movsd  0x40(%rsi),%xmm4
addsd  %xmm4,%xmm0
movapd %xmm3,%xmm6
mulsd  %xmm3,%xmm6
addsd  %xmm5,%xmm6
mulsd  %xmm4,%xmm3
addsd  %xmm2,%xmm3
movsd  0x48(%rdi),%xmm2
addsd  %xmm2,%xmm1
movsd  0x48(%rsi),%xmm4
addsd  %xmm4,%xmm0
movapd %xmm2,%xmm5
mulsd  %xmm2,%xmm5
addsd  %xmm6,%xmm5
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
xorps  %xmm3,%xmm3
cvtsi2sdl (%rdx),%xmm3
divsd  %xmm3,%xmm1
divsd  %xmm3,%xmm0
divsd  %xmm3,%xmm5
divsd  %xmm3,%xmm2
movapd %xmm1,%xmm3
mulsd  %xmm0,%xmm3
subsd  %xmm3,%xmm2
movapd %xmm1,%xmm3
mulsd  %xmm1,%xmm3
subsd  %xmm3,%xmm5
divsd  %xmm5,%xmm2
movsd  %xmm2,0x8(%rcx)
mulsd  %xmm1,%xmm2
subsd  %xmm2,%xmm0
movsd  %xmm0,(%rcx)
ret

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

LLVM IR (-O2):
define void @c_fit_ols(double* nocapture %0, double* nocapture %1, i32* nocapture %2, double* nocapture writeonly %3) {
%5 = load double, double* %0
%6 = fadd double %5, 0.000000e+00
%7 = load double, double* %1
%8 = fadd double %7, 0.000000e+00
%9 = tail call double @llvm.fmuladd.f64(double %5, double %5, double 0.000000e+00)
%10 = tail call double @llvm.fmuladd.f64(double %5, double %7, double 0.000000e+00)
%11 = getelementptr inbounds double, double* %0, i64 1
%12 = load double, double* %11
%13 = fadd double %6, %12
%14 = getelementptr inbounds double, double* %1, i64 1
%15 = load double, double* %14
%16 = fadd double %8, %15
%17 = tail call double @llvm.fmuladd.f64(double %12, double %12, double %9)
%18 = tail call double @llvm.fmuladd.f64(double %12, double %15, double %10)
%19 = getelementptr inbounds double, double* %0, i64 2
%20 = load double, double* %19
%21 = fadd double %13, %20
%22 = getelementptr inbounds double, double* %1, i64 2
%23 = load double, double* %22
%24 = fadd double %16, %23
%25 = tail call double @llvm.fmuladd.f64(double %20, double %20, double %17)
%26 = tail call double @llvm.fmuladd.f64(double %20, double %23, double %18)
%27 = getelementptr inbounds double, double* %0, i64 3
%28 = load double, double* %27
%29 = fadd double %21, %28
%30 = getelementptr inbounds double, double* %1, i64 3
%31 = load double, double* %30
%32 = fadd double %24, %31
%33 = tail call double @llvm.fmuladd.f64(double %28, double %28, double %25)
%34 = tail call double @llvm.fmuladd.f64(double %28, double %31, double %26)
%35 = getelementptr inbounds double, double* %0, i64 4
%36 = load double, double* %35
%37 = fadd double %29, %36
%38 = getelementptr inbounds double, double* %1, i64 4
%39 = load double, double* %38
%40 = fadd double %32, %39
%41 = tail call double @llvm.fmuladd.f64(double %36, double %36, double %33)
%42 = tail call double @llvm.fmuladd.f64(double %36, double %39, double %34)
%43 = getelementptr inbounds double, double* %0, i64 5
%44 = load double, double* %43
%45 = fadd double %37, %44
%46 = getelementptr inbounds double, double* %1, i64 5
%47 = load double, double* %46
%48 = fadd double %40, %47
%49 = tail call double @llvm.fmuladd.f64(double %44, double %44, double %41)
%50 = tail call double @llvm.fmuladd.f64(double %44, double %47, double %42)
%51 = getelementptr inbounds double, double* %0, i64 6
%52 = load double, double* %51
%53 = fadd double %45, %52
%54 = getelementptr inbounds double, double* %1, i64 6
%55 = load double, double* %54
%56 = fadd double %48, %55
%57 = tail call double @llvm.fmuladd.f64(double %52, double %52, double %49)
%58 = tail call double @llvm.fmuladd.f64(double %52, double %55, double %50)
%59 = getelementptr inbounds double, double* %0, i64 7
%60 = load double, double* %59
%61 = fadd double %53, %60
%62 = getelementptr inbounds double, double* %1, i64 7
%63 = load double, double* %62
%64 = fadd double %56, %63
%65 = tail call double @llvm.fmuladd.f64(double %60, double %60, double %57)
%66 = tail call double @llvm.fmuladd.f64(double %60, double %63, double %58)
%67 = getelementptr inbounds double, double* %0, i64 8
%68 = load double, double* %67
%69 = fadd double %61, %68
%70 = getelementptr inbounds double, double* %1, i64 8
%71 = load double, double* %70
%72 = fadd double %64, %71
%73 = tail call double @llvm.fmuladd.f64(double %68, double %68, double %65)
%74 = tail call double @llvm.fmuladd.f64(double %68, double %71, double %66)
%75 = getelementptr inbounds double, double* %0, i64 9
%76 = load double, double* %75
%77 = fadd double %69, %76
%78 = getelementptr inbounds double, double* %1, i64 9
%79 = load double, double* %78
%80 = fadd double %72, %79
%81 = tail call double @llvm.fmuladd.f64(double %76, double %76, double %73)
%82 = tail call double @llvm.fmuladd.f64(double %76, double %79, double %74)
%83 = load i32, i32* %2
%84 = sitofp i32 %83 to double
%85 = fdiv double %77, %84
%86 = fdiv double %80, %84
%87 = fdiv double %81, %84
%88 = fdiv double %82, %84
%89 = fneg double %85
%90 = tail call double @llvm.fmuladd.f64(double %89, double %86, double %88)
%91 = tail call double @llvm.fmuladd.f64(double %89, double %85, double %87)
%92 = fdiv double %90, %91
%93 = getelementptr inbounds double, double* %3, i64 1
store double %92, double* %93
%94 = fneg double %92
%95 = tail call double @llvm.fmuladd.f64(double %94, double %85, double %86)
store double %95, double* %3
ret void
}