#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 */
scalar_t__ Float2Int(float);
float Fminf(float x, float y) {
  if (x < y || !(y == y))
    return x;
  else if (y < x || !(x == x))
    return y;
  else if (x != 0.f)
    return x;
  else
    return Float2Int(x) == 0 ? y : x;
}


x86 assembly (clang, -O0):
<Fminf>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  -0x8(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
ja     114f <Fminf+0x3f>
movss  -0xc(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jne    114f <Fminf+0x3f>
jp     114f <Fminf+0x3f>
jmp    115e <Fminf+0x4e>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11fc <Fminf+0xec>
movss  -0xc(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
ja     118b <Fminf+0x7b>
movss  -0x8(%rbp),%xmm0
ucomiss -0x8(%rbp),%xmm0
jne    118b <Fminf+0x7b>
jp     118b <Fminf+0x7b>
jmp    119a <Fminf+0x8a>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11fc <Fminf+0xec>
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    11b6 <Fminf+0xa6>
jp     11b6 <Fminf+0xa6>
jmp    11c5 <Fminf+0xb5>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11fc <Fminf+0xec>
movss  -0x8(%rbp),%xmm0
call   1030 <Float2Int@plt>
cmp    $0x0,%rax
jne    11e8 <Fminf+0xd8>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    11f2 <Fminf+0xe2>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<Fminf>:
ucomiss %xmm0,%xmm1
ja     112e <Fminf+0x1e>
ucomiss %xmm1,%xmm1
jp     112e <Fminf+0x1e>
ucomiss %xmm0,%xmm0
jp     112f <Fminf+0x1f>
ucomiss %xmm1,%xmm0
ja     112f <Fminf+0x1f>
xorps  %xmm2,%xmm2
ucomiss %xmm2,%xmm0
jne    112e <Fminf+0x1e>
jnp    1133 <Fminf+0x23>
ret
movaps %xmm1,%xmm0
ret
push   %rax
movss  %xmm0,(%rsp)
movss  %xmm1,0x4(%rsp)
call   1030 <Float2Int@plt>
movss  0x4(%rsp),%xmm0
test   %rax,%rax
je     1154 <Fminf+0x44>
movss  (%rsp),%xmm0
add    $0x8,%rsp
ret

LLVM IR (-O0):
define float @Fminf(float %0, float %1) {
%3 = alloca float
%4 = alloca float
%5 = alloca float
store float %0, float* %4
store float %1, float* %5
%6 = load float, float* %4
%7 = load float, float* %5
%8 = fcmp olt float %6, %7
br i1 %8, label %13, label %9
9: ; preds = %2
%10 = load float, float* %5
%11 = load float, float* %5
%12 = fcmp oeq float %10, %11
br i1 %12, label %15, label %13
13: ; preds = %9, %2
%14 = load float, float* %4
store float %14, float* %3
br label %40
15: ; preds = %9
%16 = load float, float* %5
%17 = load float, float* %4
%18 = fcmp olt float %16, %17
br i1 %18, label %23, label %19
19: ; preds = %15
%20 = load float, float* %4
%21 = load float, float* %4
%22 = fcmp oeq float %20, %21
br i1 %22, label %25, label %23
23: ; preds = %19, %15
%24 = load float, float* %5
store float %24, float* %3
br label %40
25: ; preds = %19
%26 = load float, float* %4
%27 = fcmp une float %26, 0.000000e+00
br i1 %27, label %28, label %30
28: ; preds = %25
%29 = load float, float* %4
store float %29, float* %3
br label %40
30: ; preds = %25
%31 = load float, float* %4
%32 = call i64 @Float2Int(float %31)
%33 = icmp eq i64 %32, 0
br i1 %33, label %34, label %36
34: ; preds = %30
%35 = load float, float* %5
br label %38
36: ; preds = %30
%37 = load float, float* %4
br label %38
38: ; preds = %36, %34
%39 = phi float [ %35, %34 ], [ %37, %36 ]
store float %39, float* %3
br label %40
40: ; preds = %38, %28, %23, %13
%41 = load float, float* %3
ret float %41
}

LLVM IR (-O2):
define float @Fminf(float %0, float %1) {
%3 = fcmp uge float %0, %1
%4 = fcmp ord float %1, 0.000000e+00
%5 = and i1 %3, %4
br i1 %5, label %6, label %16
6: ; preds = %2
%7 = fcmp uge float %1, %0
%8 = fcmp ord float %0, 0.000000e+00
%9 = and i1 %8, %7
br i1 %9, label %10, label %16
10: ; preds = %6
%11 = fcmp une float %0, 0.000000e+00
br i1 %11, label %16, label %12
12: ; preds = %10
%13 = tail call i64 @Float2Int(float %0)
%14 = icmp eq i64 %13, 0
%15 = select i1 %14, float %1, float %0
br label %16
16: ; preds = %10, %6, %2, %12
%17 = phi float [ %15, %12 ], [ %0, %2 ], [ %1, %6 ], [ %0, %10 ]
ret float %17
}