int main() {
  int i = 0;
  double a = 1.5;
  double b = 2.2;
  double c = a + b;
  double d = b - a;
  double e = b / a;
  double f = a * b;
  if (c != 3.7) {
    goto Error;
  } else {
    i = 1;
  }
  if ((0.7 - d) > 0.0) {
    goto Error;
  } else {
    i = 2;
  }
  if ((1.47 - e) > 0.1) {
    goto Error;
  } else {
    i = 3;
  }
  if ((3.3 - f) > 0.0) {
    goto Error;
  } else {
    i = 4;
  }
  return 0;
Error:
  return -1;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
movl   $0x0,-0x4(%rbp)
movl   $0x0,-0x8(%rbp)
movsd  0xef6(%rip),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xee1(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x10(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x18(%rbp),%xmm0
divsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  0xe8b(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    118a <main+0x8a>
jp     118a <main+0x8a>
jmp    118f <main+0x8f>
jmp    1219 <main+0x119>
movl   $0x1,-0x8(%rbp)
movsd  0xe7a(%rip),%xmm0
subsd  -0x28(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    11b5 <main+0xb5>
jmp    1219 <main+0x119>
movl   $0x2,-0x8(%rbp)
movsd  0xe64(%rip),%xmm0
subsd  -0x30(%rbp),%xmm0
movsd  0xe4f(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11e0 <main+0xe0>
jmp    1219 <main+0x119>
movl   $0x3,-0x8(%rbp)
movsd  0xe41(%rip),%xmm0
subsd  -0x38(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1206 <main+0x106>
jmp    1219 <main+0x119>
movl   $0x4,-0x8(%rbp)
movl   $0x0,-0x4(%rbp)
jmp    1220 <main+0x120>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @main() {
%1 = alloca i32
%2 = alloca i32
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
store i32 0, i32* %1
store i32 0, i32* %2
store double 1.500000e+00, double* %3
store double 2.200000e+00, double* %4
%9 = load double, double* %3
%10 = load double, double* %4
%11 = fadd double %9, %10
store double %11, double* %5
%12 = load double, double* %4
%13 = load double, double* %3
%14 = fsub double %12, %13
store double %14, double* %6
%15 = load double, double* %4
%16 = load double, double* %3
%17 = fdiv double %15, %16
store double %17, double* %7
%18 = load double, double* %3
%19 = load double, double* %4
%20 = fmul double %18, %19
store double %20, double* %8
%21 = load double, double* %5
%22 = fcmp une double %21, 3.700000e+00
br i1 %22, label %23, label %24
23: ; preds = %0
br label %44
24: ; preds = %0
store i32 1, i32* %2
br label %25
25: ; preds = %24
%26 = load double, double* %6
%27 = fsub double 0x3FE6666666666666, %26
%28 = fcmp ogt double %27, 0.000000e+00
br i1 %28, label %29, label %30
29: ; preds = %25
br label %44
30: ; preds = %25
store i32 2, i32* %2
br label %31
31: ; preds = %30
%32 = load double, double* %7
%33 = fsub double 1.470000e+00, %32
%34 = fcmp ogt double %33, 1.000000e-01
br i1 %34, label %35, label %36
35: ; preds = %31
br label %44
36: ; preds = %31
store i32 3, i32* %2
br label %37
37: ; preds = %36
%38 = load double, double* %8
%39 = fsub double 3.300000e+00, %38
%40 = fcmp ogt double %39, 0.000000e+00
br i1 %40, label %41, label %42
41: ; preds = %37
br label %44
42: ; preds = %37
store i32 4, i32* %2
br label %43
43: ; preds = %42
store i32 0, i32* %1
br label %45
44: ; preds = %41, %35, %29, %23
store i32 -1, i32* %1
br label %45
45: ; preds = %44, %43
%46 = load i32, i32* %1
ret i32 %46
}

LLVM IR (-O2):
define i32 @main() {
ret i32 0
}