#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ finite(double);
int logb(double);
double scalb(double, int);
double sqrt(double x) {
  double q;
  double s;
  double b;
  double r;
  double t;
  double const zero = 0.0;
  int m;
  int n;
  int i;
  int k = 51;
  if (x != x || x == zero)
    return (x);
  if (x < zero) {
    return (zero / zero);
  }
  if (!finite(x))
    return (x);
  n = logb(x);
  x = scalb(x, -n);
  if ((m = 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;
  (void volatile)(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    15fb <sqrt+0x4db>
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    1199 <sqrt+0x79>
movsd  0xea1(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    15fb <sqrt+0x4db>
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    15fb <sqrt+0x4db>
movsd  -0x10(%rbp),%xmm0
call   1030 <logb@plt>
mov    %eax,-0x48(%rbp)
movsd  -0x10(%rbp),%xmm0
xor    %edi,%edi
sub    -0x48(%rbp),%edi
call   1040 <scalb@plt>
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
call   1030 <logb@plt>
mov    %eax,-0x44(%rbp)
cmp    $0x0,%eax
je     1215 <sqrt+0xf5>
movsd  -0x10(%rbp),%xmm0
xor    %edi,%edi
sub    -0x44(%rbp),%edi
call   1040 <scalb@plt>
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     1264 <sqrt+0x144>
movsd  0xdc5(%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  0xda4(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  0xd9f(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xd85(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xd74(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x1,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x50(%rbp),%eax
jg     1369 <sqrt+0x249>
movsd  0xd54(%rip),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xd4a(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  0xd23(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x38(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     1344 <sqrt+0x224>
movsd  -0x38(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  0xcf4(%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    1356 <sqrt+0x236>
movsd  0xcbc(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    135b <sqrt+0x23b>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    12a8 <sqrt+0x188>
movsd  -0x30(%rbp),%xmm0
movsd  0xc92(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xc91(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    13ae <sqrt+0x28e>
jp     13ae <sqrt+0x28e>
jmp    15e9 <sqrt+0x4c9>
movsd  -0x20(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    14ed <sqrt+0x3cd>
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  0xc1c(%rip),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xc0a(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xc08(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
subsd  -0x20(%rbp),%xmm0
movsd  0xbfc(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xbe3(%rip),%xmm1
mulsd  -0x30(%rbp),%xmm1
movsd  0xbce(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xbba(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xba4(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1481 <sqrt+0x361>
jp     1481 <sqrt+0x361>
jmp    15e9 <sqrt+0x4c9>
movsd  -0x30(%rbp),%xmm1
movsd  0xb8a(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xb76(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xb60(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    14c7 <sqrt+0x3a7>
movsd  0xb4e(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     14e8 <sqrt+0x3c8>
movsd  -0x30(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
jmp    15e4 <sqrt+0x4c4>
movsd  0xb13(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xb11(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
subsd  -0x20(%rbp),%xmm0
movsd  0xaed(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xaec(%rip),%xmm1
mulsd  -0x30(%rbp),%xmm1
movsd  0xad7(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xac3(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xaad(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1578 <sqrt+0x458>
jp     1578 <sqrt+0x458>
jmp    15e9 <sqrt+0x4c9>
movsd  -0x30(%rbp),%xmm1
movsd  0xa93(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xa7f(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xa69(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    15be <sqrt+0x49e>
movsd  0xa57(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     15df <sqrt+0x4bf>
movsd  -0x30(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
jmp    15e4 <sqrt+0x4c4>
jmp    15e9 <sqrt+0x4c9>
movsd  -0x18(%rbp),%xmm0
mov    -0x48(%rbp),%edi
call   1040 <scalb@plt>
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     1194 <sqrt+0x74>
ucomisd %xmm0,%xmm1
jbe    1140 <sqrt+0x20>
movsd  0xec2(%rip),%xmm0
jmp    1194 <sqrt+0x74>
movapd 0xf08(%rip),%xmm1
andpd  %xmm0,%xmm1
ucomisd 0xeb4(%rip),%xmm1
je     1194 <sqrt+0x74>
movapd %xmm0,(%rsp)
call   1030 <logb@plt>
mov    %eax,%ebp
mov    %eax,%edi
neg    %edi
movapd (%rsp),%xmm0
call   1040 <scalb@plt>
movapd %xmm0,(%rsp)
call   1030 <logb@plt>
mov    %eax,%ebx
test   %eax,%eax
je     119b <sqrt+0x7b>
mov    %ebx,%edi
neg    %edi
movapd (%rsp),%xmm0
call   1040 <scalb@plt>
movapd %xmm0,%xmm6
jmp    11a0 <sqrt+0x80>
add    $0x18,%rsp
pop    %rbx
pop    %rbp
ret
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     11c4 <sqrt+0xa4>
addsd  %xmm6,%xmm6
mov    %ebx,%eax
add    $0xffffffff,%eax
shr    $0x1f,%eax
lea    (%rbx,%rax,1),%edi
add    $0xffffffff,%edi
sar    %edi
addsd  0xe42(%rip),%xmm6
movsd  0xe42(%rip),%xmm3
movsd  0xe42(%rip),%xmm4
movsd  0xe42(%rip),%xmm5
mov    $0x32,%eax
movsd  0xe3c(%rip),%xmm8
movapd %xmm5,%xmm1
movapd %xmm4,%xmm7
movapd %xmm3,%xmm0
jmp    121f <sqrt+0xff>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
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    1240 <sqrt+0x120>
addsd  %xmm7,%xmm7
movapd %xmm7,%xmm2
jmp    1251 <sqrt+0x131>
nopl   0x0(%rax,%rax,1)
subsd  %xmm2,%xmm6
addsd  %xmm2,%xmm2
addsd  %xmm8,%xmm2
addsd  %xmm1,%xmm0
mulsd  %xmm5,%xmm1
test   %eax,%eax
je     127e <sqrt+0x15e>
movapd %xmm2,%xmm7
addsd  %xmm3,%xmm7
mulsd  %xmm4,%xmm6
ucomisd %xmm7,%xmm6
jb     1210 <sqrt+0xf0>
subsd  %xmm7,%xmm6
addsd  %xmm7,%xmm7
addsd  %xmm8,%xmm7
addsd  %xmm1,%xmm0
jmp    1218 <sqrt+0xf8>
mulsd  0xd9a(%rip),%xmm6
xorpd  %xmm3,%xmm3
ucomisd %xmm3,%xmm6
jne    129d <sqrt+0x17d>
jp     129d <sqrt+0x17d>
add    $0x18,%rsp
pop    %rbx
pop    %rbp
jmp    1040 <scalb@plt>
ucomisd %xmm2,%xmm6
jbe    12f5 <sqrt+0x1d5>
addsd  %xmm1,%xmm0
movsd  0xd89(%rip),%xmm4
mulsd  %xmm1,%xmm4
mulsd  0xd85(%rip),%xmm4
movsd  0xd55(%rip),%xmm3
addsd  %xmm3,%xmm4
ucomisd %xmm3,%xmm4
jne    12cf <sqrt+0x1af>
jnp    1292 <sqrt+0x172>
subsd  %xmm2,%xmm6
mulsd  0xd45(%rip),%xmm6
addsd  0xd4d(%rip),%xmm2
addsd  %xmm2,%xmm2
subsd  %xmm2,%xmm6
addsd  0xd55(%rip),%xmm6
jmp    1339 <sqrt+0x219>
movsd  0xd3b(%rip),%xmm4
mulsd  %xmm1,%xmm4
mulsd  0xd37(%rip),%xmm4
movsd  0xd07(%rip),%xmm3
addsd  %xmm3,%xmm4
ucomisd %xmm3,%xmm4
jne    1321 <sqrt+0x201>
jnp    1292 <sqrt+0x172>
mulsd  0xcf7(%rip),%xmm6
addsd  %xmm2,%xmm2
subsd  %xmm2,%xmm6
addsd  0xcd7(%rip),%xmm6
movsd  0xcff(%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     1292 <sqrt+0x172>
addsd  %xmm1,%xmm0
jmp    1292 <sqrt+0x172>

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

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