float px(float x, int n) {
  float val;
  if (n == 0) {
    return 0;
  } else if (n == 1) {
    return x;
  } else {
    val = (2 * (n - 1) * x - px(x, n - 1) - (n - 1) * px(x, n - 2)) / n;
    return val;
  }
}


x86 assembly (clang, -O0):
<px>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movss  %xmm0,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
cmpl   $0x0,-0xc(%rbp)
jne    1137 <px+0x27>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11fc <px+0xec>
cmpl   $0x1,-0xc(%rbp)
jne    1150 <px+0x40>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11fc <px+0xec>
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
shl    $0x1,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x8(%rbp),%xmm0
mov    -0xc(%rbp),%edi
sub    $0x1,%edi
call   1030 <px@plt>
movss  -0x20(%rbp),%xmm2
movaps %xmm0,%xmm1
movss  -0x1c(%rbp),%xmm0
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x8(%rbp),%xmm0
mov    -0xc(%rbp),%edi
sub    $0x2,%edi
call   1030 <px@plt>
movss  -0x18(%rbp),%xmm1
movaps %xmm0,%xmm2
movss  -0x14(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtsi2ssl -0xc(%rbp),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<px>:
push   %rbp
push   %rbx
sub    $0x18,%rsp
test   %edi,%edi
je     1193 <px+0x83>
mov    %edi,%ebx
cmp    $0x1,%edi
je     1196 <px+0x86>
lea    -0x1(%rbx),%ebp
lea    (%rbx,%rbx,1),%eax
add    $0xfffffffe,%eax
cvtsi2ss %eax,%xmm1
movss  %xmm1,0xc(%rsp)
movss  %xmm0,0x10(%rsp)
mov    %ebp,%edi
call   1030 <px@plt>
movss  0xc(%rsp),%xmm1
movss  0x10(%rsp),%xmm2
mulss  %xmm2,%xmm1
subss  %xmm0,%xmm1
movss  %xmm1,0xc(%rsp)
xorps  %xmm0,%xmm0
cvtsi2ss %ebp,%xmm0
movss  %xmm0,0x14(%rsp)
lea    -0x2(%rbx),%edi
movaps %xmm2,%xmm0
call   1030 <px@plt>
mulss  0x14(%rsp),%xmm0
movss  0xc(%rsp),%xmm1
subss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsi2ss %ebx,%xmm0
divss  %xmm0,%xmm1
movaps %xmm1,%xmm0
jmp    1196 <px+0x86>
xorps  %xmm0,%xmm0
add    $0x18,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define float @px(float %0, i32 %1) {
%3 = alloca float
%4 = alloca float
%5 = alloca i32
%6 = alloca float
store float %0, float* %4
store i32 %1, i32* %5
%7 = load i32, i32* %5
%8 = icmp eq i32 %7, 0
br i1 %8, label %9, label %10
9: ; preds = %2
store float 0.000000e+00, float* %3
br label %40
10: ; preds = %2
%11 = load i32, i32* %5
%12 = icmp eq i32 %11, 1
br i1 %12, label %13, label %15
13: ; preds = %10
%14 = load float, float* %4
store float %14, float* %3
br label %40
15: ; preds = %10
%16 = load i32, i32* %5
%17 = sub nsw i32 %16, 1
%18 = mul nsw i32 2, %17
%19 = sitofp i32 %18 to float
%20 = load float, float* %4
%21 = load float, float* %4
%22 = load i32, i32* %5
%23 = sub nsw i32 %22, 1
%24 = call float @px(float %21, i32 %23)
%25 = fneg float %24
%26 = call float @llvm.fmuladd.f32(float %19, float %20, float %25)
%27 = load i32, i32* %5
%28 = sub nsw i32 %27, 1
%29 = sitofp i32 %28 to float
%30 = load float, float* %4
%31 = load i32, i32* %5
%32 = sub nsw i32 %31, 2
%33 = call float @px(float %30, i32 %32)
%34 = fneg float %29
%35 = call float @llvm.fmuladd.f32(float %34, float %33, float %26)
%36 = load i32, i32* %5
%37 = sitofp i32 %36 to float
%38 = fdiv float %35, %37
store float %38, float* %6
%39 = load float, float* %6
store float %39, float* %3
br label %40
40: ; preds = %15, %13, %9
%41 = load float, float* %3
ret float %41
}

LLVM IR (-O2):
define float @px(float %0, i32 %1) {
switch i32 %1, label %6 [
i32 0, label %4
i32 1, label %3
]
3: ; preds = %2
br label %4
4: ; preds = %3, %2, %6
%5 = phi float [ %19, %6 ], [ %0, %3 ], [ 0.000000e+00, %2 ]
ret float %5
6: ; preds = %2
%7 = add nsw i32 %1, -1
%8 = shl nsw i32 %7, 1
%9 = sitofp i32 %8 to float
%10 = tail call float @px(float %0, i32 %7)
%11 = fneg float %10
%12 = tail call float @llvm.fmuladd.f32(float %9, float %0, float %11)
%13 = sitofp i32 %7 to float
%14 = add nsw i32 %1, -2
%15 = tail call float @px(float %0, i32 %14)
%16 = fneg float %13
%17 = tail call float @llvm.fmuladd.f32(float %16, float %15, float %12)
%18 = sitofp i32 %1 to float
%19 = fdiv float %17, %18
br label %4
}