#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 fk(double const, double const, double const, double const, double const,
          double const, double const);
double exact_func(const double p, const double du, const double AL,
                  const double AR, const double BL, const double BR,
                  const double pL, const double pR, const double aL,
                  const double aR, const double z, const double g) {
  return fk(p, pL, AL, BL, aL, z, g) + fk(p, pR, AR, BR, aR, z, g) + du;
}


x86 assembly (clang, -O0):
<exact_func>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movsd  0x28(%rbp),%xmm8
movsd  0x20(%rbp),%xmm8
movsd  0x18(%rbp),%xmm8
movsd  0x10(%rbp),%xmm8
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
movsd  %xmm4,-0x28(%rbp)
movsd  %xmm5,-0x30(%rbp)
movsd  %xmm6,-0x38(%rbp)
movsd  %xmm7,-0x40(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm2
movsd  -0x28(%rbp),%xmm3
movsd  0x10(%rbp),%xmm4
movsd  0x20(%rbp),%xmm5
movsd  0x28(%rbp),%xmm6
call   1030 <fk@plt>
movsd  %xmm0,-0x48(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm3
movsd  0x18(%rbp),%xmm4
movsd  0x20(%rbp),%xmm5
movsd  0x28(%rbp),%xmm6
call   1030 <fk@plt>
movaps %xmm0,%xmm1
movsd  -0x48(%rbp),%xmm0
addsd  %xmm1,%xmm0
addsd  -0x10(%rbp),%xmm0
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<exact_func>:
sub    $0x38,%rsp
movsd  %xmm7,0x20(%rsp)
movaps %xmm6,%xmm8
movsd  %xmm5,0x28(%rsp)
movaps %xmm4,%xmm7
movsd  %xmm3,0x18(%rsp)
movsd  %xmm1,0x30(%rsp)
movsd  %xmm0,0x8(%rsp)
movsd  0x40(%rsp),%xmm4
movsd  0x50(%rsp),%xmm5
movsd  0x58(%rsp),%xmm6
movaps %xmm8,%xmm1
movaps %xmm7,%xmm3
call   1030 <fk@plt>
movsd  %xmm0,0x10(%rsp)
movsd  0x8(%rsp),%xmm0
movsd  0x20(%rsp),%xmm1
movsd  0x18(%rsp),%xmm2
movsd  0x28(%rsp),%xmm3
movsd  0x48(%rsp),%xmm4
movsd  0x50(%rsp),%xmm5
movsd  0x58(%rsp),%xmm6
call   1030 <fk@plt>
addsd  0x10(%rsp),%xmm0
addsd  0x30(%rsp),%xmm0
add    $0x38,%rsp
ret

LLVM IR (-O0):
define double @exact_func(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9, double %10, double %11) {
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca double
%24 = alloca double
store double %0, double* %13
store double %1, double* %14
store double %2, double* %15
store double %3, double* %16
store double %4, double* %17
store double %5, double* %18
store double %6, double* %19
store double %7, double* %20
store double %8, double* %21
store double %9, double* %22
store double %10, double* %23
store double %11, double* %24
%25 = load double, double* %13
%26 = load double, double* %19
%27 = load double, double* %15
%28 = load double, double* %17
%29 = load double, double* %21
%30 = load double, double* %23
%31 = load double, double* %24
%32 = call double @fk(double %25, double %26, double %27, double %28, double %29, double %30, double %31)
%33 = load double, double* %13
%34 = load double, double* %20
%35 = load double, double* %16
%36 = load double, double* %18
%37 = load double, double* %22
%38 = load double, double* %23
%39 = load double, double* %24
%40 = call double @fk(double %33, double %34, double %35, double %36, double %37, double %38, double %39)
%41 = fadd double %32, %40
%42 = load double, double* %14
%43 = fadd double %41, %42
ret double %43
}

LLVM IR (-O2):
define double @exact_func(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9, double %10, double %11) {
%13 = tail call double @fk(double %0, double %6, double %2, double %4, double %8, double %10, double %11)
%14 = tail call double @fk(double %0, double %7, double %3, double %5, double %9, double %10, double %11)
%15 = fadd double %13, %14
%16 = fadd double %15, %1
ret double %16
}