void polycoeffs(int n, double *x, double *y, double *c) {
  int j, k;
  double w, p;
  c[0] = y[0];
  for (k = 1; k <= n; k++) {
    w = 1.0;
    p = 0.0;
    for (j = 0; j < k; j++) {
      p = p + (c[j] * w);
      w = w * (x[k] - x[j]);
    }
    c[k] = (y[k] - p) / w;
  }
}


x86 assembly (clang, -O0):
<polycoeffs>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x4(%rbp),%eax
jg     11ea <polycoeffs+0xea>
movsd  0xec2(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    11b8 <polycoeffs+0xb8>
movsd  -0x38(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x30(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x30(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1152 <polycoeffs+0x52>
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x38(%rbp),%xmm0
divsd  -0x30(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    112a <polycoeffs+0x2a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<polycoeffs>:
movsd  (%rdx),%xmm0
movsd  %xmm0,(%rcx)
test   %edi,%edi
jle    11ff <polycoeffs+0xff>
add    $0x1,%edi
mov    $0x1,%r9d
xor    %r8d,%r8d
movsd  0xedc(%rip),%xmm0
jmp    1155 <polycoeffs+0x55>
cs nopw 0x0(%rax,%rax,1)
movsd  (%rdx,%r9,8),%xmm1
subsd  %xmm2,%xmm1
divsd  %xmm3,%xmm1
movsd  %xmm1,(%rcx,%r9,8)
add    $0x1,%r9
add    $0x1,%r8
cmp    %rdi,%r9
je     11ff <polycoeffs+0xff>
movsd  (%rsi,%r9,8),%xmm1
test   %r8,%r8
je     11d0 <polycoeffs+0xd0>
mov    %r9,%r10
and    $0xfffffffffffffffe,%r10
xorpd  %xmm2,%xmm2
xor    %eax,%eax
movapd %xmm0,%xmm3
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  (%rcx,%rax,8),%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm2,%xmm4
movapd %xmm1,%xmm5
subsd  (%rsi,%rax,8),%xmm5
mulsd  %xmm3,%xmm5
movsd  0x8(%rcx,%rax,8),%xmm2
mulsd  %xmm5,%xmm2
movapd %xmm1,%xmm3
subsd  0x8(%rsi,%rax,8),%xmm3
addsd  %xmm4,%xmm2
mulsd  %xmm5,%xmm3
add    $0x2,%rax
cmp    %rax,%r10
jne    1180 <polycoeffs+0x80>
test   $0x1,%r9b
je     1130 <polycoeffs+0x30>
jmp    11e4 <polycoeffs+0xe4>
nopl   0x0(%rax,%rax,1)
xorpd  %xmm2,%xmm2
xor    %eax,%eax
movapd %xmm0,%xmm3
test   $0x1,%r9b
je     1130 <polycoeffs+0x30>
movsd  (%rcx,%rax,8),%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm4,%xmm2
subsd  (%rsi,%rax,8),%xmm1
mulsd  %xmm1,%xmm3
jmp    1130 <polycoeffs+0x30>
ret

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

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