double sqrt(x)
double x;
{
  double q, s, b, r;
  double t;
  double const zero = 0.0;
  int m, n, i;
  int k = 51;
  if (x != x || x == zero)
    return (x);
  if (x < zero) {
    return (zero / zero);
  }
  if (!finite(x))
    return (x);
  n = (int)logb(x);
  x = scalb(x, -n);
  if ((m = (int)logb(x)) != 0)
    x = scalb(x, -m);
  m += n;
  n = m / 2;
  if ((n + n) != m) {
    x *= 2;
    m -= 1;
    n = m / 2;
  }
  q = 1.0;
  s = 4.0;
  x -= 1.0;
  r = 1;
  for (i = 1; i <= k; i++) {
    t = s + 1;
    x *= 4;
    r /= 2;
    if (t <= x) {
      s = t + t + 2, x -= t;
      q += r;
    } else
      s *= 2;
  }
  r /= 2;
  x *= 4;
  if (x == zero)
    goto end;
  t = 100 + r;
  if (s < x) {
    q += r;
    x -= s;
    s += 2;
    s *= 2;
    x *= 4;
    t = (x - s) - 5;
    b = 1.0 + 3 * r / 4;
    if (b == 1.0)
      goto end;
    b = 1.0 + r / 4;
    if (b > 1.0)
      t = 1;
    if (t >= 0)
      q += r;
  } else {
    s *= 2;
    x *= 4;
    t = (x - s) - 1;
    b = 1.0 + 3 * r / 4;
    if (b == 1.0)
      goto end;
    b = 1.0 + r / 4;
    if (b > 1.0)
      t = 1;
    if (t >= 0)
      q += r;
  }
end:
  return (scalb(q, n));
}


