double pradice(double b, double r) {
  double e, c, d, base;
  c = 1;
  while (2 < 3) {
    base = r;
    for (e = 1; base > 0; e *= c, base--)
      ;
    d = c;
    c = c + 0.0001;
    if (e >= b || c >= b)
      break;
  }
  return d;
}


x86 assembly (clang, -O0):
<pradice>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  0xeea(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xed3(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x30(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    116f <pradice+0x6f>
jmp    1149 <pradice+0x49>
movsd  -0x20(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  0xeb0(%rip),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1132 <pradice+0x32>
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xe87(%rip),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x18(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
jae    11ab <pradice+0xab>
movsd  -0x20(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
jb     11b0 <pradice+0xb0>
jmp    11b5 <pradice+0xb5>
jmp    111b <pradice+0x1b>
movsd  -0x28(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<pradice>:
movsd  0xef8(%rip),%xmm3
xorpd  %xmm4,%xmm4
movsd  0xef4(%rip),%xmm5
movsd  0xef3(%rip),%xmm8
movapd %xmm3,%xmm6
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movapd %xmm6,%xmm2
ucomisd %xmm4,%xmm1
movapd %xmm3,%xmm7
jbe    115e <pradice+0x5e>
movapd %xmm1,%xmm6
movapd %xmm3,%xmm7
cs nopw 0x0(%rax,%rax,1)
mulsd  %xmm2,%xmm7
addsd  %xmm5,%xmm6
ucomisd %xmm4,%xmm6
ja     1150 <pradice+0x50>
movapd %xmm2,%xmm6
addsd  %xmm8,%xmm6
ucomisd %xmm0,%xmm7
jae    1173 <pradice+0x73>
ucomisd %xmm0,%xmm6
jb     1130 <pradice+0x30>
movapd %xmm2,%xmm0
ret

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

LLVM IR (-O2):
define double @pradice(double %0, double %1) {
%3 = fcmp ogt double %1, 0.000000e+00
br label %4
4: ; preds = %12, %2
%5 = phi double [ 1.000000e+00, %2 ], [ %14, %12 ]
br i1 %3, label %6, label %12
6: ; preds = %4, %6
%7 = phi double [ %10, %6 ], [ %1, %4 ]
%8 = phi double [ %9, %6 ], [ 1.000000e+00, %4 ]
%9 = fmul double %5, %8
%10 = fadd double %7, -1.000000e+00
%11 = fcmp ogt double %10, 0.000000e+00
br i1 %11, label %6, label %12
12: ; preds = %6, %4
%13 = phi double [ 1.000000e+00, %4 ], [ %9, %6 ]
%14 = fadd double %5, 1.000000e-04
%15 = fcmp ult double %13, %0
%16 = fcmp ult double %14, %0
%17 = select i1 %15, i1 %16, i1 false
br i1 %17, label %4, label %18
18: ; preds = %12
ret double %5
}