#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 exp(double);
int log(double);
double pow(double, int);
double AchantaOrigDeff(double X, double Tk) {
  double Tc = Tk - 273.15, P = 0.77,
         Dv = 1e-10 * pow(Tk / 328.15, 1.85) * 2 / P,
         Pv0 = log(7.967 - 1668.0 / (Tk - 45.15)) / 760, eps = 0.27,
         rhos = 1.21, rhorat = 1.21, Rw = 4.56e-3, R = 1.987, n = 10,
         Eb = 24e3 * exp(-25 * X), D0 = 149.7e-12,
         Dl = D0 * exp(-Eb / (n * R * Tk)), A = Pv0 / (Rw * Tk),
         K = 0.176 - 1.748e-3 * Tc, N = 0.182 + 6.946e-3 * Tc,
         par1 = pow(K / X, 1 / N) + 1,
         par2 = A * (par1 - 1.0) / (pow(par1, 2) * N * X), rhoVW = A / par1,
         rhoV = 353.4 / Tk - 0.611 * rhoVW,
         par4 = (353.4 / Tk) * par2 / pow(rhoV, 2),
         H = rhoV * Dv / (1.0e3 * (1 - eps) * (rhoVW / rhoV)),
         par5 = H * par4 / rhorat, Deff = Dl + par5;
  return Deff;
}


