#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 sqrt(int);
double V_C(double M0, double E) {
  double c2 = 2.99792458E8 * 2.99792458E8;
  E = E * 1.60217733E-19 * 1.0E6;
  M0 = M0 * 1.660540E-27;
  return (sqrt(
      1 - (1 / ((E * E / (M0 * M0 * c2 * c2) + (2 * E / (M0 * c2)) + 1)))));
}


x86 assembly (clang, -O0):
<V_C>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  0xefe(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  0xee9(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  0xed4(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xebb(%rip),%xmm0
mulsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  -0x8(%rbp),%xmm1
mulsd  -0x8(%rbp),%xmm1
mulsd  -0x18(%rbp),%xmm1
mulsd  -0x18(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  0xe7f(%rip),%xmm1
mulsd  -0x10(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm2
mulsd  -0x18(%rbp),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  0xe58(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  0xe4c(%rip),%xmm1
divsd  %xmm0,%xmm1
movsd  0xe40(%rip),%xmm0
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edi
call   1030 <sqrt@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<V_C>:
mulsd  0xee8(%rip),%xmm1
mulsd  0xee8(%rip),%xmm1
mulsd  0xee8(%rip),%xmm0
movapd %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  0xee0(%rip),%xmm2
movapd %xmm1,%xmm3
unpcklpd %xmm1,%xmm3
shufpd $0x2,0xee7(%rip),%xmm1
mulpd  %xmm3,%xmm1
unpcklpd %xmm0,%xmm2
mulpd  0xee7(%rip),%xmm2
divpd  %xmm2,%xmm1
movapd %xmm1,%xmm0
unpckhpd %xmm1,%xmm0
addsd  %xmm1,%xmm0
movsd  0xeaf(%rip),%xmm1
addsd  %xmm1,%xmm0
movapd %xmm1,%xmm2
divsd  %xmm0,%xmm2
subsd  %xmm2,%xmm1
cvttsd2si %xmm1,%edi
jmp    1030 <sqrt@plt>

LLVM IR (-O0):
define double @V_C(double %0, double %1) {
%3 = alloca double
%4 = alloca double
%5 = alloca double
store double %0, double* %3
store double %1, double* %4
store double 0x4373F4D4EACDD756, double* %5
%6 = load double, double* %4
%7 = fmul double %6, 0x3C07A4DAD55E53FE
%8 = fmul double %7, 1.000000e+06
store double %8, double* %4
%9 = load double, double* %3
%10 = fmul double %9, 1.660540e-27
store double %10, double* %3
%11 = load double, double* %4
%12 = load double, double* %4
%13 = fmul double %11, %12
%14 = load double, double* %3
%15 = load double, double* %3
%16 = fmul double %14, %15
%17 = load double, double* %5
%18 = fmul double %16, %17
%19 = load double, double* %5
%20 = fmul double %18, %19
%21 = fdiv double %13, %20
%22 = load double, double* %4
%23 = fmul double 2.000000e+00, %22
%24 = load double, double* %3
%25 = load double, double* %5
%26 = fmul double %24, %25
%27 = fdiv double %23, %26
%28 = fadd double %21, %27
%29 = fadd double %28, 1.000000e+00
%30 = fdiv double 1.000000e+00, %29
%31 = fsub double 1.000000e+00, %30
%32 = fptosi double %31 to i32
%33 = call double @sqrt(i32 %32)
ret double %33
}

LLVM IR (-O2):
define double @V_C(double %0, double %1) {
%3 = fmul double %1, 0x3C07A4DAD55E53FE
%4 = fmul double %3, 1.000000e+06
%5 = fmul double %0, 1.660540e-27
%6 = fmul double %5, %5
%7 = fmul double %6, 0x4373F4D4EACDD756
%8 = insertelement <2 x double> poison, double %4, i64 0
%9 = shufflevector <2 x double> %8, <2 x double> poison, <2 x i32> zeroinitializer
%10 = insertelement <2 x double> <double poison, double 2.000000e+00>, double %4, i64 0
%11 = fmul <2 x double> %9, %10
%12 = insertelement <2 x double> poison, double %7, i64 0
%13 = insertelement <2 x double> %12, double %5, i64 1
%14 = fmul <2 x double> %13, <double 0x4373F4D4EACDD756, double 0x4373F4D4EACDD756>
%15 = fdiv <2 x double> %11, %14
%16 = shufflevector <2 x double> %15, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%17 = fadd <2 x double> %15, %16
%18 = extractelement <2 x double> %17, i64 0
%19 = fadd double %18, 1.000000e+00
%20 = fdiv double 1.000000e+00, %19
%21 = fsub double 1.000000e+00, %20
%22 = fptosi double %21 to i32
%23 = tail call double @sqrt(i32 %22)
ret double %23
}