x86 assembly (clang, -O0):
<sqrt>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movsd  %xmm0,-0x10(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x33,-0x50(%rbp)
movsd  -0x10(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
jne    116a <sqrt+0x4a>
jp     116a <sqrt+0x4a>
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1179 <sqrt+0x59>
jp     1179 <sqrt+0x59>
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1627 <sqrt+0x507>
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    1199 <sqrt+0x79>
movsd  0xea9(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1627 <sqrt+0x507>
movsd  -0x10(%rbp),%xmm0
movaps 0xe9b(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  0xe4f(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    11ca <sqrt+0xaa>
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1627 <sqrt+0x507>
movsd  -0x10(%rbp),%xmm0
call   1030 <logb@plt>
cvttsd2si %xmm0,%eax
mov    %eax,-0x48(%rbp)
movsd  -0x10(%rbp),%xmm0
xor    %edi,%edi
sub    -0x48(%rbp),%edi
mov    $0x1,%al
call   1040 <scalb@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
call   1030 <logb@plt>
cvttsd2si %xmm0,%eax
mov    %eax,-0x44(%rbp)
cmp    $0x0,%eax
je     1229 <sqrt+0x109>
movsd  -0x10(%rbp),%xmm0
xor    %edi,%edi
sub    -0x44(%rbp),%edi
mov    $0x1,%al
call   1040 <scalb@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x48(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%eax
add    -0x48(%rbp),%eax
cmp    -0x44(%rbp),%eax
je     1278 <sqrt+0x158>
movsd  0xdb1(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x44(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x48(%rbp)
movsd  0xd90(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  0xd8b(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xd71(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xd60(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x1,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x50(%rbp),%eax
jg     137d <sqrt+0x25d>
movsd  0xd40(%rip),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xd36(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  0xd0f(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x38(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     1358 <sqrt+0x238>
movsd  -0x38(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  0xce0(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x38(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x30(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
jmp    136a <sqrt+0x24a>
movsd  0xca8(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    136f <sqrt+0x24f>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    12bc <sqrt+0x19c>
movsd  -0x30(%rbp),%xmm0
movsd  0xc7e(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xc7d(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    13c2 <sqrt+0x2a2>
jp     13c2 <sqrt+0x2a2>
jmp    160f <sqrt+0x4ef>
movsd  0xc56(%rip),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x20(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1513 <sqrt+0x3f3>
movsd  -0x30(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x20(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xbf6(%rip),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xbe4(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xbe2(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
subsd  -0x20(%rbp),%xmm0
movsd  0xbde(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xbc5(%rip),%xmm1
mulsd  -0x30(%rbp),%xmm1
movsd  0xba8(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xb94(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xb7e(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    14a7 <sqrt+0x387>
jp     14a7 <sqrt+0x387>
jmp    160f <sqrt+0x4ef>
movsd  -0x30(%rbp),%xmm1
movsd  0xb64(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xb50(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xb3a(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    14ed <sqrt+0x3cd>
movsd  0xb28(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     150e <sqrt+0x3ee>
movsd  -0x30(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
jmp    160a <sqrt+0x4ea>
movsd  0xaed(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xaeb(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
subsd  -0x20(%rbp),%xmm0
movsd  0xac7(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xace(%rip),%xmm1
mulsd  -0x30(%rbp),%xmm1
movsd  0xab1(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xa9d(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xa87(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    159e <sqrt+0x47e>
jp     159e <sqrt+0x47e>
jmp    160f <sqrt+0x4ef>
movsd  -0x30(%rbp),%xmm1
movsd  0xa6d(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xa59(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xa43(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    15e4 <sqrt+0x4c4>
movsd  0xa31(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1605 <sqrt+0x4e5>
movsd  -0x30(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
jmp    160a <sqrt+0x4ea>
jmp    160f <sqrt+0x4ef>
movsd  -0x18(%rbp),%xmm0
mov    -0x48(%rbp),%edi
mov    $0x1,%al
call   1040 <scalb@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sqrt>:
push   %rbp
push   %rbx
sub    $0x18,%rsp
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
je     12b0 <sqrt+0x190>
ucomisd %xmm0,%xmm1
jbe    1147 <sqrt+0x27>
movsd  0xebe(%rip),%xmm0
jmp    12b0 <sqrt+0x190>
movapd 0xf01(%rip),%xmm1
andpd  %xmm0,%xmm1
ucomisd 0xead(%rip),%xmm1
je     12b0 <sqrt+0x190>
movapd %xmm0,(%rsp)
call   1030 <logb@plt>
cvttsd2si %xmm0,%ebp
mov    %ebp,%edi
neg    %edi
movaps (%rsp),%xmm0
mov    $0x1,%al
call   1040 <scalb@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movapd %xmm0,(%rsp)
call   1030 <logb@plt>
cvttsd2si %xmm0,%ebx
test   %ebx,%ebx
je     11ad <sqrt+0x8d>
mov    %ebx,%edi
neg    %edi
movapd (%rsp),%xmm0
mov    $0x1,%al
call   1040 <scalb@plt>
cvtsi2sd %eax,%xmm6
jmp    11b2 <sqrt+0x92>
movapd (%rsp),%xmm6
add    %ebp,%ebx
mov    %ebx,%edi
shr    $0x1f,%edi
add    %ebx,%edi
mov    %edi,%eax
and    $0xfffffffe,%eax
cmp    %ebx,%eax
je     11d6 <sqrt+0xb6>
addsd  %xmm6,%xmm6
mov    %ebx,%eax
add    $0xffffffff,%eax
shr    $0x1f,%eax
lea    (%rbx,%rax,1),%edi
add    $0xffffffff,%edi
sar    %edi
addsd  0xe30(%rip),%xmm6
movsd  0xe30(%rip),%xmm3
movsd  0xe30(%rip),%xmm4
movsd  0xe30(%rip),%xmm5
mov    $0x32,%eax
movsd  0xe2a(%rip),%xmm8
movapd %xmm5,%xmm1
movapd %xmm4,%xmm7
movapd %xmm3,%xmm0
jmp    122f <sqrt+0x10f>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
addsd  %xmm2,%xmm2
movapd %xmm2,%xmm7
mulsd  %xmm5,%xmm1
add    $0xfffffffe,%eax
movapd %xmm7,%xmm2
addsd  %xmm3,%xmm2
mulsd  %xmm4,%xmm6
ucomisd %xmm2,%xmm6
jae    1250 <sqrt+0x130>
addsd  %xmm7,%xmm7
movapd %xmm7,%xmm2
jmp    1261 <sqrt+0x141>
nopl   0x0(%rax,%rax,1)
subsd  %xmm2,%xmm6
addsd  %xmm2,%xmm2
addsd  %xmm8,%xmm2
addsd  %xmm1,%xmm0
mulsd  %xmm5,%xmm1
test   %eax,%eax
je     128e <sqrt+0x16e>
movapd %xmm2,%xmm7
addsd  %xmm3,%xmm7
mulsd  %xmm4,%xmm6
ucomisd %xmm7,%xmm6
jb     1220 <sqrt+0x100>
subsd  %xmm7,%xmm6
addsd  %xmm7,%xmm7
addsd  %xmm8,%xmm7
addsd  %xmm1,%xmm0
jmp    1228 <sqrt+0x108>
mulsd  0xd8a(%rip),%xmm6
xorpd  %xmm3,%xmm3
ucomisd %xmm3,%xmm6
jne    12b7 <sqrt+0x197>
jp     12b7 <sqrt+0x197>
mov    $0x1,%al
call   1040 <scalb@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
add    $0x18,%rsp
pop    %rbx
pop    %rbp
ret
ucomisd %xmm2,%xmm6
jbe    130f <sqrt+0x1ef>
addsd  %xmm1,%xmm0
movsd  0xd6f(%rip),%xmm4
mulsd  %xmm1,%xmm4
mulsd  0xd6b(%rip),%xmm4
movsd  0xd3b(%rip),%xmm3
addsd  %xmm3,%xmm4
ucomisd %xmm3,%xmm4
jne    12e9 <sqrt+0x1c9>
jnp    12a2 <sqrt+0x182>
subsd  %xmm2,%xmm6
mulsd  0xd2b(%rip),%xmm6
addsd  0xd33(%rip),%xmm2
addsd  %xmm2,%xmm2
subsd  %xmm2,%xmm6
addsd  0xd3b(%rip),%xmm6
jmp    1353 <sqrt+0x233>
movsd  0xd21(%rip),%xmm4
mulsd  %xmm1,%xmm4
mulsd  0xd1d(%rip),%xmm4
movsd  0xced(%rip),%xmm3
addsd  %xmm3,%xmm4
ucomisd %xmm3,%xmm4
jne    133b <sqrt+0x21b>
jnp    12a2 <sqrt+0x182>
mulsd  0xcdd(%rip),%xmm6
addsd  %xmm2,%xmm2
subsd  %xmm2,%xmm6
addsd  0xcbd(%rip),%xmm6
movsd  0xce5(%rip),%xmm2
mulsd  %xmm1,%xmm2
addsd  %xmm3,%xmm2
movapd %xmm3,%xmm4
cmpltsd %xmm2,%xmm4
movapd %xmm4,%xmm2
andnpd %xmm6,%xmm2
andpd  %xmm3,%xmm4
orpd   %xmm2,%xmm4
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm4
jb     12a2 <sqrt+0x182>
addsd  %xmm1,%xmm0
jmp    12a2 <sqrt+0x182>

LLVM IR (-O0):
define double @sqrt(double %0) {
%2 = alloca double
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
store double %0, double* %3
store double 0.000000e+00, double* %9
store i32 51, i32* %13
%14 = load double, double* %3
%15 = load double, double* %3
%16 = fcmp une double %14, %15
br i1 %16, label %20, label %17
17: ; preds = %1
%18 = load double, double* %3
%19 = fcmp oeq double %18, 0.000000e+00
br i1 %19, label %20, label %22
20: ; preds = %17, %1
%21 = load double, double* %3
store double %21, double* %2
br label %194
22: ; preds = %17
%23 = load double, double* %3
%24 = fcmp olt double %23, 0.000000e+00
br i1 %24, label %25, label %26
25: ; preds = %22
store double 0x7FF8000000000000, double* %2
br label %194
26: ; preds = %22
%27 = load double, double* %3
%28 = call double @llvm.fabs.f64(double %27)
%29 = fcmp one double %28, 0x7FF0000000000000
br i1 %29, label %32, label %30
30: ; preds = %26
%31 = load double, double* %3
store double %31, double* %2
br label %194
32: ; preds = %26
%33 = load double, double* %3
%34 = call double @logb(double %33)
%35 = fptosi double %34 to i32
store i32 %35, i32* %11
%36 = load double, double* %3
%37 = load i32, i32* %11
%38 = sub nsw i32 0, %37
%39 = call i32 (double, i32, ...) bitcast (i32 (...)* @scalb to i32 (double, i32, ...)*)(double %36, i32 %38)
%40 = sitofp i32 %39 to double
store double %40, double* %3
%41 = load double, double* %3
%42 = call double @logb(double %41)
%43 = fptosi double %42 to i32
store i32 %43, i32* %10
%44 = icmp ne i32 %43, 0
br i1 %44, label %45, label %51
45: ; preds = %32
%46 = load double, double* %3
%47 = load i32, i32* %10
%48 = sub nsw i32 0, %47
%49 = call i32 (double, i32, ...) bitcast (i32 (...)* @scalb to i32 (double, i32, ...)*)(double %46, i32 %48)
%50 = sitofp i32 %49 to double
store double %50, double* %3
br label %51
51: ; preds = %45, %32
%52 = load i32, i32* %11
%53 = load i32, i32* %10
%54 = add nsw i32 %53, %52
store i32 %54, i32* %10
%55 = load i32, i32* %10
%56 = sdiv i32 %55, 2
store i32 %56, i32* %11
%57 = load i32, i32* %11
%58 = load i32, i32* %11
%59 = add nsw i32 %57, %58
%60 = load i32, i32* %10
%61 = icmp ne i32 %59, %60
br i1 %61, label %62, label %69
62: ; preds = %51
%63 = load double, double* %3
%64 = fmul double %63, 2.000000e+00
store double %64, double* %3
%65 = load i32, i32* %10
%66 = sub nsw i32 %65, 1
store i32 %66, i32* %10
%67 = load i32, i32* %10
%68 = sdiv i32 %67, 2
store i32 %68, i32* %11
br label %69
69: ; preds = %62, %51
store double 1.000000e+00, double* %4
store double 4.000000e+00, double* %5
%70 = load double, double* %3
%71 = fsub double %70, 1.000000e+00
store double %71, double* %3
store double 1.000000e+00, double* %7
store i32 1, i32* %12
br label %72
72: ; preds = %101, %69
%73 = load i32, i32* %12
%74 = load i32, i32* %13
%75 = icmp sle i32 %73, %74
br i1 %75, label %76, label %104
76: ; preds = %72
%77 = load double, double* %5
%78 = fadd double %77, 1.000000e+00
store double %78, double* %8
%79 = load double, double* %3
%80 = fmul double %79, 4.000000e+00
store double %80, double* %3
%81 = load double, double* %7
%82 = fdiv double %81, 2.000000e+00
store double %82, double* %7
%83 = load double, double* %8
%84 = load double, double* %3
%85 = fcmp ole double %83, %84
br i1 %85, label %86, label %97
86: ; preds = %76
%87 = load double, double* %8
%88 = load double, double* %8
%89 = fadd double %87, %88
%90 = fadd double %89, 2.000000e+00
store double %90, double* %5
%91 = load double, double* %8
%92 = load double, double* %3
%93 = fsub double %92, %91
store double %93, double* %3
%94 = load double, double* %7
%95 = load double, double* %4
%96 = fadd double %95, %94
store double %96, double* %4
br label %100
97: ; preds = %76
%98 = load double, double* %5
%99 = fmul double %98, 2.000000e+00
store double %99, double* %5
br label %100
100: ; preds = %97, %86
br label %101
101: ; preds = %100
%102 = load i32, i32* %12
%103 = add nsw i32 %102, 1
store i32 %103, i32* %12
br label %72
104: ; preds = %72
%105 = load double, double* %7
%106 = fdiv double %105, 2.000000e+00
store double %106, double* %7
%107 = load double, double* %3
%108 = fmul double %107, 4.000000e+00
store double %108, double* %3
%109 = load double, double* %3
%110 = fcmp oeq double %109, 0.000000e+00
br i1 %110, label %111, label %112
111: ; preds = %104
br label %189
112: ; preds = %104
%113 = load double, double* %7
%114 = fadd double 1.000000e+02, %113
store double %114, double* %8
%115 = load double, double* %5
%116 = load double, double* %3
%117 = fcmp olt double %115, %116
br i1 %117, label %118, label %157
118: ; preds = %112
%119 = load double, double* %7
%120 = load double, double* %4
%121 = fadd double %120, %119
store double %121, double* %4
%122 = load double, double* %5
%123 = load double, double* %3
%124 = fsub double %123, %122
store double %124, double* %3
%125 = load double, double* %5
%126 = fadd double %125, 2.000000e+00
store double %126, double* %5
%127 = load double, double* %5
%128 = fmul double %127, 2.000000e+00
store double %128, double* %5
%129 = load double, double* %3
%130 = fmul double %129, 4.000000e+00
store double %130, double* %3
%131 = load double, double* %3
%132 = load double, double* %5
%133 = fsub double %131, %132
%134 = fsub double %133, 5.000000e+00
store double %134, double* %8
%135 = load double, double* %7
%136 = fmul double 3.000000e+00, %135
%137 = fdiv double %136, 4.000000e+00
%138 = fadd double 1.000000e+00, %137
store double %138, double* %6
%139 = load double, double* %6
%140 = fcmp oeq double %139, 1.000000e+00
br i1 %140, label %141, label %142
141: ; preds = %118
br label %189
142: ; preds = %118
%143 = load double, double* %7
%144 = fdiv double %143, 4.000000e+00
%145 = fadd double 1.000000e+00, %144
store double %145, double* %6
%146 = load double, double* %6
%147 = fcmp ogt double %146, 1.000000e+00
br i1 %147, label %148, label %149
148: ; preds = %142
store double 1.000000e+00, double* %8
br label %149
149: ; preds = %148, %142
%150 = load double, double* %8
%151 = fcmp oge double %150, 0.000000e+00
br i1 %151, label %152, label %156
152: ; preds = %149
%153 = load double, double* %7
%154 = load double, double* %4
%155 = fadd double %154, %153
store double %155, double* %4
br label %156
156: ; preds = %152, %149
br label %188
157: ; preds = %112
%158 = load double, double* %5
%159 = fmul double %158, 2.000000e+00
store double %159, double* %5
%160 = load double, double* %3
%161 = fmul double %160, 4.000000e+00
store double %161, double* %3
%162 = load double, double* %3
%163 = load double, double* %5
%164 = fsub double %162, %163
%165 = fsub double %164, 1.000000e+00
store double %165, double* %8
%166 = load double, double* %7
%167 = fmul double 3.000000e+00, %166
%168 = fdiv double %167, 4.000000e+00
%169 = fadd double 1.000000e+00, %168
store double %169, double* %6
%170 = load double, double* %6
%171 = fcmp oeq double %170, 1.000000e+00
br i1 %171, label %172, label %173
172: ; preds = %157
br label %189
173: ; preds = %157
%174 = load double, double* %7
%175 = fdiv double %174, 4.000000e+00
%176 = fadd double 1.000000e+00, %175
store double %176, double* %6
%177 = load double, double* %6
%178 = fcmp ogt double %177, 1.000000e+00
br i1 %178, label %179, label %180
179: ; preds = %173
store double 1.000000e+00, double* %8
br label %180
180: ; preds = %179, %173
%181 = load double, double* %8
%182 = fcmp oge double %181, 0.000000e+00
br i1 %182, label %183, label %187
183: ; preds = %180
%184 = load double, double* %7
%185 = load double, double* %4
%186 = fadd double %185, %184
store double %186, double* %4
br label %187
187: ; preds = %183, %180
br label %188
188: ; preds = %187, %156
br label %189
189: ; preds = %188, %172, %141, %111
%190 = load double, double* %4
%191 = load i32, i32* %11
%192 = call i32 (double, i32, ...) bitcast (i32 (...)* @scalb to i32 (double, i32, ...)*)(double %190, i32 %191)
%193 = sitofp i32 %192 to double
store double %193, double* %2
br label %194
194: ; preds = %189, %30, %25, %20
%195 = load double, double* %2
ret double %195
}

LLVM IR (-O2):
define double @sqrt(double %0) {
%2 = fcmp ueq double %0, 0.000000e+00
br i1 %2, label %120, label %3
3: ; preds = %1
%4 = fcmp olt double %0, 0.000000e+00
br i1 %4, label %120, label %5
5: ; preds = %3
%6 = tail call double @llvm.fabs.f64(double %0)
%7 = fcmp ueq double %6, 0x7FF0000000000000
br i1 %7, label %120, label %8
8: ; preds = %5
%9 = tail call double @logb(double %0)
%10 = fptosi double %9 to i32
%11 = sub nsw i32 0, %10
%12 = tail call i32 (double, i32, ...) bitcast (i32 (...)* @scalb to i32 (double, i32, ...)*)(double %0, i32 %11)
%13 = sitofp i32 %12 to double
%14 = tail call double @logb(double %13)
%15 = fptosi double %14 to i32
%16 = icmp eq i32 %15, 0
br i1 %16, label %21, label %17
17: ; preds = %8
%18 = sub nsw i32 0, %15
%19 = tail call i32 (double, i32, ...) bitcast (i32 (...)* @scalb to i32 (double, i32, ...)*)(double %13, i32 %18)
%20 = sitofp i32 %19 to double
br label %21
21: ; preds = %17, %8
%22 = phi double [ %20, %17 ], [ %13, %8 ]
%23 = add nsw i32 %15, %10
%24 = sdiv i32 %23, 2
%25 = shl nsw i32 %24, 1
%26 = icmp eq i32 %25, %23
br i1 %26, label %31, label %27
27: ; preds = %21
%28 = fmul double %22, 2.000000e+00
%29 = add nsw i32 %23, -1
%30 = sdiv i32 %29, 2
br label %31
31: ; preds = %27, %21
%32 = phi double [ %28, %27 ], [ %22, %21 ]
%33 = phi i32 [ %30, %27 ], [ %24, %21 ]
%34 = fadd double %32, -1.000000e+00
br label %35
35: ; preds = %68, %31
%36 = phi i32 [ 1, %31 ], [ %72, %68 ]
%37 = phi double [ %34, %31 ], [ %71, %68 ]
%38 = phi double [ 5.000000e-01, %31 ], [ %73, %68 ]
%39 = phi double [ 4.000000e+00, %31 ], [ %70, %68 ]
%40 = phi double [ 1.000000e+00, %31 ], [ %69, %68 ]
%41 = fadd double %39, 1.000000e+00
%42 = fmul double %37, 4.000000e+00
%43 = fcmp ugt double %41, %42
br i1 %43, label %49, label %44
44: ; preds = %35
%45 = fadd double %41, %41
%46 = fadd double %45, 2.000000e+00
%47 = fsub double %42, %41
%48 = fadd double %40, %38
br label %51
49: ; preds = %35
%50 = fmul double %39, 2.000000e+00
br label %51
51: ; preds = %44, %49
%52 = phi double [ %48, %44 ], [ %40, %49 ]
%53 = phi double [ %46, %44 ], [ %50, %49 ]
%54 = phi double [ %47, %44 ], [ %42, %49 ]
%55 = fmul double %38, 5.000000e-01
%56 = icmp eq i32 %36, 51
br i1 %56, label %74, label %57
57: ; preds = %51
%58 = fadd double %53, 1.000000e+00
%59 = fmul double %54, 4.000000e+00
%60 = fcmp ugt double %58, %59
br i1 %60, label %66, label %61
61: ; preds = %57
%62 = fadd double %58, %58
%63 = fadd double %62, 2.000000e+00
%64 = fsub double %59, %58
%65 = fadd double %52, %55
br label %68
66: ; preds = %57
%67 = fmul double %53, 2.000000e+00
br label %68
68: ; preds = %66, %61
%69 = phi double [ %65, %61 ], [ %52, %66 ]
%70 = phi double [ %63, %61 ], [ %67, %66 ]
%71 = phi double [ %64, %61 ], [ %59, %66 ]
%72 = add nuw nsw i32 %36, 2
%73 = fmul double %55, 5.000000e-01
br label %35
74: ; preds = %51
%75 = fmul double %54, 4.000000e+00
%76 = fcmp oeq double %75, 0.000000e+00
br i1 %76, label %116, label %77
77: ; preds = %74
%78 = fcmp olt double %53, %75
br i1 %78, label %79, label %99
79: ; preds = %77
%80 = fadd double %52, %55
%81 = fmul double %55, 3.000000e+00
%82 = fmul double %81, 2.500000e-01
%83 = fadd double %82, 1.000000e+00
%84 = fcmp oeq double %83, 1.000000e+00
br i1 %84, label %116, label %85
85: ; preds = %79
%86 = fsub double %75, %53
%87 = fmul double %86, 4.000000e+00
%88 = fadd double %53, 2.000000e+00
%89 = fmul double %88, 2.000000e+00
%90 = fsub double %87, %89
%91 = fadd double %90, -5.000000e+00
%92 = fmul double %55, 2.500000e-01
%93 = fadd double %92, 1.000000e+00
%94 = fcmp ogt double %93, 1.000000e+00
%95 = select i1 %94, double 1.000000e+00, double %91
%96 = fcmp ult double %95, 0.000000e+00
br i1 %96, label %116, label %97
97: ; preds = %85
%98 = fadd double %55, %80
br label %116
99: ; preds = %77
%100 = fmul double %55, 3.000000e+00
%101 = fmul double %100, 2.500000e-01
%102 = fadd double %101, 1.000000e+00
%103 = fcmp oeq double %102, 1.000000e+00
br i1 %103, label %116, label %104
104: ; preds = %99
%105 = fmul double %75, 4.000000e+00
%106 = fmul double %53, 2.000000e+00
%107 = fsub double %105, %106
%108 = fadd double %107, -1.000000e+00
%109 = fmul double %55, 2.500000e-01
%110 = fadd double %109, 1.000000e+00
%111 = fcmp ogt double %110, 1.000000e+00
%112 = select i1 %111, double 1.000000e+00, double %108
%113 = fcmp ult double %112, 0.000000e+00
br i1 %113, label %116, label %114
114: ; preds = %104
%115 = fadd double %52, %55
br label %116
116: ; preds = %97, %85, %114, %104, %99, %79, %74
%117 = phi double [ %52, %74 ], [ %80, %79 ], [ %98, %97 ], [ %80, %85 ], [ %52, %99 ], [ %115, %114 ], [ %52, %104 ]
%118 = tail call i32 (double, i32, ...) bitcast (i32 (...)* @scalb to i32 (double, i32, ...)*)(double %117, i32 %33)
%119 = sitofp i32 %118 to double
br label %120
120: ; preds = %5, %3, %1, %116
%121 = phi double [ %119, %116 ], [ %0, %1 ], [ 0x7FF8000000000000, %3 ], [ %0, %5 ]
ret double %121
}