double solve(double rate, double farm_cost, double farm_rate, double cap) {
  double time_no_buy;
  double time_buy;
  double ret = 0;
  if (rate < 2)
    goto out;
  if (farm_cost < 1 || farm_cost > 10000)
    goto out;
  if (farm_rate < 1 || farm_rate > 100)
    goto out;
  if (cap < 1 || cap > 100000)
    goto out;
  time_no_buy = cap / rate;
  time_buy = farm_cost / rate;
  time_buy += (cap / (rate + farm_rate));
  while (time_no_buy > time_buy) {
    ret += farm_cost / rate;
    rate += farm_rate;
    time_no_buy = cap / rate;
    time_buy = farm_cost / rate;
    time_buy += (cap / (rate + farm_rate));
  }
  ret += time_no_buy;
out:
  return ret;
}


x86 assembly (clang, -O0):
<solve>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xed8(%rip),%xmm0
ucomisd -0x8(%rbp),%xmm0
jbe    1138 <solve+0x38>
jmp    1282 <solve+0x182>
movsd  0xec8(%rip),%xmm0
ucomisd -0x10(%rbp),%xmm0
ja     1162 <solve+0x62>
movsd  -0x10(%rbp),%xmm0
movsd  0xeb8(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1167 <solve+0x67>
jmp    1282 <solve+0x182>
movsd  0xe99(%rip),%xmm0
ucomisd -0x18(%rbp),%xmm0
ja     1191 <solve+0x91>
movsd  -0x18(%rbp),%xmm0
movsd  0xe91(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1196 <solve+0x96>
jmp    1282 <solve+0x182>
movsd  0xe6a(%rip),%xmm0
ucomisd -0x20(%rbp),%xmm0
ja     11c0 <solve+0xc0>
movsd  -0x20(%rbp),%xmm0
movsd  0xe6a(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11c5 <solve+0xc5>
jmp    1282 <solve+0x182>
movsd  -0x20(%rbp),%xmm0
divsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x10(%rbp),%xmm0
divsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  -0x8(%rbp),%xmm1
addsd  -0x18(%rbp),%xmm1
divsd  %xmm1,%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x28(%rbp),%xmm0
ucomisd -0x30(%rbp),%xmm0
jbe    1273 <solve+0x173>
movsd  -0x10(%rbp),%xmm0
divsd  -0x8(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x18(%rbp),%xmm0
addsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x20(%rbp),%xmm0
divsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x10(%rbp),%xmm0
divsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  -0x8(%rbp),%xmm1
addsd  -0x18(%rbp),%xmm1
divsd  %xmm1,%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1200 <solve+0x100>
movsd  -0x28(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<solve>:
movapd %xmm0,%xmm4
xorpd  %xmm0,%xmm0
movsd  0xef0(%rip),%xmm5
ucomisd %xmm4,%xmm5
ja     11f6 <solve+0xf6>
movsd  0xee6(%rip),%xmm5
ucomisd %xmm1,%xmm5
ja     11f6 <solve+0xf6>
ucomisd 0xedc(%rip),%xmm1
ja     11f6 <solve+0xf6>
ucomisd %xmm2,%xmm5
ja     11f6 <solve+0xf6>
ucomisd 0xecc(%rip),%xmm2
ja     11f6 <solve+0xf6>
ucomisd %xmm3,%xmm5
ja     11f6 <solve+0xf6>
ucomisd 0xebc(%rip),%xmm3
ja     11f6 <solve+0xf6>
movapd %xmm4,%xmm0
addsd  %xmm2,%xmm0
movapd %xmm1,%xmm5
unpcklpd %xmm3,%xmm5
movapd %xmm4,%xmm6
unpcklpd %xmm0,%xmm6
movapd %xmm5,%xmm0
divpd  %xmm6,%xmm0
movapd %xmm0,%xmm7
unpckhpd %xmm0,%xmm7
addsd  %xmm0,%xmm7
movapd %xmm3,%xmm6
divsd  %xmm4,%xmm6
xorpd  %xmm0,%xmm0
ucomisd %xmm7,%xmm6
jbe    11f2 <solve+0xf2>
xorpd  %xmm0,%xmm0
nopl   0x0(%rax)
movapd %xmm1,%xmm6
divsd  %xmm4,%xmm6
addsd  %xmm6,%xmm0
addsd  %xmm2,%xmm4
movapd %xmm4,%xmm6
addsd  %xmm2,%xmm6
movapd %xmm4,%xmm7
unpcklpd %xmm6,%xmm7
movapd %xmm5,%xmm6
divpd  %xmm7,%xmm6
movapd %xmm6,%xmm7
unpckhpd %xmm6,%xmm7
addsd  %xmm6,%xmm7
movapd %xmm3,%xmm6
divsd  %xmm4,%xmm6
ucomisd %xmm7,%xmm6
ja     11b0 <solve+0xb0>
addsd  %xmm6,%xmm0
ret

LLVM IR (-O0):
define double @solve(double %0, double %1, double %2, double %3) {
%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* %5
store double %1, double* %6
store double %2, double* %7
store double %3, double* %8
store double 0.000000e+00, double* %11
%12 = load double, double* %5
%13 = fcmp olt double %12, 2.000000e+00
br i1 %13, label %14, label %15
14: ; preds = %4
br label %80
15: ; preds = %4
%16 = load double, double* %6
%17 = fcmp olt double %16, 1.000000e+00
br i1 %17, label %21, label %18
18: ; preds = %15
%19 = load double, double* %6
%20 = fcmp ogt double %19, 1.000000e+04
br i1 %20, label %21, label %22
21: ; preds = %18, %15
br label %80
22: ; preds = %18
%23 = load double, double* %7
%24 = fcmp olt double %23, 1.000000e+00
br i1 %24, label %28, label %25
25: ; preds = %22
%26 = load double, double* %7
%27 = fcmp ogt double %26, 1.000000e+02
br i1 %27, label %28, label %29
28: ; preds = %25, %22
br label %80
29: ; preds = %25
%30 = load double, double* %8
%31 = fcmp olt double %30, 1.000000e+00
br i1 %31, label %35, label %32
32: ; preds = %29
%33 = load double, double* %8
%34 = fcmp ogt double %33, 1.000000e+05
br i1 %34, label %35, label %36
35: ; preds = %32, %29
br label %80
36: ; preds = %32
%37 = load double, double* %8
%38 = load double, double* %5
%39 = fdiv double %37, %38
store double %39, double* %9
%40 = load double, double* %6
%41 = load double, double* %5
%42 = fdiv double %40, %41
store double %42, double* %10
%43 = load double, double* %8
%44 = load double, double* %5
%45 = load double, double* %7
%46 = fadd double %44, %45
%47 = fdiv double %43, %46
%48 = load double, double* %10
%49 = fadd double %48, %47
store double %49, double* %10
br label %50
50: ; preds = %54, %36
%51 = load double, double* %9
%52 = load double, double* %10
%53 = fcmp ogt double %51, %52
br i1 %53, label %54, label %76
54: ; preds = %50
%55 = load double, double* %6
%56 = load double, double* %5
%57 = fdiv double %55, %56
%58 = load double, double* %11
%59 = fadd double %58, %57
store double %59, double* %11
%60 = load double, double* %7
%61 = load double, double* %5
%62 = fadd double %61, %60
store double %62, double* %5
%63 = load double, double* %8
%64 = load double, double* %5
%65 = fdiv double %63, %64
store double %65, double* %9
%66 = load double, double* %6
%67 = load double, double* %5
%68 = fdiv double %66, %67
store double %68, double* %10
%69 = load double, double* %8
%70 = load double, double* %5
%71 = load double, double* %7
%72 = fadd double %70, %71
%73 = fdiv double %69, %72
%74 = load double, double* %10
%75 = fadd double %74, %73
store double %75, double* %10
br label %50
76: ; preds = %50
%77 = load double, double* %9
%78 = load double, double* %11
%79 = fadd double %78, %77
store double %79, double* %11
br label %80
80: ; preds = %76, %35, %28, %21, %14
%81 = load double, double* %11
ret double %81
}

LLVM IR (-O2):
define double @solve(double %0, double %1, double %2, double %3) {
%5 = fcmp olt double %0, 2.000000e+00
br i1 %5, label %49, label %6
6: ; preds = %4
%7 = fcmp olt double %1, 1.000000e+00
%8 = fcmp ogt double %1, 1.000000e+04
%9 = or i1 %7, %8
br i1 %9, label %49, label %10
10: ; preds = %6
%11 = fcmp olt double %2, 1.000000e+00
%12 = fcmp ogt double %2, 1.000000e+02
%13 = or i1 %11, %12
br i1 %13, label %49, label %14
14: ; preds = %10
%15 = fcmp olt double %3, 1.000000e+00
%16 = fcmp ogt double %3, 1.000000e+05
%17 = or i1 %15, %16
br i1 %17, label %49, label %18
18: ; preds = %14
%19 = fadd double %0, %2
%20 = insertelement <2 x double> poison, double %1, i64 0
%21 = insertelement <2 x double> %20, double %3, i64 1
%22 = insertelement <2 x double> poison, double %0, i64 0
%23 = insertelement <2 x double> %22, double %19, i64 1
%24 = fdiv <2 x double> %21, %23
%25 = shufflevector <2 x double> %24, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%26 = fadd <2 x double> %24, %25
%27 = extractelement <2 x double> %26, i64 0
%28 = fdiv double %3, %0
%29 = fcmp ogt double %28, %27
br i1 %29, label %30, label %45
30: ; preds = %18, %30
%31 = phi double [ %34, %30 ], [ 0.000000e+00, %18 ]
%32 = phi double [ %35, %30 ], [ %0, %18 ]
%33 = fdiv double %1, %32
%34 = fadd double %33, %31
%35 = fadd double %32, %2
%36 = fadd double %35, %2
%37 = insertelement <2 x double> poison, double %35, i64 0
%38 = insertelement <2 x double> %37, double %36, i64 1
%39 = fdiv <2 x double> %21, %38
%40 = shufflevector <2 x double> %39, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%41 = fadd <2 x double> %39, %40
%42 = extractelement <2 x double> %41, i64 0
%43 = fdiv double %3, %35
%44 = fcmp ogt double %43, %42
br i1 %44, label %30, label %45
45: ; preds = %30, %18
%46 = phi double [ 0.000000e+00, %18 ], [ %34, %30 ]
%47 = phi double [ %28, %18 ], [ %43, %30 ]
%48 = fadd double %47, %46
br label %49
49: ; preds = %14, %10, %6, %4, %45
%50 = phi double [ 0.000000e+00, %4 ], [ 0.000000e+00, %6 ], [ 0.000000e+00, %10 ], [ 0.000000e+00, %14 ], [ %48, %45 ]
ret double %50
}