int main(void) {
  double _Complex a = 5;
  double _Complex b = 42;
  return a * b != b * a;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0xc0,%rsp
movl   $0x0,-0x4(%rbp)
movsd  0xeee(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xed1(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x18(%rbp),%xmm1
movsd  %xmm1,-0x68(%rbp)
movsd  -0x10(%rbp),%xmm2
movsd  %xmm2,-0x60(%rbp)
movsd  -0x28(%rbp),%xmm4
movsd  %xmm4,-0x58(%rbp)
movsd  -0x20(%rbp),%xmm5
movsd  %xmm5,-0x50(%rbp)
movaps %xmm1,%xmm0
mulsd  %xmm4,%xmm0
movaps %xmm2,%xmm3
mulsd  %xmm5,%xmm3
mulsd  %xmm5,%xmm1
mulsd  %xmm4,%xmm2
subsd  %xmm3,%xmm0
movsd  %xmm0,-0x48(%rbp)
addsd  %xmm2,%xmm1
movsd  %xmm1,-0x40(%rbp)
ucomisd %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  %xmm1,-0x30(%rbp)
jnp    11e1 <main+0xe1>
movsd  -0x40(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm0
ucomisd %xmm1,%xmm1
movsd  %xmm0,-0x38(%rbp)
movsd  %xmm1,-0x30(%rbp)
jnp    11e1 <main+0xe1>
movsd  -0x50(%rbp),%xmm3
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
movsd  -0x68(%rbp),%xmm0
call   1300 <__muldc3>
movsd  %xmm0,-0x38(%rbp)
movsd  %xmm1,-0x30(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
movsd  %xmm1,-0xb8(%rbp)
ff
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0x28(%rbp),%xmm1
movsd  %xmm1,-0xa8(%rbp)
ff
movsd  -0x20(%rbp),%xmm2
movsd  %xmm2,-0xa0(%rbp)
ff
movsd  -0x18(%rbp),%xmm4
movsd  %xmm4,-0x98(%rbp)
ff
movsd  -0x10(%rbp),%xmm5
movsd  %xmm5,-0x90(%rbp)
ff
movaps %xmm1,%xmm0
mulsd  %xmm4,%xmm0
movaps %xmm2,%xmm3
mulsd  %xmm5,%xmm3
mulsd  %xmm5,%xmm1
mulsd  %xmm4,%xmm2
subsd  %xmm3,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
addsd  %xmm2,%xmm1
movsd  %xmm1,-0x80(%rbp)
ucomisd %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  %xmm1,-0x70(%rbp)
jnp    12be <main+0x1be>
movsd  -0x80(%rbp),%xmm1
movsd  -0x88(%rbp),%xmm0
ff
ucomisd %xmm1,%xmm1
movsd  %xmm0,-0x78(%rbp)
movsd  %xmm1,-0x70(%rbp)
jnp    12be <main+0x1be>
movsd  -0x90(%rbp),%xmm3
ff
movsd  -0x98(%rbp),%xmm2
ff
movsd  -0xa0(%rbp),%xmm1
ff
movsd  -0xa8(%rbp),%xmm0
ff
call   1300 <__muldc3>
movsd  %xmm0,-0x78(%rbp)
movsd  %xmm1,-0x70(%rbp)
movsd  -0xb8(%rbp),%xmm0
ff
movsd  -0xb0(%rbp),%xmm2
ff
movsd  -0x78(%rbp),%xmm3
movsd  -0x70(%rbp),%xmm1
ucomisd %xmm3,%xmm2
setne  %al
setp   %cl
or     %cl,%al
ucomisd %xmm1,%xmm0
setne  %cl
setp   %dl
or     %dl,%cl
or     %cl,%al
and    $0x1,%al
movzbl %al,%eax
add    $0xc0,%rsp
pop    %rbp
ret

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

LLVM IR (-O0):
define i32 @main() {
%1 = alloca i32
%2 = alloca { double, double }
%3 = alloca { double, double }
store i32 0, i32* %1
%4 = getelementptr inbounds { double, double }, { double, double }* %2, i32 0, i32 0
%5 = getelementptr inbounds { double, double }, { double, double }* %2, i32 0, i32 1
store double 5.000000e+00, double* %4
store double 0.000000e+00, double* %5
%6 = getelementptr inbounds { double, double }, { double, double }* %3, i32 0, i32 0
%7 = getelementptr inbounds { double, double }, { double, double }* %3, i32 0, i32 1
store double 4.200000e+01, double* %6
store double 0.000000e+00, double* %7
%8 = getelementptr inbounds { double, double }, { double, double }* %2, i32 0, i32 0
%9 = load double, double* %8
%10 = getelementptr inbounds { double, double }, { double, double }* %2, i32 0, i32 1
%11 = load double, double* %10
%12 = getelementptr inbounds { double, double }, { double, double }* %3, i32 0, i32 0
%13 = load double, double* %12
%14 = getelementptr inbounds { double, double }, { double, double }* %3, i32 0, i32 1
%15 = load double, double* %14
%16 = fmul double %9, %13
%17 = fmul double %11, %15
%18 = fmul double %9, %15
%19 = fmul double %11, %13
%20 = fsub double %16, %17
%21 = fadd double %18, %19
%22 = fcmp uno double %20, %20
br i1 %22, label %23, label %29
23: ; preds = %0
%24 = fcmp uno double %21, %21
br i1 %24, label %25, label %29
25: ; preds = %23
%26 = call { double, double } @__muldc3(double %9, double %11, double %13, double %15)
%27 = extractvalue { double, double } %26, 0
%28 = extractvalue { double, double } %26, 1
br label %29
29: ; preds = %25, %23, %0
%30 = phi double [ %20, %0 ], [ %20, %23 ], [ %27, %25 ]
%31 = phi double [ %21, %0 ], [ %21, %23 ], [ %28, %25 ]
%32 = getelementptr inbounds { double, double }, { double, double }* %3, i32 0, i32 0
%33 = load double, double* %32
%34 = getelementptr inbounds { double, double }, { double, double }* %3, i32 0, i32 1
%35 = load double, double* %34
%36 = getelementptr inbounds { double, double }, { double, double }* %2, i32 0, i32 0
%37 = load double, double* %36
%38 = getelementptr inbounds { double, double }, { double, double }* %2, i32 0, i32 1
%39 = load double, double* %38
%40 = fmul double %33, %37
%41 = fmul double %35, %39
%42 = fmul double %33, %39
%43 = fmul double %35, %37
%44 = fsub double %40, %41
%45 = fadd double %42, %43
%46 = fcmp uno double %44, %44
br i1 %46, label %47, label %53
47: ; preds = %29
%48 = fcmp uno double %45, %45
br i1 %48, label %49, label %53
49: ; preds = %47
%50 = call { double, double } @__muldc3(double %33, double %35, double %37, double %39)
%51 = extractvalue { double, double } %50, 0
%52 = extractvalue { double, double } %50, 1
br label %53
53: ; preds = %49, %47, %29
%54 = phi double [ %44, %29 ], [ %44, %47 ], [ %51, %49 ]
%55 = phi double [ %45, %29 ], [ %45, %47 ], [ %52, %49 ]
%56 = fcmp une double %30, %54
%57 = fcmp une double %31, %55
%58 = or i1 %56, %57
%59 = zext i1 %58 to i32
ret i32 %59
}

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