main() {
  float fx(), inita(), initc(), a, b, c;
  a = inita();
  c = initc();
  f();
  b = fx(c) + a;
  f();
  if (a != 3.0 || b < 4.3257 || b > 4.3258 || c != 4.0)
    abort();
  exit(0);
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movl   $0x0,-0x4(%rbp)
mov    $0x0,%al
call   1060 <inita@plt>
movss  %xmm0,-0x8(%rbp)
mov    $0x0,%al
call   1070 <initc@plt>
movss  %xmm0,-0x10(%rbp)
mov    $0x0,%al
call   1050 <f@plt>
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mov    $0x1,%al
call   1040 <fx@plt>
addss  -0x8(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
mov    $0x0,%al
call   1050 <f@plt>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe40(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    122c <main+0xcc>
jp     122c <main+0xcc>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe27(%rip),%xmm0
ucomisd %xmm1,%xmm0
ja     122c <main+0xcc>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe14(%rip),%xmm1
ucomisd %xmm1,%xmm0
ja     122c <main+0xcc>
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe01(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    122c <main+0xcc>
jp     122c <main+0xcc>
jmp    1231 <main+0xd1>
call   1030 <abort@plt>
xor    %edi,%edi
call   1080 <exit@plt>

x86 assembly (clang, -O2):
<main>:
sub    $0x18,%rsp
xor    %eax,%eax
call   1060 <inita@plt>
movss  %xmm0,0x14(%rsp)
xor    %eax,%eax
call   1070 <initc@plt>
movss  %xmm0,0xc(%rsp)
xor    %eax,%eax
call   1050 <f@plt>
movss  0xc(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
mov    $0x1,%al
call   1040 <fx@plt>
movss  %xmm0,0x10(%rsp)
xor    %eax,%eax
call   1050 <f@plt>
movss  0x14(%rsp),%xmm0
ucomiss 0xe50(%rip),%xmm0
jne    11f6 <main+0x96>
jp     11f6 <main+0x96>
movss  0x10(%rsp),%xmm0
addss  0xe3e(%rip),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe3a(%rip),%xmm1
ucomisd %xmm0,%xmm1
ja     11f6 <main+0x96>
ucomisd 0xe34(%rip),%xmm0
ja     11f6 <main+0x96>
movss  0xc(%rsp),%xmm0
ucomiss 0xe19(%rip),%xmm0
jne    11f6 <main+0x96>
jp     11f6 <main+0x96>
xor    %edi,%edi
call   1080 <exit@plt>
call   1030 <abort@plt>

LLVM IR (-O0):
define i32 @main() {
%1 = alloca i32
%2 = alloca float
%3 = alloca float
%4 = alloca float
store i32 0, i32* %1
%5 = call float (...) @inita()
store float %5, float* %2
%6 = call float (...) @initc()
store float %6, float* %4
%7 = call i32 (...) @f()
%8 = load float, float* %4
%9 = fpext float %8 to double
%10 = call float (double, ...) bitcast (float (...)* @fx to float (double, ...)*)(double %9)
%11 = load float, float* %2
%12 = fadd float %10, %11
store float %12, float* %3
%13 = call i32 (...) @f()
%14 = load float, float* %2
%15 = fpext float %14 to double
%16 = fcmp une double %15, 3.000000e+00
br i1 %16, label %29, label %17
17: ; preds = %0
%18 = load float, float* %3
%19 = fpext float %18 to double
%20 = fcmp olt double %19, 4.325700e+00
br i1 %20, label %29, label %21
21: ; preds = %17
%22 = load float, float* %3
%23 = fpext float %22 to double
%24 = fcmp ogt double %23, 4.325800e+00
br i1 %24, label %29, label %25
25: ; preds = %21
%26 = load float, float* %4
%27 = fpext float %26 to double
%28 = fcmp une double %27, 4.000000e+00
br i1 %28, label %29, label %30
29: ; preds = %25, %21, %17, %0
unreachable
30: ; preds = %25
unreachable
}

LLVM IR (-O2):
define i32 @main() {
%1 = tail call float (...) @inita()
%2 = tail call float (...) @initc()
%3 = tail call i32 (...) @f()
%4 = fpext float %2 to double
%5 = tail call float (double, ...) bitcast (float (...)* @fx to float (double, ...)*)(double %4)
%6 = tail call i32 (...) @f()
%7 = fcmp une float %1, 3.000000e+00
br i1 %7, label %16, label %8
8: ; preds = %0
%9 = fadd float %5, 3.000000e+00
%10 = fpext float %9 to double
%11 = fcmp olt double %10, 4.325700e+00
%12 = fcmp ogt double %10, 4.325800e+00
%13 = or i1 %11, %12
%14 = fcmp une float %2, 4.000000e+00
%15 = select i1 %13, i1 true, i1 %14
br i1 %15, label %16, label %17
16: ; preds = %8, %0
tail call void @abort()
unreachable
17: ; preds = %8
tail call void @exit(i32 0)
unreachable
}