double casoTres(double a, double b, double c) {
  double f;
  double d = (a * b) + 5;
  f = a + (d * c);
  double r = b * b;
  if (r > f) {
    r = r + f;
  } else {
    r = r * 2.75;
    f++;
  }
  double k = r - f;
  double s = k + b;
  if (s > 5 * b) {
    r = r + f;
  } else {
    r = r * 2.75;
    f--;
  }
  return f * s + r;
}


x86 assembly (clang, -O0):
<casoTres>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xed7(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x8(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    1181 <casoTres+0x81>
movsd  -0x30(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    11a5 <casoTres+0xa5>
movsd  0xe87(%rip),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xe6d(%rip),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x30(%rbp),%xmm0
subsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
addsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  0xe30(%rip),%xmm1
mulsd  -0x10(%rbp),%xmm1
ucomisd %xmm1,%xmm0
jbe    11f3 <casoTres+0xf3>
movsd  -0x30(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1217 <casoTres+0x117>
movsd  0xe15(%rip),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xe0b(%rip),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<casoTres>:
movapd %xmm0,%xmm4
mulsd  %xmm1,%xmm4
movsd  0xef0(%rip),%xmm3
addsd  %xmm3,%xmm4
mulsd  %xmm2,%xmm4
addsd  %xmm0,%xmm4
movapd %xmm1,%xmm6
mulsd  %xmm1,%xmm6
ucomisd %xmm4,%xmm6
movsd  0xed8(%rip),%xmm2
movsd  0xed8(%rip),%xmm7
addsd  %xmm4,%xmm7
movapd %xmm6,%xmm5
ja     1148 <casoTres+0x48>
mulsd  %xmm2,%xmm5
jmp    114c <casoTres+0x4c>
addsd  %xmm4,%xmm5
movapd %xmm4,%xmm0
cmpltsd %xmm6,%xmm0
andpd  %xmm0,%xmm4
andnpd %xmm7,%xmm0
orpd   %xmm4,%xmm0
movapd %xmm5,%xmm4
subsd  %xmm0,%xmm4
addsd  %xmm1,%xmm4
mulsd  %xmm1,%xmm3
ucomisd %xmm3,%xmm4
movapd %xmm5,%xmm1
addsd  %xmm0,%xmm1
mulsd  %xmm5,%xmm2
cmpltsd %xmm4,%xmm3
andpd  %xmm3,%xmm1
andnpd %xmm2,%xmm3
orpd   %xmm1,%xmm3
ja     119c <casoTres+0x9c>
addsd  0xe7c(%rip),%xmm0
mulsd  %xmm4,%xmm0
addsd  %xmm3,%xmm0
ret

LLVM IR (-O0):
define double @casoTres(double %0, double %1, double %2) {
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
store double %0, double* %4
store double %1, double* %5
store double %2, double* %6
%12 = load double, double* %4
%13 = load double, double* %5
%14 = call double @llvm.fmuladd.f64(double %12, double %13, double 5.000000e+00)
store double %14, double* %8
%15 = load double, double* %4
%16 = load double, double* %8
%17 = load double, double* %6
%18 = call double @llvm.fmuladd.f64(double %16, double %17, double %15)
store double %18, double* %7
%19 = load double, double* %5
%20 = load double, double* %5
%21 = fmul double %19, %20
store double %21, double* %9
%22 = load double, double* %9
%23 = load double, double* %7
%24 = fcmp ogt double %22, %23
br i1 %24, label %25, label %29
25: ; preds = %3
%26 = load double, double* %9
%27 = load double, double* %7
%28 = fadd double %26, %27
store double %28, double* %9
br label %34
29: ; preds = %3
%30 = load double, double* %9
%31 = fmul double %30, 2.750000e+00
store double %31, double* %9
%32 = load double, double* %7
%33 = fadd double %32, 1.000000e+00
store double %33, double* %7
br label %34
34: ; preds = %29, %25
%35 = load double, double* %9
%36 = load double, double* %7
%37 = fsub double %35, %36
store double %37, double* %10
%38 = load double, double* %10
%39 = load double, double* %5
%40 = fadd double %38, %39
store double %40, double* %11
%41 = load double, double* %11
%42 = load double, double* %5
%43 = fmul double 5.000000e+00, %42
%44 = fcmp ogt double %41, %43
br i1 %44, label %45, label %49
45: ; preds = %34
%46 = load double, double* %9
%47 = load double, double* %7
%48 = fadd double %46, %47
store double %48, double* %9
br label %54
49: ; preds = %34
%50 = load double, double* %9
%51 = fmul double %50, 2.750000e+00
store double %51, double* %9
%52 = load double, double* %7
%53 = fadd double %52, -1.000000e+00
store double %53, double* %7
br label %54
54: ; preds = %49, %45
%55 = load double, double* %7
%56 = load double, double* %11
%57 = load double, double* %9
%58 = call double @llvm.fmuladd.f64(double %55, double %56, double %57)
ret double %58
}

LLVM IR (-O2):
define double @casoTres(double %0, double %1, double %2) {
%4 = tail call double @llvm.fmuladd.f64(double %0, double %1, double 5.000000e+00)
%5 = tail call double @llvm.fmuladd.f64(double %4, double %2, double %0)
%6 = fmul double %1, %1
%7 = fcmp ogt double %6, %5
%8 = fadd double %6, %5
%9 = fmul double %6, 2.750000e+00
%10 = fadd double %5, 1.000000e+00
%11 = select i1 %7, double %8, double %9
%12 = select i1 %7, double %5, double %10
%13 = fsub double %11, %12
%14 = fadd double %13, %1
%15 = fmul double %1, 5.000000e+00
%16 = fcmp ogt double %14, %15
%17 = fadd double %11, %12
%18 = fmul double %11, 2.750000e+00
%19 = fadd double %12, -1.000000e+00
%20 = select i1 %16, double %17, double %18
%21 = select i1 %16, double %12, double %19
%22 = tail call double @llvm.fmuladd.f64(double %21, double %14, double %20)
ret double %22
}