double count(double a, double b, double c, double d, double x, double y) {
  a *= x;
  b *= x;
  c *= y;
  d *= y;
  if (a == c)
    return 0;
  else
    return (b - d) / (a - c);
}


x86 assembly (clang, -O0):
<count>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x20(%rbp)
movsd  %xmm3,-0x28(%rbp)
movsd  %xmm4,-0x30(%rbp)
movsd  %xmm5,-0x38(%rbp)
movsd  -0x30(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x30(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x38(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x38(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x10(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jne    1181 <count+0x81>
jp     1181 <count+0x81>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    119e <count+0x9e>
movsd  -0x18(%rbp),%xmm0
subsd  -0x28(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
subsd  -0x20(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<count>:
mulsd  %xmm4,%xmm0
mulsd  %xmm5,%xmm2
xorps  %xmm6,%xmm6
ucomisd %xmm2,%xmm0
jne    1117 <count+0x17>
jp     1117 <count+0x17>
movaps %xmm6,%xmm0
ret
mulsd  %xmm5,%xmm3
mulsd  %xmm4,%xmm1
subsd  %xmm3,%xmm1
subsd  %xmm2,%xmm0
divsd  %xmm0,%xmm1
movapd %xmm1,%xmm6
movapd %xmm6,%xmm0
ret

LLVM IR (-O0):
define double @count(double %0, double %1, double %2, double %3, double %4, double %5) {
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
store double %0, double* %8
store double %1, double* %9
store double %2, double* %10
store double %3, double* %11
store double %4, double* %12
store double %5, double* %13
%14 = load double, double* %12
%15 = load double, double* %8
%16 = fmul double %15, %14
store double %16, double* %8
%17 = load double, double* %12
%18 = load double, double* %9
%19 = fmul double %18, %17
store double %19, double* %9
%20 = load double, double* %13
%21 = load double, double* %10
%22 = fmul double %21, %20
store double %22, double* %10
%23 = load double, double* %13
%24 = load double, double* %11
%25 = fmul double %24, %23
store double %25, double* %11
%26 = load double, double* %8
%27 = load double, double* %10
%28 = fcmp oeq double %26, %27
br i1 %28, label %29, label %30
29: ; preds = %6
store double 0.000000e+00, double* %7
br label %38
30: ; preds = %6
%31 = load double, double* %9
%32 = load double, double* %11
%33 = fsub double %31, %32
%34 = load double, double* %8
%35 = load double, double* %10
%36 = fsub double %34, %35
%37 = fdiv double %33, %36
store double %37, double* %7
br label %38
38: ; preds = %30, %29
%39 = load double, double* %7
ret double %39
}

LLVM IR (-O2):
define double @count(double %0, double %1, double %2, double %3, double %4, double %5) {
%7 = fmul double %0, %4
%8 = fmul double %2, %5
%9 = fcmp oeq double %7, %8
br i1 %9, label %16, label %10
10: ; preds = %6
%11 = fmul double %3, %5
%12 = fmul double %1, %4
%13 = fsub double %12, %11
%14 = fsub double %7, %8
%15 = fdiv double %13, %14
br label %16
16: ; preds = %6, %10
%17 = phi double [ %15, %10 ], [ 0.000000e+00, %6 ]
ret double %17
}