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


x86 assembly (clang, -O0):
<casoCuatro>:
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
subsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
addsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x30(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    119f <casoCuatro+0x9f>
movsd  -0x30(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    121c <casoCuatro+0x11c>
movsd  0xe69(%rip),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xe4f(%rip),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  0xe30(%rip),%xmm1
mulsd  -0x10(%rbp),%xmm1
ucomisd %xmm1,%xmm0
jbe    11f3 <casoCuatro+0xf3>
movsd  -0x30(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1217 <casoCuatro+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)
jmp    121c <casoCuatro+0x11c>
movsd  -0x20(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<casoCuatro>:
movapd %xmm0,%xmm3
mulsd  %xmm1,%xmm0
addsd  0xef0(%rip),%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm3,%xmm0
movapd %xmm1,%xmm2
mulsd  %xmm1,%xmm2
movapd %xmm2,%xmm3
subsd  %xmm0,%xmm3
ucomisd %xmm0,%xmm2
ja     1154 <casoCuatro+0x54>
movapd %xmm3,%xmm4
addsd  %xmm1,%xmm4
mulsd  0xeca(%rip),%xmm2
addsd  0xeca(%rip),%xmm0
mulsd  0xeb2(%rip),%xmm1
ucomisd %xmm1,%xmm4
jbe    115a <casoCuatro+0x5a>
addsd  %xmm0,%xmm2
jmp    116a <casoCuatro+0x6a>
mulsd  0xea6(%rip),%xmm2
addsd  0xeae(%rip),%xmm0
mulsd  %xmm3,%xmm0
addsd  %xmm2,%xmm0
ret

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