#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double pow(double const, double);
void lsqe(const double *x, const double *y, int n, double *b1, double *b0) {
  double sumx, sumy, sumx2, sumxy;
  int i;
  sumx = 0.0;
  sumy = 0.0;
  sumx2 = 0.0;
  sumxy = 0.0;
  for (i = 0; i < n; i++) {
    sumx = sumx + x[i];
    sumy = sumy + y[i];
    sumx2 = sumx2 + pow(x[i], 2.0);
    sumxy = sumxy + (x[i] * y[i]);
  }
  *b1 = (sumxy - ((sumx * sumy) / (double)n)) /
        (sumx2 - (pow(sumx, 2.0) / (double)n));
  *b0 = (sumy - ((*b1) * sumx)) / (double)n;
  return;
}


x86 assembly (clang, -O0):
<lsqe>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11fb <lsqe+0xeb>
movsd  -0x30(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x4c(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x38(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  0xe55(%rip),%xmm1
call   1030 <pow@plt>
movaps %xmm0,%xmm1
movsd  -0x58(%rbp),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x48(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1152 <lsqe+0x42>
movsd  -0x48(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
cvtsi2sdl -0x14(%rbp),%xmm2
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  0xdcd(%rip),%xmm1
call   1030 <pow@plt>
movsd  -0x68(%rbp),%xmm1
movaps %xmm0,%xmm2
movsd  -0x60(%rbp),%xmm0
cvtsi2sdl -0x14(%rbp),%xmm3
divsd  %xmm3,%xmm2
subsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x38(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x30(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<lsqe>:
test   %edx,%edx
jle    1123 <lsqe+0x23>
mov    %edx,%r9d
cmp    $0x1,%edx
jne    1138 <lsqe+0x38>
xorpd  %xmm1,%xmm1
xor    %eax,%eax
xorpd  %xmm3,%xmm3
xorpd  %xmm0,%xmm0
xorpd  %xmm2,%xmm2
jmp    11bd <lsqe+0xbd>
xorpd  %xmm2,%xmm2
xorpd  %xmm0,%xmm0
xorpd  %xmm3,%xmm3
xorpd  %xmm1,%xmm1
jmp    11e9 <lsqe+0xe9>
mov    %r9d,%r10d
and    $0xfffffffe,%r10d
xorpd  %xmm8,%xmm8
xor    %eax,%eax
xorpd  %xmm3,%xmm3
xorpd  %xmm0,%xmm0
xorpd  %xmm2,%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  (%rdi,%rax,8),%xmm5
movsd  0x8(%rdi,%rax,8),%xmm1
addsd  %xmm5,%xmm2
movsd  (%rsi,%rax,8),%xmm6
movsd  0x8(%rsi,%rax,8),%xmm7
addsd  %xmm6,%xmm0
movapd %xmm5,%xmm4
mulsd  %xmm5,%xmm4
addsd  %xmm3,%xmm4
mulsd  %xmm6,%xmm5
addsd  %xmm8,%xmm5
addsd  %xmm1,%xmm2
addsd  %xmm7,%xmm0
movapd %xmm1,%xmm3
mulsd  %xmm1,%xmm3
addsd  %xmm4,%xmm3
mulsd  %xmm7,%xmm1
addsd  %xmm5,%xmm1
add    $0x2,%rax
movapd %xmm1,%xmm8
cmp    %rax,%r10
jne    1160 <lsqe+0x60>
test   $0x1,%r9b
je     11e9 <lsqe+0xe9>
movsd  (%rdi,%rax,8),%xmm4
addsd  %xmm4,%xmm2
movsd  (%rsi,%rax,8),%xmm5
addsd  %xmm5,%xmm0
movapd %xmm4,%xmm6
mulsd  %xmm4,%xmm6
addsd  %xmm6,%xmm3
mulsd  %xmm5,%xmm4
addsd  %xmm4,%xmm1
movapd %xmm2,%xmm4
xorps  %xmm5,%xmm5
cvtsi2sd %edx,%xmm5
mulsd  %xmm0,%xmm4
divsd  %xmm5,%xmm4
subsd  %xmm4,%xmm1
movapd %xmm2,%xmm4
mulsd  %xmm2,%xmm4
divsd  %xmm5,%xmm4
subsd  %xmm4,%xmm3
divsd  %xmm3,%xmm1
movsd  %xmm1,(%rcx)
mulsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
divsd  %xmm5,%xmm0
movsd  %xmm0,(%r8)
ret

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

LLVM IR (-O2):
define void @lsqe(double* nocapture %0, double* nocapture %1, i32 %2, double* nocapture writeonly %3, double* nocapture writeonly %4) {
%6 = icmp sgt i32 %2, 0
br i1 %6, label %7, label %63
7: ; preds = %5
%8 = zext i32 %2 to i64
%9 = and i64 %8, 1
%10 = icmp eq i32 %2, 1
br i1 %10, label %42, label %11
11: ; preds = %7
%12 = and i64 %8, 4294967294
br label %13
13: ; preds = %13, %11
%14 = phi i64 [ 0, %11 ], [ %39, %13 ]
%15 = phi double [ 0.000000e+00, %11 ], [ %38, %13 ]
%16 = phi double [ 0.000000e+00, %11 ], [ %37, %13 ]
%17 = phi double [ 0.000000e+00, %11 ], [ %35, %13 ]
%18 = phi double [ 0.000000e+00, %11 ], [ %32, %13 ]
%19 = phi i64 [ 0, %11 ], [ %40, %13 ]
%20 = getelementptr inbounds double, double* %0, i64 %14
%21 = load double, double* %20
%22 = fadd double %18, %21
%23 = getelementptr inbounds double, double* %1, i64 %14
%24 = load double, double* %23
%25 = fadd double %17, %24
%26 = fmul double %21, %21
%27 = fadd double %16, %26
%28 = tail call double @llvm.fmuladd.f64(double %21, double %24, double %15)
%29 = or i64 %14, 1
%30 = getelementptr inbounds double, double* %0, i64 %29
%31 = load double, double* %30
%32 = fadd double %22, %31
%33 = getelementptr inbounds double, double* %1, i64 %29
%34 = load double, double* %33
%35 = fadd double %25, %34
%36 = fmul double %31, %31
%37 = fadd double %27, %36
%38 = tail call double @llvm.fmuladd.f64(double %31, double %34, double %28)
%39 = add nuw nsw i64 %14, 2
%40 = add i64 %19, 2
%41 = icmp eq i64 %40, %12
br i1 %41, label %42, label %13
42: ; preds = %13, %7
%43 = phi double [ undef, %7 ], [ %32, %13 ]
%44 = phi double [ undef, %7 ], [ %35, %13 ]
%45 = phi double [ undef, %7 ], [ %37, %13 ]
%46 = phi double [ undef, %7 ], [ %38, %13 ]
%47 = phi i64 [ 0, %7 ], [ %39, %13 ]
%48 = phi double [ 0.000000e+00, %7 ], [ %38, %13 ]
%49 = phi double [ 0.000000e+00, %7 ], [ %37, %13 ]
%50 = phi double [ 0.000000e+00, %7 ], [ %35, %13 ]
%51 = phi double [ 0.000000e+00, %7 ], [ %32, %13 ]
%52 = icmp eq i64 %9, 0
br i1 %52, label %63, label %53
53: ; preds = %42
%54 = getelementptr inbounds double, double* %0, i64 %47
%55 = load double, double* %54
%56 = fadd double %51, %55
%57 = getelementptr inbounds double, double* %1, i64 %47
%58 = load double, double* %57
%59 = fadd double %50, %58
%60 = fmul double %55, %55
%61 = fadd double %49, %60
%62 = tail call double @llvm.fmuladd.f64(double %55, double %58, double %48)
br label %63
63: ; preds = %53, %42, %5
%64 = phi double [ 0.000000e+00, %5 ], [ %43, %42 ], [ %56, %53 ]
%65 = phi double [ 0.000000e+00, %5 ], [ %44, %42 ], [ %59, %53 ]
%66 = phi double [ 0.000000e+00, %5 ], [ %45, %42 ], [ %61, %53 ]
%67 = phi double [ 0.000000e+00, %5 ], [ %46, %42 ], [ %62, %53 ]
%68 = fmul double %64, %65
%69 = sitofp i32 %2 to double
%70 = fdiv double %68, %69
%71 = fsub double %67, %70
%72 = fmul double %64, %64
%73 = fdiv double %72, %69
%74 = fsub double %66, %73
%75 = fdiv double %71, %74
store double %75, double* %3
%76 = fneg double %75
%77 = tail call double @llvm.fmuladd.f64(double %76, double %64, double %65)
%78 = fdiv double %77, %69
store double %78, double* %4
ret void
}