int main(int argc, char **argv) {
  int a;
  double __attribute__((unit(m))) x = 0;
  a = x == x;
  a = x != x;
  a = x > x;
  a = x >= x;
  a = x < x;
  a = x <= x;
  a = x == 0;
  a = x != 0;
  a = x > 0;
  a = x >= 0;
  a = x < 0;
  a = x <= 0;
  a = 0 == x;
  a = 0 != x;
  a = 0 > x;
  a = 0 >= x;
  a = 0 < x;
  a = 0 <= x;
  a = 0 == 0;
  a = 0 != 0;
  a = 0 > 0;
  a = 0 >= 0;
  a = 0 < 0;
  a = 0 <= 0;
  a = !x;
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
movsd  -0x20(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
setne  %al
setp   %cl
or     %cl,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
movsd  -0x20(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
movsd  -0x20(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
movsd  -0x20(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
movsd  -0x20(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
ucomisd %xmm1,%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
setne  %al
setp   %cl
or     %cl,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x20(%rbp),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x20(%rbp),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x20(%rbp),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x20(%rbp),%xmm0
setne  %al
setp   %cl
or     %cl,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x20(%rbp),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x20(%rbp),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
movl   $0x1,-0x14(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x1,-0x14(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x1,-0x14(%rbp)
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
setne  %al
setp   %cl
or     %cl,%al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x14(%rbp)
xor    %eax,%eax
pop    %rbp
ret

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

LLVM IR (-O0):
define i32 @main(i32 %0, i8** %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i8**
%6 = alloca i32
%7 = alloca double
store i32 0, i32* %3
store i32 %0, i32* %4
store i8** %1, i8*** %5
store double 0.000000e+00, double* %7
%8 = load double, double* %7
%9 = load double, double* %7
%10 = fcmp oeq double %8, %9
%11 = zext i1 %10 to i32
store i32 %11, i32* %6
%12 = load double, double* %7
%13 = load double, double* %7
%14 = fcmp une double %12, %13
%15 = zext i1 %14 to i32
store i32 %15, i32* %6
%16 = load double, double* %7
%17 = load double, double* %7
%18 = fcmp ogt double %16, %17
%19 = zext i1 %18 to i32
store i32 %19, i32* %6
%20 = load double, double* %7
%21 = load double, double* %7
%22 = fcmp oge double %20, %21
%23 = zext i1 %22 to i32
store i32 %23, i32* %6
%24 = load double, double* %7
%25 = load double, double* %7
%26 = fcmp olt double %24, %25
%27 = zext i1 %26 to i32
store i32 %27, i32* %6
%28 = load double, double* %7
%29 = load double, double* %7
%30 = fcmp ole double %28, %29
%31 = zext i1 %30 to i32
store i32 %31, i32* %6
%32 = load double, double* %7
%33 = fcmp oeq double %32, 0.000000e+00
%34 = zext i1 %33 to i32
store i32 %34, i32* %6
%35 = load double, double* %7
%36 = fcmp une double %35, 0.000000e+00
%37 = zext i1 %36 to i32
store i32 %37, i32* %6
%38 = load double, double* %7
%39 = fcmp ogt double %38, 0.000000e+00
%40 = zext i1 %39 to i32
store i32 %40, i32* %6
%41 = load double, double* %7
%42 = fcmp oge double %41, 0.000000e+00
%43 = zext i1 %42 to i32
store i32 %43, i32* %6
%44 = load double, double* %7
%45 = fcmp olt double %44, 0.000000e+00
%46 = zext i1 %45 to i32
store i32 %46, i32* %6
%47 = load double, double* %7
%48 = fcmp ole double %47, 0.000000e+00
%49 = zext i1 %48 to i32
store i32 %49, i32* %6
%50 = load double, double* %7
%51 = fcmp oeq double 0.000000e+00, %50
%52 = zext i1 %51 to i32
store i32 %52, i32* %6
%53 = load double, double* %7
%54 = fcmp une double 0.000000e+00, %53
%55 = zext i1 %54 to i32
store i32 %55, i32* %6
%56 = load double, double* %7
%57 = fcmp ogt double 0.000000e+00, %56
%58 = zext i1 %57 to i32
store i32 %58, i32* %6
%59 = load double, double* %7
%60 = fcmp oge double 0.000000e+00, %59
%61 = zext i1 %60 to i32
store i32 %61, i32* %6
%62 = load double, double* %7
%63 = fcmp olt double 0.000000e+00, %62
%64 = zext i1 %63 to i32
store i32 %64, i32* %6
%65 = load double, double* %7
%66 = fcmp ole double 0.000000e+00, %65
%67 = zext i1 %66 to i32
store i32 %67, i32* %6
store i32 1, i32* %6
store i32 0, i32* %6
store i32 0, i32* %6
store i32 1, i32* %6
store i32 0, i32* %6
store i32 1, i32* %6
%68 = load double, double* %7
%69 = fcmp une double %68, 0.000000e+00
%70 = xor i1 %69, true
%71 = zext i1 %70 to i32
store i32 %71, i32* %6
ret i32 0
}

LLVM IR (-O2):
define i32 @main(i32 %0, i8** nocapture readnone %1) {
ret i32 0
}