#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 f_fup(int, int);
scalar_t__ o_binCoeff(int, int);
double pow(int, int);
double f_fup_prime(double x, int n, int k) {
  int i;
  double y, z = 0.;
  if (k == 1) {
    for (i = 0; i < n + 2; i++) {
      z += (double)(o_binCoeff(i, n + 1) - o_binCoeff(i - 1, n + 1)) *
           f_fup(2. * x + (double)n / 2. + 1. - (double)i, n);
    }
    return pow(2., -n + 1) * z;
  }
  if (k > 1) {
    for (i = 0; i < n + 2; i++) {
      z += (double)(o_binCoeff(i, n + 1) - o_binCoeff(i - 1, n + 1)) * 2. *
           f_fup_prime(2. * x + (double)n / 2. + 1. - (double)i, n, k - 1);
    }
    return pow(2., -n + 1) * z;
  }
}


x86 assembly (clang, -O0):
<f_fup_prime>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movsd  %xmm0,-0x10(%rbp)
mov    %edi,-0x14(%rbp)
mov    %esi,-0x18(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
cmpl   $0x1,-0x18(%rbp)
jne    123c <f_fup_prime+0xfc>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    $0x2,%ecx
cmp    %ecx,%eax
jge    121b <f_fup_prime+0xdb>
mov    -0x1c(%rbp),%edi
mov    -0x14(%rbp),%esi
add    $0x1,%esi
call   1030 <o_binCoeff@plt>
mov    %rax,-0x40(%rbp)
mov    -0x1c(%rbp),%edi
sub    $0x1,%edi
mov    -0x14(%rbp),%esi
add    $0x1,%esi
call   1030 <o_binCoeff@plt>
mov    %rax,%rcx
mov    -0x40(%rbp),%rax
sub    %rcx,%rax
cvtsi2sd %rax,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x10(%rbp),%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
movsd  0xe42(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
movsd  0xe26(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsi2sdl -0x1c(%rbp),%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edi
mov    -0x14(%rbp),%esi
call   1040 <f_fup@plt>
movaps %xmm0,%xmm2
movsd  -0x38(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    116c <f_fup_prime+0x2c>
xor    %esi,%esi
sub    -0x14(%rbp),%esi
add    $0x1,%esi
mov    $0x2,%edi
call   1050 <pow@plt>
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1326 <f_fup_prime+0x1e6>
cmpl   $0x1,-0x18(%rbp)
jle    1326 <f_fup_prime+0x1e6>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    $0x2,%ecx
cmp    %ecx,%eax
jge    130a <f_fup_prime+0x1ca>
mov    -0x1c(%rbp),%edi
mov    -0x14(%rbp),%esi
add    $0x1,%esi
call   1030 <o_binCoeff@plt>
mov    %rax,-0x50(%rbp)
mov    -0x1c(%rbp),%edi
sub    $0x1,%edi
mov    -0x14(%rbp),%esi
add    $0x1,%esi
call   1030 <o_binCoeff@plt>
mov    %rax,%rcx
mov    -0x50(%rbp),%rax
sub    %rcx,%rax
cvtsi2sd %rax,%xmm0
movsd  0xd70(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x10(%rbp),%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
movsd  0xd55(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
movsd  0xd39(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsi2sdl -0x1c(%rbp),%xmm1
subsd  %xmm1,%xmm0
mov    -0x14(%rbp),%edi
mov    -0x18(%rbp),%esi
sub    $0x1,%esi
call   1060 <f_fup_prime@plt>
movaps %xmm0,%xmm2
movsd  -0x48(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    124d <f_fup_prime+0x10d>
xor    %esi,%esi
sub    -0x14(%rbp),%esi
add    $0x1,%esi
mov    $0x2,%edi
call   1050 <pow@plt>
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<f_fup_prime>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x20,%rsp
mov    %edi,%r15d
movapd %xmm0,%xmm1
cmp    $0x1,%esi
jne    1217 <f_fup_prime+0xd7>
xorpd  %xmm0,%xmm0
cmp    $0xffffffff,%r15d
jl     12e5 <f_fup_prime+0x1a5>
lea    0x1(%r15),%r14d
xorps  %xmm0,%xmm0
cvtsi2sd %r15d,%xmm0
mulsd  0xe82(%rip),%xmm0
addsd  %xmm1,%xmm1
addsd  %xmm0,%xmm1
addsd  0xe7a(%rip),%xmm1
movsd  %xmm1,0x10(%rsp)
xor    %ebx,%ebx
xorpd  %xmm0,%xmm0
nopw   0x0(%rax,%rax,1)
movsd  %xmm0,0x8(%rsp)
mov    %ebx,%edi
mov    %r14d,%esi
call   1030 <o_binCoeff@plt>
mov    %rax,%rbp
lea    -0x1(%rbx),%edi
mov    %r14d,%esi
call   1030 <o_binCoeff@plt>
sub    %rax,%rbp
xorps  %xmm0,%xmm0
cvtsi2sd %rbp,%xmm0
movsd  %xmm0,0x18(%rsp)
xorps  %xmm0,%xmm0
cvtsi2sd %ebx,%xmm0
movsd  0x10(%rsp),%xmm1
subsd  %xmm0,%xmm1
cvttsd2si %xmm1,%edi
mov    %r15d,%esi
call   1040 <f_fup@plt>
mulsd  0x18(%rsp),%xmm0
movsd  0x8(%rsp),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rsp)
movsd  0x8(%rsp),%xmm0
lea    0x1(%rbx),%eax
cmp    %r14d,%ebx
mov    %eax,%ebx
jne    11a0 <f_fup_prime+0x60>
jmp    12e5 <f_fup_prime+0x1a5>
jle    1303 <f_fup_prime+0x1c3>
xorpd  %xmm0,%xmm0
cmp    $0xffffffff,%r15d
jl     12e5 <f_fup_prime+0x1a5>
mov    %esi,%r14d
xorps  %xmm0,%xmm0
cvtsi2sd %r15d,%xmm0
mulsd  0xdc2(%rip),%xmm0
addsd  %xmm1,%xmm1
addsd  %xmm0,%xmm1
addsd  0xdba(%rip),%xmm1
movsd  %xmm1,0x10(%rsp)
lea    0x1(%r15),%r12d
add    $0xffffffff,%r14d
xor    %ebx,%ebx
xorpd  %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  %xmm0,0x8(%rsp)
mov    %ebx,%edi
mov    %r12d,%esi
call   1030 <o_binCoeff@plt>
mov    %rax,%rbp
lea    -0x1(%rbx),%edi
mov    %r12d,%esi
call   1030 <o_binCoeff@plt>
sub    %rax,%rbp
xorps  %xmm0,%xmm0
cvtsi2sd %rbp,%xmm0
addsd  %xmm0,%xmm0
movsd  %xmm0,0x18(%rsp)
xorps  %xmm1,%xmm1
cvtsi2sd %ebx,%xmm1
movsd  0x10(%rsp),%xmm0
subsd  %xmm1,%xmm0
mov    %r15d,%edi
mov    %r14d,%esi
call   1060 <f_fup_prime@plt>
mulsd  0x18(%rsp),%xmm0
movsd  0x8(%rsp),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rsp)
movsd  0x8(%rsp),%xmm0
lea    0x1(%rbx),%eax
cmp    %r12d,%ebx
mov    %eax,%ebx
jne    1270 <f_fup_prime+0x130>
movsd  %xmm0,0x8(%rsp)
mov    $0x1,%esi
sub    %r15d,%esi
mov    $0x2,%edi
call   1050 <pow@plt>
mulsd  0x8(%rsp),%xmm0
add    $0x20,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define double @f_fup_prime(double %0, i32 %1, i32 %2) {
%4 = icmp eq i32 %2, 1
br i1 %4, label %5, label %29
5: ; preds = %3
%6 = icmp sgt i32 %1, -2
br i1 %6, label %7, label %56
7: ; preds = %5
%8 = add nsw i32 %1, 1
%9 = sitofp i32 %1 to double
%10 = fmul double %9, 5.000000e-01
%11 = tail call double @llvm.fmuladd.f64(double %0, double 2.000000e+00, double %10)
%12 = fadd double %11, 1.000000e+00
%13 = add i32 %1, 1
br label %14
14: ; preds = %7, %14
%15 = phi double [ 0.000000e+00, %7 ], [ %26, %14 ]
%16 = phi i32 [ 0, %7 ], [ %27, %14 ]
%17 = tail call i64 @o_binCoeff(i32 %16, i32 %8)
%18 = add nsw i32 %16, -1
%19 = tail call i64 @o_binCoeff(i32 %18, i32 %8)
%20 = sub nsw i64 %17, %19
%21 = sitofp i64 %20 to double
%22 = sitofp i32 %16 to double
%23 = fsub double %12, %22
%24 = fptosi double %23 to i32
%25 = tail call double @f_fup(i32 %24, i32 %1)
%26 = tail call double @llvm.fmuladd.f64(double %21, double %25, double %15)
%27 = add nuw i32 %16, 1
%28 = icmp eq i32 %16, %13
br i1 %28, label %56, label %14
29: ; preds = %3
%30 = icmp sgt i32 %2, 1
br i1 %30, label %31, label %61
31: ; preds = %29
%32 = icmp sgt i32 %1, -2
br i1 %32, label %33, label %56
33: ; preds = %31
%34 = add nsw i32 %1, 1
%35 = sitofp i32 %1 to double
%36 = fmul double %35, 5.000000e-01
%37 = tail call double @llvm.fmuladd.f64(double %0, double 2.000000e+00, double %36)
%38 = fadd double %37, 1.000000e+00
%39 = add nsw i32 %2, -1
%40 = add i32 %1, 1
br label %41
41: ; preds = %33, %41
%42 = phi double [ 0.000000e+00, %33 ], [ %53, %41 ]
%43 = phi i32 [ 0, %33 ], [ %54, %41 ]
%44 = tail call i64 @o_binCoeff(i32 %43, i32 %34)
%45 = add nsw i32 %43, -1
%46 = tail call i64 @o_binCoeff(i32 %45, i32 %34)
%47 = sub nsw i64 %44, %46
%48 = sitofp i64 %47 to double
%49 = fmul double %48, 2.000000e+00
%50 = sitofp i32 %43 to double
%51 = fsub double %38, %50
%52 = tail call double @f_fup_prime(double %51, i32 %1, i32 %39)
%53 = tail call double @llvm.fmuladd.f64(double %49, double %52, double %42)
%54 = add nuw i32 %43, 1
%55 = icmp eq i32 %43, %40
br i1 %55, label %56, label %41
56: ; preds = %41, %14, %31, %5
%57 = phi double [ 0.000000e+00, %5 ], [ 0.000000e+00, %31 ], [ %26, %14 ], [ %53, %41 ]
%58 = sub i32 1, %1
%59 = tail call double @pow(i32 2, i32 %58)
%60 = fmul double %57, %59
br label %61
61: ; preds = %56, %29
%62 = phi double [ undef, %29 ], [ %60, %56 ]
ret double %62
}