x86 assembly (clang, -O0):
<AchantaOrigDeff>:
push   %rbp
mov    %rsp,%rbp
sub    $0xf0,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xf66(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  0xf4d(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xf33(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    $0x1,%edi
call   1050 <pow@plt>
movaps %xmm0,%xmm1
movsd  0xf12(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  0xefe(%rip),%xmm1
mulsd  %xmm1,%xmm0
divsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xedb(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xec7(%rip),%xmm1
divsd  %xmm0,%xmm1
movsd  0xeb3(%rip),%xmm0
subsd  %xmm1,%xmm0
call   1040 <log@plt>
mov    $0x2f8,%ecx
cltd
idiv   %ecx
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xe89(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xe74(%rip),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xe67(%rip),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0xe52(%rip),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xe3d(%rip),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xe28(%rip),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  0xe13(%rip),%xmm0
mulsd  -0x8(%rbp),%xmm0
call   1030 <exp@plt>
movaps %xmm0,%xmm1
movsd  0xdf6(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  0xddd(%rip),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  -0x68(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  -0x60(%rbp),%xmm1
mulsd  -0x58(%rbp),%xmm1
mulsd  -0x10(%rbp),%xmm1
divsd  %xmm1,%xmm0
call   1030 <exp@plt>
movaps %xmm0,%xmm1
movsd  -0xe8(%rbp),%xmm0
ff
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
mulsd  -0x10(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  0xd4e(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd4a(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x18(%rbp),%xmm0
movsd  0xd19(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd15(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x88(%rbp),%xmm0
ff
divsd  -0x8(%rbp),%xmm0
movsd  0xcd4(%rip),%xmm1
divsd  -0x90(%rbp),%xmm1
ff
cvttsd2si %xmm1,%edi
call   1050 <pow@plt>
movsd  0xcbb(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
movsd  -0x98(%rbp),%xmm1
ff
movsd  0xc9a(%rip),%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
mov    $0x2,%edi
call   1050 <pow@plt>
movaps %xmm0,%xmm1
movsd  -0xe0(%rbp),%xmm0
ff
mulsd  -0x90(%rbp),%xmm1
ff
mulsd  -0x8(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
divsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  0xc3f(%rip),%xmm1
divsd  -0x10(%rbp),%xmm1
movsd  -0xa8(%rbp),%xmm0
ff
movsd  0xc32(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  0xc12(%rip),%xmm0
divsd  -0x10(%rbp),%xmm0
mulsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0xd8(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
mov    $0x2,%edi
call   1050 <pow@plt>
movaps %xmm0,%xmm1
movsd  -0xd8(%rbp),%xmm0
ff
divsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
mulsd  -0x28(%rbp),%xmm0
movsd  0xbb7(%rip),%xmm2
subsd  -0x38(%rbp),%xmm2
movsd  0xba2(%rip),%xmm1
mulsd  %xmm2,%xmm1
movsd  -0xa8(%rbp),%xmm2
ff
divsd  -0xb0(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
mulsd  -0xb8(%rbp),%xmm0
ff
divsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  -0x78(%rbp),%xmm0
addsd  -0xc8(%rbp),%xmm0
ff
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  -0xd0(%rbp),%xmm0
ff
add    $0xf0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<AchantaOrigDeff>:
sub    $0x78,%rsp
movsd  %xmm1,0x10(%rsp)
movsd  %xmm0,0x40(%rsp)
movsd  0xeb8(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rsp)
movapd %xmm1,%xmm0
divsd  0xeaa(%rip),%xmm0
mov    $0x1,%edi
call   1050 <pow@plt>
movapd %xmm0,0x30(%rsp)
movsd  0xe9a(%rip),%xmm1
addsd  0x10(%rsp),%xmm1
movsd  0xe94(%rip),%xmm0
divsd  %xmm1,%xmm0
addsd  0xe90(%rip),%xmm0
call   1040 <log@plt>
cltq
imul   $0xffffffffac769185,%rax,%rcx
shr    $0x20,%rcx
add    %ecx,%eax
mov    %eax,%ecx
shr    $0x1f,%ecx
sar    $0x9,%eax
add    %ecx,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movapd %xmm0,0x20(%rsp)
movsd  0xe65(%rip),%xmm0
mulsd  0x40(%rsp),%xmm0
call   1030 <exp@plt>
mulsd  0xe5a(%rip),%xmm0
movsd  0xe5a(%rip),%xmm1
mulsd  0x10(%rsp),%xmm1
divsd  %xmm1,%xmm0
call   1030 <exp@plt>
mulsd  0xe4b(%rip),%xmm0
movsd  %xmm0,0x58(%rsp)
movsd  0xe45(%rip),%xmm1
mulsd  0x10(%rsp),%xmm1
movsd  0xe3f(%rip),%xmm0
movsd  0x8(%rsp),%xmm2
mulsd  %xmm2,%xmm0
addsd  0xe35(%rip),%xmm0
mulsd  0xe35(%rip),%xmm2
movapd 0x20(%rsp),%xmm3
divsd  %xmm1,%xmm3
movapd %xmm3,0x20(%rsp)
addsd  0xe25(%rip),%xmm2
movsd  %xmm2,0x8(%rsp)
divsd  0x40(%rsp),%xmm0
movsd  0xe19(%rip),%xmm1
divsd  %xmm2,%xmm1
cvttsd2si %xmm1,%edi
call   1050 <pow@plt>
addsd  0xe04(%rip),%xmm0
unpcklpd %xmm0,%xmm2
movapd %xmm0,0x60(%rsp)
movapd 0x30(%rsp),%xmm1
mulsd  0xdf4(%rip),%xmm1
addpd  0xe14(%rip),%xmm2
movsd  %xmm1,%xmm2
movapd 0xe18(%rip),%xmm1
unpcklpd 0x20(%rsp),%xmm1
mulpd  %xmm2,%xmm1
movapd %xmm1,0x30(%rsp)
mov    $0x2,%edi
call   1050 <pow@plt>
mulsd  0x8(%rsp),%xmm0
mulsd  0x40(%rsp),%xmm0
movapd 0xdfa(%rip),%xmm1
unpcklpd %xmm0,%xmm1
movapd 0x30(%rsp),%xmm0
divpd  %xmm1,%xmm0
movapd %xmm0,0x30(%rsp)
movapd 0x20(%rsp),%xmm2
divsd  0x60(%rsp),%xmm2
movapd %xmm2,0x20(%rsp)
movsd  0xd8c(%rip),%xmm1
divsd  0x10(%rsp),%xmm1
movapd %xmm1,0x10(%rsp)
movsd  0xd80(%rip),%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movapd %xmm0,0x40(%rsp)
mov    $0x2,%edi
call   1050 <pow@plt>
movapd 0x20(%rsp),%xmm1
movapd 0x40(%rsp),%xmm2
divsd  %xmm2,%xmm1
unpcklpd 0x10(%rsp),%xmm2
mulsd  0xd52(%rip),%xmm1
mulpd  0x30(%rsp),%xmm2
unpcklpd %xmm0,%xmm1
divpd  %xmm1,%xmm2
movapd %xmm2,%xmm0
unpckhpd %xmm2,%xmm0
mulsd  %xmm2,%xmm0
divsd  0xd38(%rip),%xmm0
addsd  0x58(%rsp),%xmm0
add    $0x78,%rsp
ret

LLVM IR (-O0):
define double @AchantaOrigDeff(double %0, double %1) {
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%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
%25 = alloca double
%26 = alloca double
%27 = alloca double
%28 = alloca double
store double %0, double* %3
store double %1, double* %4
%29 = load double, double* %4
%30 = fsub double %29, 2.731500e+02
store double %30, double* %5
store double 7.700000e-01, double* %6
%31 = load double, double* %4
%32 = fdiv double %31, 3.281500e+02
%33 = call double @pow(double %32, i32 1)
%34 = fmul double 1.000000e-10, %33
%35 = fmul double %34, 2.000000e+00
%36 = load double, double* %6
%37 = fdiv double %35, %36
store double %37, double* %7
%38 = load double, double* %4
%39 = fsub double %38, 4.515000e+01
%40 = fdiv double 1.668000e+03, %39
%41 = fsub double 0x401FDE353F7CED91, %40
%42 = call i32 @log(double %41)
%43 = sdiv i32 %42, 760
%44 = sitofp i32 %43 to double
store double %44, double* %8
store double 2.700000e-01, double* %9
store double 1.210000e+00, double* %10
store double 1.210000e+00, double* %11
store double 4.560000e-03, double* %12
store double 1.987000e+00, double* %13
store double 1.000000e+01, double* %14
%45 = load double, double* %3
%46 = fmul double -2.500000e+01, %45
%47 = call double @exp(double %46)
%48 = fmul double 2.400000e+04, %47
store double %48, double* %15
store double 1.497000e-10, double* %16
%49 = load double, double* %16
%50 = load double, double* %15
%51 = fneg double %50
%52 = load double, double* %14
%53 = load double, double* %13
%54 = fmul double %52, %53
%55 = load double, double* %4
%56 = fmul double %54, %55
%57 = fdiv double %51, %56
%58 = call double @exp(double %57)
%59 = fmul double %49, %58
store double %59, double* %17
%60 = load double, double* %8
%61 = load double, double* %12
%62 = load double, double* %4
%63 = fmul double %61, %62
%64 = fdiv double %60, %63
store double %64, double* %18
%65 = load double, double* %5
%66 = call double @llvm.fmuladd.f64(double -1.748000e-03, double %65, double 1.760000e-01)
store double %66, double* %19
%67 = load double, double* %5
%68 = call double @llvm.fmuladd.f64(double 0x3F7C7368AD688377, double %67, double 1.820000e-01)
store double %68, double* %20
%69 = load double, double* %19
%70 = load double, double* %3
%71 = fdiv double %69, %70
%72 = load double, double* %20
%73 = fdiv double 1.000000e+00, %72
%74 = fptosi double %73 to i32
%75 = call double @pow(double %71, i32 %74)
%76 = fadd double %75, 1.000000e+00
store double %76, double* %21
%77 = load double, double* %18
%78 = load double, double* %21
%79 = fsub double %78, 1.000000e+00
%80 = fmul double %77, %79
%81 = load double, double* %21
%82 = call double @pow(double %81, i32 2)
%83 = load double, double* %20
%84 = fmul double %82, %83
%85 = load double, double* %3
%86 = fmul double %84, %85
%87 = fdiv double %80, %86
store double %87, double* %22
%88 = load double, double* %18
%89 = load double, double* %21
%90 = fdiv double %88, %89
store double %90, double* %23
%91 = load double, double* %4
%92 = fdiv double 3.534000e+02, %91
%93 = load double, double* %23
%94 = call double @llvm.fmuladd.f64(double 0xBFE38D4FDF3B645A, double %93, double %92)
store double %94, double* %24
%95 = load double, double* %4
%96 = fdiv double 3.534000e+02, %95
%97 = load double, double* %22
%98 = fmul double %96, %97
%99 = load double, double* %24
%100 = call double @pow(double %99, i32 2)
%101 = fdiv double %98, %100
store double %101, double* %25
%102 = load double, double* %24
%103 = load double, double* %7
%104 = fmul double %102, %103
%105 = load double, double* %9
%106 = fsub double 1.000000e+00, %105
%107 = fmul double 1.000000e+03, %106
%108 = load double, double* %23
%109 = load double, double* %24
%110 = fdiv double %108, %109
%111 = fmul double %107, %110
%112 = fdiv double %104, %111
store double %112, double* %26
%113 = load double, double* %26
%114 = load double, double* %25
%115 = fmul double %113, %114
%116 = load double, double* %11
%117 = fdiv double %115, %116
store double %117, double* %27
%118 = load double, double* %17
%119 = load double, double* %27
%120 = fadd double %118, %119
store double %120, double* %28
%121 = load double, double* %28
ret double %121
}

LLVM IR (-O2):
define double @AchantaOrigDeff(double %0, double %1) {
%3 = fadd double %1, -2.731500e+02
%4 = fdiv double %1, 3.281500e+02
%5 = tail call double @pow(double %4, i32 1)
%6 = fadd double %1, -4.515000e+01
%7 = fdiv double 1.668000e+03, %6
%8 = fsub double 0x401FDE353F7CED91, %7
%9 = tail call i32 @log(double %8)
%10 = sdiv i32 %9, 760
%11 = sitofp i32 %10 to double
%12 = fmul double %0, -2.500000e+01
%13 = tail call double @exp(double %12)
%14 = fmul double %13, -2.400000e+04
%15 = fmul double %1, 1.987000e+01
%16 = fdiv double %14, %15
%17 = tail call double @exp(double %16)
%18 = fmul double %17, 1.497000e-10
%19 = fmul double %1, 4.560000e-03
%20 = fdiv double %11, %19
%21 = tail call double @llvm.fmuladd.f64(double %3, double -1.748000e-03, double 1.760000e-01)
%22 = tail call double @llvm.fmuladd.f64(double %3, double 0x3F7C7368AD688377, double 1.820000e-01)
%23 = fdiv double %21, %0
%24 = fdiv double 1.000000e+00, %22
%25 = fptosi double %24 to i32
%26 = tail call double @pow(double %23, i32 %25)
%27 = fadd double %26, 1.000000e+00
%28 = insertelement <2 x double> poison, double %5, i64 0
%29 = insertelement <2 x double> %28, double %27, i64 1
%30 = fmul <2 x double> %29, <double 1.000000e-10, double poison>
%31 = fadd <2 x double> %29, <double poison, double -1.000000e+00>
%32 = shufflevector <2 x double> %30, <2 x double> %31, <2 x i32> <i32 0, i32 3>
%33 = insertelement <2 x double> <double 2.000000e+00, double poison>, double %20, i64 1
%34 = fmul <2 x double> %32, %33
%35 = tail call double @pow(double %27, i32 2)
%36 = fmul double %22, %35
%37 = fmul double %36, %0
%38 = insertelement <2 x double> <double 7.700000e-01, double poison>, double %37, i64 1
%39 = fdiv <2 x double> %34, %38
%40 = fdiv double %20, %27
%41 = fdiv double 3.534000e+02, %1
%42 = tail call double @llvm.fmuladd.f64(double %40, double 0xBFE38D4FDF3B645A, double %41)
%43 = tail call double @pow(double %42, i32 2)
%44 = insertelement <2 x double> poison, double %42, i64 0
%45 = insertelement <2 x double> %44, double %41, i64 1
%46 = fmul <2 x double> %39, %45
%47 = fdiv double %40, %42
%48 = fmul double %47, 7.300000e+02
%49 = insertelement <2 x double> poison, double %48, i64 0
%50 = insertelement <2 x double> %49, double %43, i64 1
%51 = fdiv <2 x double> %46, %50
%52 = shufflevector <2 x double> %51, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%53 = fmul <2 x double> %51, %52
%54 = extractelement <2 x double> %53, i64 0
%55 = fdiv double %54, 1.210000e+00
%56 = fadd double %18, %55
ret double %56
}