#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 */
int /*<<< orphan*/ assert(int);
int main() {
  double f;
  assert(100.0 + 10 == 110);
  assert(0 + f == f);
  assert(f + 0 == f);
  assert(100 + 0.5 == 100.5);
  assert(0.0 + 0.0 + f == f);
  assert(100.0 - 10 == 90);
  assert(0 - f == -f);
  assert(f - 0 == f);
  assert(100 - 0.5 == 99.5);
  assert(0.0 - 0.0 - f == -f);
  assert(-(-100.0) == 100);
  assert(-(1 - 2.0) == 1);
  assert(-(-f) == f);
  assert(100.0 * 10 == 1000);
  assert(0 * f == 0);
  assert(f * 0 == 0);
  assert(100 * 0.5 == 50);
  assert(f * 1 == f);
  assert(1 * f == f);
  assert(1.0 * 1.0 * f == f);
  assert(100.0 / 1.0 == 100);
  assert(100.1 / 1.0 == 100.1);
  assert(100.0 / 2.0 == 50);
  assert(100.0 / 0.5 == 200);
  assert(0 / 1.0 == 0);
  assert(f / 1.0 == f);
  assert(((double)(float)100) == 100.0);
  assert(((unsigned int)100.0) == 100.0);
  assert(100.0);
  assert(!0.0);
  assert((int)0.5 == 0);
  assert((int)0.49 == 0);
  assert((int)-1.5 == -1);
  assert((int)-10.49 == -10);
  assert(1.0 < 2.5);
  assert(1.0 <= 2.5);
  assert(1.01 <= 1.01);
  assert(2.5 > 1.0);
  assert(2.5 >= 1.0);
  assert(1.01 >= 1.01);
  assert(!(1.0 >= 2.5));
  assert(!(1.0 > 2.5));
  assert(1.0 != 2.5);
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    $0x1,%edi
call   1030 <assert@plt>
xorps  %xmm0,%xmm0
addsd  -0x8(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
xorps  %xmm0,%xmm0
addsd  -0x8(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
xorps  %xmm0,%xmm0
addsd  -0x8(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
xorps  %xmm0,%xmm0
subsd  -0x8(%rbp),%xmm0
movsd  -0x8(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
movsd  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
subsd  %xmm1,%xmm0
ucomisd -0x8(%rbp),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
xorps  %xmm0,%xmm0
subsd  -0x8(%rbp),%xmm0
movsd  -0x8(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
movsd  -0x8(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
ucomisd -0x8(%rbp),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
xorps  %xmm0,%xmm0
mulsd  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
xorps  %xmm0,%xmm0
mulsd  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
movsd  0xd10(%rip),%xmm0
mulsd  -0x8(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
movsd  0xcec(%rip),%xmm0
mulsd  -0x8(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
movsd  0xcc8(%rip),%xmm0
mulsd  -0x8(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
movsd  -0x8(%rbp),%xmm0
movsd  0xc6d(%rip),%xmm1
divsd  %xmm1,%xmm0
ucomisd -0x8(%rbp),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x64,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
xor    %eax,%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rax
mov    $0x1,%edi
call   1030 <assert@plt>
xor    %edi,%edi
call   1030 <assert@plt>
xor    %edi,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
xor    %edi,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
xor    %edi,%edi
call   1030 <assert@plt>
xor    %edi,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
xor    %edi,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
xor    %edi,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
xor    %edi,%edi
call   1030 <assert@plt>
xor    %edi,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
xor    %edi,%edi
call   1030 <assert@plt>
xor    %edi,%edi
call   1030 <assert@plt>
xor    %edi,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
xor    %edi,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x64,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
mov    $0x1,%edi
call   1030 <assert@plt>
xor    %eax,%eax
pop    %rcx
ret

LLVM IR (-O0):
define i32 @main() {
%1 = alloca double
%2 = call i32 @assert(i32 1)
%3 = load double, double* %1
%4 = fadd double 0.000000e+00, %3
%5 = load double, double* %1
%6 = fcmp oeq double %4, %5
%7 = zext i1 %6 to i32
%8 = call i32 @assert(i32 %7)
%9 = load double, double* %1
%10 = fadd double %9, 0.000000e+00
%11 = load double, double* %1
%12 = fcmp oeq double %10, %11
%13 = zext i1 %12 to i32
%14 = call i32 @assert(i32 %13)
%15 = call i32 @assert(i32 1)
%16 = load double, double* %1
%17 = fadd double 0.000000e+00, %16
%18 = load double, double* %1
%19 = fcmp oeq double %17, %18
%20 = zext i1 %19 to i32
%21 = call i32 @assert(i32 %20)
%22 = call i32 @assert(i32 1)
%23 = load double, double* %1
%24 = fsub double 0.000000e+00, %23
%25 = load double, double* %1
%26 = fneg double %25
%27 = fcmp oeq double %24, %26
%28 = zext i1 %27 to i32
%29 = call i32 @assert(i32 %28)
%30 = load double, double* %1
%31 = fsub double %30, 0.000000e+00
%32 = load double, double* %1
%33 = fcmp oeq double %31, %32
%34 = zext i1 %33 to i32
%35 = call i32 @assert(i32 %34)
%36 = call i32 @assert(i32 1)
%37 = load double, double* %1
%38 = fsub double 0.000000e+00, %37
%39 = load double, double* %1
%40 = fneg double %39
%41 = fcmp oeq double %38, %40
%42 = zext i1 %41 to i32
%43 = call i32 @assert(i32 %42)
%44 = call i32 @assert(i32 1)
%45 = call i32 @assert(i32 1)
%46 = load double, double* %1
%47 = fneg double %46
%48 = fneg double %47
%49 = load double, double* %1
%50 = fcmp oeq double %48, %49
%51 = zext i1 %50 to i32
%52 = call i32 @assert(i32 %51)
%53 = call i32 @assert(i32 1)
%54 = load double, double* %1
%55 = fmul double 0.000000e+00, %54
%56 = fcmp oeq double %55, 0.000000e+00
%57 = zext i1 %56 to i32
%58 = call i32 @assert(i32 %57)
%59 = load double, double* %1
%60 = fmul double %59, 0.000000e+00
%61 = fcmp oeq double %60, 0.000000e+00
%62 = zext i1 %61 to i32
%63 = call i32 @assert(i32 %62)
%64 = call i32 @assert(i32 1)
%65 = load double, double* %1
%66 = fmul double %65, 1.000000e+00
%67 = load double, double* %1
%68 = fcmp oeq double %66, %67
%69 = zext i1 %68 to i32
%70 = call i32 @assert(i32 %69)
%71 = load double, double* %1
%72 = fmul double 1.000000e+00, %71
%73 = load double, double* %1
%74 = fcmp oeq double %72, %73
%75 = zext i1 %74 to i32
%76 = call i32 @assert(i32 %75)
%77 = load double, double* %1
%78 = fmul double 1.000000e+00, %77
%79 = load double, double* %1
%80 = fcmp oeq double %78, %79
%81 = zext i1 %80 to i32
%82 = call i32 @assert(i32 %81)
%83 = call i32 @assert(i32 1)
%84 = call i32 @assert(i32 1)
%85 = call i32 @assert(i32 1)
%86 = call i32 @assert(i32 1)
%87 = call i32 @assert(i32 1)
%88 = load double, double* %1
%89 = fdiv double %88, 1.000000e+00
%90 = load double, double* %1
%91 = fcmp oeq double %89, %90
%92 = zext i1 %91 to i32
%93 = call i32 @assert(i32 %92)
%94 = call i32 @assert(i32 1)
%95 = call i32 @assert(i32 1)
%96 = call i32 @assert(i32 100)
%97 = call i32 @assert(i32 1)
%98 = call i32 @assert(i32 1)
%99 = call i32 @assert(i32 1)
%100 = call i32 @assert(i32 1)
%101 = call i32 @assert(i32 1)
%102 = call i32 @assert(i32 1)
%103 = call i32 @assert(i32 1)
%104 = call i32 @assert(i32 1)
%105 = call i32 @assert(i32 1)
%106 = call i32 @assert(i32 1)
%107 = call i32 @assert(i32 1)
%108 = call i32 @assert(i32 1)
%109 = call i32 @assert(i32 1)
%110 = call i32 @assert(i32 1)
ret i32 0
}

LLVM IR (-O2):
define i32 @main() {
%1 = tail call i32 @assert(i32 1)
%2 = tail call i32 @assert(i32 0)
%3 = tail call i32 @assert(i32 0)
%4 = tail call i32 @assert(i32 1)
%5 = tail call i32 @assert(i32 0)
%6 = tail call i32 @assert(i32 1)
%7 = tail call i32 @assert(i32 0)
%8 = tail call i32 @assert(i32 0)
%9 = tail call i32 @assert(i32 1)
%10 = tail call i32 @assert(i32 0)
%11 = tail call i32 @assert(i32 1)
%12 = tail call i32 @assert(i32 1)
%13 = tail call i32 @assert(i32 0)
%14 = tail call i32 @assert(i32 1)
%15 = tail call i32 @assert(i32 0)
%16 = tail call i32 @assert(i32 0)
%17 = tail call i32 @assert(i32 1)
%18 = tail call i32 @assert(i32 0)
%19 = tail call i32 @assert(i32 0)
%20 = tail call i32 @assert(i32 0)
%21 = tail call i32 @assert(i32 1)
%22 = tail call i32 @assert(i32 1)
%23 = tail call i32 @assert(i32 1)
%24 = tail call i32 @assert(i32 1)
%25 = tail call i32 @assert(i32 1)
%26 = tail call i32 @assert(i32 0)
%27 = tail call i32 @assert(i32 1)
%28 = tail call i32 @assert(i32 1)
%29 = tail call i32 @assert(i32 100)
%30 = tail call i32 @assert(i32 1)
%31 = tail call i32 @assert(i32 1)
%32 = tail call i32 @assert(i32 1)
%33 = tail call i32 @assert(i32 1)
%34 = tail call i32 @assert(i32 1)
%35 = tail call i32 @assert(i32 1)
%36 = tail call i32 @assert(i32 1)
%37 = tail call i32 @assert(i32 1)
%38 = tail call i32 @assert(i32 1)
%39 = tail call i32 @assert(i32 1)
%40 = tail call i32 @assert(i32 1)
%41 = tail call i32 @assert(i32 1)
%42 = tail call i32 @assert(i32 1)
%43 = tail call i32 @assert(i32 1)
ret i32 0
}