#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 */
double DBL_EPSILON;
double HUGE_VAL;
int /*<<< orphan*/ assert(int);
double fabs(double);
int /*<<< orphan*/ finite(double);
double sign(double);
double sqrt(double);
double find_root(double min, double max, double (*f)(const double *, void *),
                 void *info, double *fmin, double *fmax, const double tol,
                 int *neval) {
  double fl, fu, fc, fx;
  double c, x, disc;
  double delta;
  assert(max >= min);
  assert(NULL != f);
  assert(NULL != info);
  assert(tol > 0.);
  if (NULL != fmin) {
    fl = *fmin;
  } else {
    fl = f(&min, info);
    *neval = *neval + 1;
  }
  if (NULL != fmax) {
    fu = *fmax;
  } else {
    fu = f(&max, info);
    *neval = *neval + 1;
  }
  if (!finite(fl)) {
    fl = -HUGE_VAL;
  }
  if (!finite(fu)) {
    fu = -HUGE_VAL;
  }
  if (fabs(fl) < tol || fabs(fu) < tol) {
    return ((fabs(fl) < fabs(fu)) ? min : max);
  }
  while ((fabs(fu) > tol || fabs(fl) > tol) &&
         fabs(max - min) > 0.5 * 3e-8 * (1.e-10 + fabs(min) + fabs(max))) {
    c = (min + max) / 2.;
    fc = f(&c, info);
    *neval = *neval + 1;
    if (0. == fabs(fc))
      return c;
    disc = fc * fc - fl * fu;
    if (disc < DBL_EPSILON) {
      return c;
    }
    disc = sqrt(disc);
    x = c + (c - min) * fc * sign(fl - fu) / disc;
    fx = f(&x, info);
    *neval = *neval + 1;
    if (0. == fabs(fx))
      return x;
    if (sign(fx) != sign(fc)) {
      min = x;
      fl = fx;
      max = c;
      fu = fc;
    } else if (sign(fx) == sign(fl)) {
      if (fabs(max - x) < fabs(max - c)) {
        min = x;
        fl = fx;
      } else {
        min = c;
        fl = fc;
      }
    } else if (sign(fx) == sign(fu)) {
      if (fabs(min - x) < fabs(min - c)) {
        max = x;
        fu = fx;
      } else {
        max = c;
        fu = fc;
      }
    } else {
      assert(0. == fabs(fx));
      return x;
    }
  }
  delta = (fabs(fu - fl) > fabs(fu) * DBL_EPSILON) ? fl / (fu - fl) : 0.5;
  x = min - (max - min) * delta;
  return x;
}


x86 assembly (clang, -O0):
<find_root>:
push   %rbp
mov    %rsp,%rbp
sub    $0xd0,%rsp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
mov    %rdi,-0x20(%rbp)
mov    %rsi,-0x28(%rbp)
mov    %rdx,-0x30(%rbp)
mov    %rcx,-0x38(%rbp)
movsd  %xmm2,-0x40(%rbp)
mov    %r8,-0x48(%rbp)
movsd  -0x18(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
xor    %eax,%eax
cmp    -0x20(%rbp),%rax
setne  %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
xor    %eax,%eax
cmp    -0x28(%rbp),%rax
setne  %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
movsd  -0x40(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
xor    %eax,%eax
cmp    -0x30(%rbp),%rax
je     11d2 <find_root+0xa2>
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    11f4 <find_root+0xc4>
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%rsi
lea    -0x10(%rbp),%rdi
call   *%rax
movsd  %xmm0,-0x50(%rbp)
mov    -0x48(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    -0x48(%rbp),%rax
mov    %ecx,(%rax)
xor    %eax,%eax
cmp    -0x38(%rbp),%rax
je     1212 <find_root+0xe2>
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    1234 <find_root+0x104>
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%rsi
lea    -0x18(%rbp),%rdi
call   *%rax
movsd  %xmm0,-0x58(%rbp)
mov    -0x48(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    -0x48(%rbp),%rax
mov    %ecx,(%rax)
movsd  -0x50(%rbp),%xmm0
movaps 0xdf0(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  0xdb4(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    127d <find_root+0x14d>
mov    0x2d83(%rip),%rax
movsd  (%rax),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x58(%rbp),%xmm0
movaps 0xda7(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  0xd6b(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    12c6 <find_root+0x196>
mov    0x2d3a(%rip),%rax
movsd  (%rax),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x50(%rbp),%xmm1
movaps 0xd5e(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
ja     1304 <find_root+0x1d4>
movsd  -0x58(%rbp),%xmm1
movaps 0xd3f(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    135f <find_root+0x22f>
movsd  -0x50(%rbp),%xmm1
movaps 0xd20(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  -0x58(%rbp),%xmm0
movaps 0xd10(%rip),%xmm2
pand   %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    1340 <find_root+0x210>
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
jmp    134d <find_root+0x21d>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x8(%rbp)
jmp    184c <find_root+0x71c>
jmp    1364 <find_root+0x234>
movsd  -0x58(%rbp),%xmm0
movaps 0xcc0(%rip),%xmm1
pand   %xmm1,%xmm0
ucomisd -0x40(%rbp),%xmm0
ja     13a2 <find_root+0x272>
movsd  -0x50(%rbp),%xmm0
movaps 0xca5(%rip),%xmm1
pand   %xmm1,%xmm0
xor    %eax,%eax
ucomisd -0x40(%rbp),%xmm0
mov    %al,-0x91(%rbp)
jbe    1400 <find_root+0x2d0>
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movaps 0xc7d(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  -0x10(%rbp),%xmm1
movaps 0xc6d(%rip),%xmm2
pand   %xmm2,%xmm1
movsd  0xc41(%rip),%xmm2
addsd  %xmm1,%xmm2
movsd  -0x18(%rbp),%xmm1
movaps 0xc51(%rip),%xmm3
pand   %xmm3,%xmm1
addsd  %xmm1,%xmm2
movsd  0xc19(%rip),%xmm1
mulsd  %xmm2,%xmm1
ucomisd %xmm1,%xmm0
seta   %al
mov    %al,-0x91(%rbp)
mov    -0x91(%rbp),%al
test   $0x1,%al
jne    1413 <find_root+0x2e3>
jmp    1788 <find_root+0x658>
movsd  -0x10(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  0xbfb(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%rsi
lea    -0x70(%rbp),%rdi
call   *%rax
movsd  %xmm0,-0x60(%rbp)
mov    -0x48(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    -0x48(%rbp),%rax
mov    %ecx,(%rax)
movsd  -0x60(%rbp),%xmm1
movaps 0xbd4(%rip),%xmm0
pand   %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jne    1482 <find_root+0x352>
jp     1482 <find_root+0x352>
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    184c <find_root+0x71c>
movsd  -0x60(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  -0x58(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm1
mov    0x2b22(%rip),%rax
movsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    14e3 <find_root+0x3b3>
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    184c <find_root+0x71c>
movsd  -0x80(%rbp),%xmm0
call   1050 <sqrt@plt>
movsd  %xmm0,-0x80(%rbp)
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x70(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
subsd  -0x58(%rbp),%xmm0
call   1040 <sign@plt>
movsd  -0xa8(%rbp),%xmm1
ff
movaps %xmm0,%xmm2
movsd  -0xa0(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
divsd  -0x80(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%rsi
lea    -0x78(%rbp),%rdi
call   *%rax
movsd  %xmm0,-0x68(%rbp)
mov    -0x48(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    -0x48(%rbp),%rax
mov    %ecx,(%rax)
movsd  -0x68(%rbp),%xmm1
movaps 0xab8(%rip),%xmm0
pand   %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jne    159e <find_root+0x46e>
jp     159e <find_root+0x46e>
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    184c <find_root+0x71c>
movsd  -0x68(%rbp),%xmm0
call   1040 <sign@plt>
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0x60(%rbp),%xmm0
call   1040 <sign@plt>
movaps %xmm0,%xmm1
movsd  -0xb0(%rbp),%xmm0
ff
ucomisd %xmm1,%xmm0
jne    15da <find_root+0x4aa>
jp     15da <find_root+0x4aa>
jmp    1607 <find_root+0x4d7>
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    1783 <find_root+0x653>
movsd  -0x68(%rbp),%xmm0
call   1040 <sign@plt>
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
call   1040 <sign@plt>
movaps %xmm0,%xmm1
movsd  -0xb8(%rbp),%xmm0
ff
ucomisd %xmm1,%xmm0
jne    16a4 <find_root+0x574>
jp     16a4 <find_root+0x574>
movsd  -0x18(%rbp),%xmm1
subsd  -0x78(%rbp),%xmm1
movaps 0x9e1(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  -0x18(%rbp),%xmm0
subsd  -0x70(%rbp),%xmm0
movaps 0x9cc(%rip),%xmm2
pand   %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    168b <find_root+0x55b>
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    169f <find_root+0x56f>
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    177e <find_root+0x64e>
movsd  -0x68(%rbp),%xmm0
call   1040 <sign@plt>
movsd  %xmm0,-0xc0(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
call   1040 <sign@plt>
movaps %xmm0,%xmm1
movsd  -0xc0(%rbp),%xmm0
ff
ucomisd %xmm1,%xmm0
jne    1741 <find_root+0x611>
jp     1741 <find_root+0x611>
movsd  -0x10(%rbp),%xmm1
subsd  -0x78(%rbp),%xmm1
movaps 0x944(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  -0x10(%rbp),%xmm0
subsd  -0x70(%rbp),%xmm0
movaps 0x92f(%rip),%xmm2
pand   %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    1728 <find_root+0x5f8>
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    173c <find_root+0x60c>
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    1779 <find_root+0x649>
movsd  -0x68(%rbp),%xmm1
movaps 0x8e3(%rip),%xmm0
pand   %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    184c <find_root+0x71c>
jmp    177e <find_root+0x64e>
jmp    1783 <find_root+0x653>
jmp    1364 <find_root+0x234>
movsd  -0x58(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
movaps 0x897(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  -0x58(%rbp),%xmm1
movaps 0x887(%rip),%xmm2
pand   %xmm2,%xmm1
mov    0x2834(%rip),%rax
mulsd  (%rax),%xmm1
ucomisd %xmm1,%xmm0
jbe    17e2 <find_root+0x6b2>
movsd  -0x50(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm1
subsd  -0x50(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
jmp    17f7 <find_root+0x6c7>
movsd  0x82e(%rip),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
jmp    17f7 <find_root+0x6c7>
movsd  -0xc8(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x10(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  -0x88(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0xd0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<find_root>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x78,%rsp
mov    %r8,%r14
movsd  %xmm2,0x28(%rsp)
mov    %rcx,%rbx
mov    %rdx,%rbp
mov    %rsi,%r15
mov    %rdi,%r13
movsd  %xmm0,0x8(%rsp)
movsd  %xmm1,0x10(%rsp)
xor    %edi,%edi
ucomisd %xmm0,%xmm1
setae  %dil
call   1030 <assert@plt>
xor    %edi,%edi
test   %r13,%r13
setne  %dil
call   1030 <assert@plt>
xor    %edi,%edi
test   %r15,%r15
setne  %dil
call   1030 <assert@plt>
xorpd  %xmm0,%xmm0
xor    %edi,%edi
movsd  0x28(%rsp),%xmm1
ucomisd %xmm0,%xmm1
seta   %dil
call   1030 <assert@plt>
test   %rbp,%rbp
je     11af <find_root+0x7f>
movsd  0x0(%rbp),%xmm4
jmp    11c2 <find_root+0x92>
lea    0x8(%rsp),%rdi
mov    %r15,%rsi
call   *%r13
movapd %xmm0,%xmm4
addl   $0x1,(%r14)
test   %rbx,%rbx
movsd  0x28(%rsp),%xmm3
je     11d3 <find_root+0xa3>
movsd  (%rbx),%xmm0
jmp    11f4 <find_root+0xc4>
lea    0x10(%rsp),%rdi
mov    %r15,%rsi
movapd %xmm4,0x40(%rsp)
call   *%r13
movapd 0x40(%rsp),%xmm4
movsd  0x28(%rsp),%xmm3
addl   $0x1,(%r14)
movapd 0xe04(%rip),%xmm7
movapd %xmm4,%xmm2
andpd  %xmm7,%xmm2
movsd  0xe14(%rip),%xmm1
ucomisd %xmm1,%xmm2
mov    0x2dc9(%rip),%rax
movsd  (%rax),%xmm6
xorpd  0xded(%rip),%xmm6
movapd %xmm6,%xmm8
je     122f <find_root+0xff>
movapd %xmm4,%xmm8
movapd %xmm0,%xmm2
andpd  %xmm7,%xmm2
ucomisd %xmm1,%xmm2
je     1241 <find_root+0x111>
movapd %xmm0,%xmm6
movapd %xmm8,%xmm0
andpd  %xmm7,%xmm0
ucomisd %xmm0,%xmm3
movapd %xmm6,%xmm2
andpd  %xmm7,%xmm2
ja     127b <find_root+0x14b>
ucomisd %xmm2,%xmm3
ja     127b <find_root+0x14b>
ucomisd %xmm3,%xmm2
ja     1296 <find_root+0x166>
ucomisd %xmm3,%xmm0
ja     1296 <find_root+0x166>
movsd  0x8(%rsp),%xmm0
movsd  0x10(%rsp),%xmm1
jmp    15f0 <find_root+0x4c0>
ucomisd %xmm0,%xmm2
lea    0x8(%rsp),%rax
lea    0x10(%rsp),%rcx
cmova  %rax,%rcx
movsd  (%rcx),%xmm0
jmp    162f <find_root+0x4ff>
movsd  0x10(%rsp),%xmm1
movsd  0x8(%rsp),%xmm0
movapd %xmm1,%xmm3
subsd  %xmm0,%xmm3
andpd  %xmm7,%xmm3
movapd %xmm0,%xmm4
andpd  %xmm7,%xmm4
addsd  0xd6a(%rip),%xmm4
movapd %xmm1,%xmm5
andpd  %xmm7,%xmm5
addsd  %xmm4,%xmm5
mulsd  0xd5e(%rip),%xmm5
ucomisd %xmm5,%xmm3
jbe    15f0 <find_root+0x4c0>
lea    0x30(%rsp),%r12
mov    0x2d00(%rip),%rbp
lea    0x38(%rsp),%rbx
jmp    132a <find_root+0x1fa>
nop
movapd %xmm1,%xmm3
subsd  %xmm0,%xmm3
andpd  %xmm7,%xmm3
movapd %xmm0,%xmm4
andpd  %xmm7,%xmm4
addsd  0xd1c(%rip),%xmm4
movapd %xmm1,%xmm5
andpd  %xmm7,%xmm5
addsd  %xmm4,%xmm5
mulsd  0xd10(%rip),%xmm5
ucomisd %xmm5,%xmm3
jbe    15f0 <find_root+0x4c0>
movapd %xmm6,0x50(%rsp)
movapd %xmm8,0x60(%rsp)
addsd  %xmm0,%xmm1
mulsd  0xcf5(%rip),%xmm1
movsd  %xmm1,0x30(%rsp)
mov    %r12,%rdi
mov    %r15,%rsi
call   *%r13
addl   $0x1,(%r14)
ucomisd 0xce2(%rip),%xmm0
jne    1366 <find_root+0x236>
jnp    163e <find_root+0x50e>
movapd %xmm0,%xmm4
movapd 0x50(%rsp),%xmm3
movapd %xmm3,%xmm1
movapd 0x60(%rsp),%xmm2
mulsd  %xmm2,%xmm1
mulsd  %xmm4,%xmm0
subsd  %xmm1,%xmm0
movsd  0x0(%rbp),%xmm1
ucomisd %xmm0,%xmm1
ja     163e <find_root+0x50e>
ucomisd 0xca3(%rip),%xmm0
movsd  %xmm4,0x40(%rsp)
jb     13b0 <find_root+0x280>
sqrtsd %xmm0,%xmm0
jmp    13c7 <find_root+0x297>
nopl   0x0(%rax,%rax,1)
call   1050 <sqrt@plt>
movsd  0x40(%rsp),%xmm4
movapd 0x50(%rsp),%xmm3
movapd 0x60(%rsp),%xmm2
movsd  %xmm0,0x70(%rsp)
movsd  0x30(%rsp),%xmm0
movsd  %xmm0,0x20(%rsp)
subsd  0x8(%rsp),%xmm0
mulsd  %xmm4,%xmm0
movsd  %xmm0,0x18(%rsp)
movapd %xmm2,%xmm0
subsd  %xmm3,%xmm0
call   1040 <sign@plt>
mulsd  0x18(%rsp),%xmm0
divsd  0x70(%rsp),%xmm0
addsd  0x20(%rsp),%xmm0
movsd  %xmm0,0x38(%rsp)
mov    %rbx,%rdi
mov    %r15,%rsi
call   *%r13
addl   $0x1,(%r14)
ucomisd 0xc1d(%rip),%xmm0
jne    142b <find_root+0x2fb>
jnp    1646 <find_root+0x516>
movsd  %xmm0,0x20(%rsp)
call   1040 <sign@plt>
movsd  %xmm0,0x18(%rsp)
movsd  0x40(%rsp),%xmm0
call   1040 <sign@plt>
movsd  0x18(%rsp),%xmm1
ucomisd %xmm0,%xmm1
jne    1455 <find_root+0x325>
jnp    1490 <find_root+0x360>
movsd  0x38(%rsp),%xmm0
movsd  %xmm0,0x8(%rsp)
movsd  0x30(%rsp),%xmm1
movsd  %xmm1,0x10(%rsp)
movsd  0x40(%rsp),%xmm6
movsd  0x20(%rsp),%xmm8
movsd  0x28(%rsp),%xmm4
movapd 0xb78(%rip),%xmm7
jmp    15a7 <find_root+0x477>
nopl   (%rax)
movsd  0x20(%rsp),%xmm0
call   1040 <sign@plt>
movsd  %xmm0,0x18(%rsp)
movapd 0x60(%rsp),%xmm0
call   1040 <sign@plt>
movsd  0x18(%rsp),%xmm1
ucomisd %xmm0,%xmm1
jne    1517 <find_root+0x3e7>
jp     1517 <find_root+0x3e7>
movsd  0x20(%rsp),%xmm8
movsd  0x10(%rsp),%xmm1
movsd  0x38(%rsp),%xmm0
movsd  0x30(%rsp),%xmm2
movapd %xmm1,%xmm3
unpcklpd %xmm1,%xmm3
movapd %xmm0,%xmm4
unpcklpd %xmm2,%xmm4
subpd  %xmm4,%xmm3
andpd  0xb11(%rip),%xmm3
pshufd $0xee,%xmm3,%xmm4
ucomisd %xmm3,%xmm4
movsd  0x28(%rsp),%xmm4
movapd 0xafa(%rip),%xmm7
jbe    1590 <find_root+0x460>
movsd  %xmm0,0x8(%rsp)
jmp    15a1 <find_root+0x471>
movsd  0x20(%rsp),%xmm0
call   1040 <sign@plt>
movsd  %xmm0,0x18(%rsp)
movapd 0x50(%rsp),%xmm0
call   1040 <sign@plt>
movsd  0x18(%rsp),%xmm1
ucomisd %xmm0,%xmm1
jne    164e <find_root+0x51e>
jp     164e <find_root+0x51e>
movsd  0x8(%rsp),%xmm0
movsd  0x38(%rsp),%xmm1
movsd  0x30(%rsp),%xmm2
movapd %xmm0,%xmm3
unpcklpd %xmm0,%xmm3
movapd %xmm1,%xmm4
unpcklpd %xmm2,%xmm4
subpd  %xmm4,%xmm3
andpd  0xa89(%rip),%xmm3
pshufd $0xee,%xmm3,%xmm4
ucomisd %xmm3,%xmm4
jbe    15ce <find_root+0x49e>
movsd  %xmm1,0x10(%rsp)
movsd  0x20(%rsp),%xmm6
jmp    15de <find_root+0x4ae>
movsd  %xmm2,0x8(%rsp)
movapd %xmm2,%xmm0
movsd  0x40(%rsp),%xmm8
movapd 0x50(%rsp),%xmm6
movapd %xmm6,%xmm2
andpd  %xmm7,%xmm2
ucomisd %xmm4,%xmm2
ja     12f0 <find_root+0x1c0>
movapd %xmm8,%xmm3
andpd  %xmm7,%xmm3
ucomisd %xmm4,%xmm3
ja     12f0 <find_root+0x1c0>
jmp    15f0 <find_root+0x4c0>
movsd  %xmm2,0x10(%rsp)
movapd %xmm2,%xmm1
movsd  0x40(%rsp),%xmm6
movsd  0x28(%rsp),%xmm4
movapd 0x60(%rsp),%xmm8
jmp    1480 <find_root+0x350>
subsd  %xmm8,%xmm6
movapd 0xa03(%rip),%xmm3
andpd  %xmm6,%xmm3
mov    0x29e0(%rip),%rax
mulsd  (%rax),%xmm2
ucomisd %xmm2,%xmm3
jbe    1619 <find_root+0x4e9>
divsd  %xmm6,%xmm8
jmp    1622 <find_root+0x4f2>
movsd  0xa16(%rip),%xmm8
subsd  %xmm0,%xmm1
mulsd  %xmm8,%xmm1
subsd  %xmm1,%xmm0
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
movsd  0x30(%rsp),%xmm0
jmp    162f <find_root+0x4ff>
movsd  0x38(%rsp),%xmm0
jmp    162f <find_root+0x4ff>
xor    %edi,%edi
call   1030 <assert@plt>
movsd  0x38(%rsp),%xmm0
jmp    162f <find_root+0x4ff>

LLVM IR (-O0):
@HUGE_VAL = global double 0.000000e+00
@DBL_EPSILON = global double 0.000000e+00
define double @find_root(double %0, double %1, double (double*, i8*)* %2, i8* %3, double* %4, double* %5, double %6, i32* %7) {
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double (double*, i8*)*
%13 = alloca i8*
%14 = alloca double*
%15 = alloca double*
%16 = alloca double
%17 = alloca i32*
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca double
%24 = alloca double
%25 = alloca double
store double %0, double* %10
store double %1, double* %11
store double (double*, i8*)* %2, double (double*, i8*)** %12
store i8* %3, i8** %13
store double* %4, double** %14
store double* %5, double** %15
store double %6, double* %16
store i32* %7, i32** %17
%26 = load double, double* %11
%27 = load double, double* %10
%28 = fcmp oge double %26, %27
%29 = zext i1 %28 to i32
%30 = call i32 @assert(i32 %29)
%31 = load double (double*, i8*)*, double (double*, i8*)** %12
%32 = icmp ne double (double*, i8*)* null, %31
%33 = zext i1 %32 to i32
%34 = call i32 @assert(i32 %33)
%35 = load i8*, i8** %13
%36 = icmp ne i8* null, %35
%37 = zext i1 %36 to i32
%38 = call i32 @assert(i32 %37)
%39 = load double, double* %16
%40 = fcmp ogt double %39, 0.000000e+00
%41 = zext i1 %40 to i32
%42 = call i32 @assert(i32 %41)
%43 = load double*, double** %14
%44 = icmp ne double* null, %43
br i1 %44, label %45, label %48
45: ; preds = %8
%46 = load double*, double** %14
%47 = load double, double* %46
store double %47, double* %18
br label %56
48: ; preds = %8
%49 = load double (double*, i8*)*, double (double*, i8*)** %12
%50 = load i8*, i8** %13
%51 = call double %49(double* %10, i8* %50)
store double %51, double* %18
%52 = load i32*, i32** %17
%53 = load i32, i32* %52
%54 = add nsw i32 %53, 1
%55 = load i32*, i32** %17
store i32 %54, i32* %55
br label %56
56: ; preds = %48, %45
%57 = load double*, double** %15
%58 = icmp ne double* null, %57
br i1 %58, label %59, label %62
59: ; preds = %56
%60 = load double*, double** %15
%61 = load double, double* %60
store double %61, double* %19
br label %70
62: ; preds = %56
%63 = load double (double*, i8*)*, double (double*, i8*)** %12
%64 = load i8*, i8** %13
%65 = call double %63(double* %11, i8* %64)
store double %65, double* %19
%66 = load i32*, i32** %17
%67 = load i32, i32* %66
%68 = add nsw i32 %67, 1
%69 = load i32*, i32** %17
store i32 %68, i32* %69
br label %70
70: ; preds = %62, %59
%71 = load double, double* %18
%72 = call double @llvm.fabs.f64(double %71)
%73 = fcmp one double %72, 0x7FF0000000000000
br i1 %73, label %77, label %74
74: ; preds = %70
%75 = load double, double* @HUGE_VAL
%76 = fneg double %75
store double %76, double* %18
br label %77
77: ; preds = %74, %70
%78 = load double, double* %19
%79 = call double @llvm.fabs.f64(double %78)
%80 = fcmp one double %79, 0x7FF0000000000000
br i1 %80, label %84, label %81
81: ; preds = %77
%82 = load double, double* @HUGE_VAL
%83 = fneg double %82
store double %83, double* %19
br label %84
84: ; preds = %81, %77
%85 = load double, double* %18
%86 = call double @llvm.fabs.f64(double %85)
%87 = load double, double* %16
%88 = fcmp olt double %86, %87
br i1 %88, label %94, label %89
89: ; preds = %84
%90 = load double, double* %19
%91 = call double @llvm.fabs.f64(double %90)
%92 = load double, double* %16
%93 = fcmp olt double %91, %92
br i1 %93, label %94, label %106
94: ; preds = %89, %84
%95 = load double, double* %18
%96 = call double @llvm.fabs.f64(double %95)
%97 = load double, double* %19
%98 = call double @llvm.fabs.f64(double %97)
%99 = fcmp olt double %96, %98
br i1 %99, label %100, label %102
100: ; preds = %94
%101 = load double, double* %10
br label %104
102: ; preds = %94
%103 = load double, double* %11
br label %104
104: ; preds = %102, %100
%105 = phi double [ %101, %100 ], [ %103, %102 ]
store double %105, double* %9
br label %285
106: ; preds = %89
br label %107
107: ; preds = %257, %106
%108 = load double, double* %19
%109 = call double @llvm.fabs.f64(double %108)
%110 = load double, double* %16
%111 = fcmp ogt double %109, %110
br i1 %111, label %117, label %112
112: ; preds = %107
%113 = load double, double* %18
%114 = call double @llvm.fabs.f64(double %113)
%115 = load double, double* %16
%116 = fcmp ogt double %114, %115
br i1 %116, label %117, label %130
117: ; preds = %112, %107
%118 = load double, double* %11
%119 = load double, double* %10
%120 = fsub double %118, %119
%121 = call double @llvm.fabs.f64(double %120)
%122 = load double, double* %10
%123 = call double @llvm.fabs.f64(double %122)
%124 = fadd double 1.000000e-10, %123
%125 = load double, double* %11
%126 = call double @llvm.fabs.f64(double %125)
%127 = fadd double %124, %126
%128 = fmul double 1.500000e-08, %127
%129 = fcmp ogt double %121, %128
br label %130
130: ; preds = %117, %112
%131 = phi i1 [ false, %112 ], [ %129, %117 ]
br i1 %131, label %132, label %258
132: ; preds = %130
%133 = load double, double* %10
%134 = load double, double* %11
%135 = fadd double %133, %134
%136 = fdiv double %135, 2.000000e+00
store double %136, double* %22
%137 = load double (double*, i8*)*, double (double*, i8*)** %12
%138 = load i8*, i8** %13
%139 = call double %137(double* %22, i8* %138)
store double %139, double* %20
%140 = load i32*, i32** %17
%141 = load i32, i32* %140
%142 = add nsw i32 %141, 1
%143 = load i32*, i32** %17
store i32 %142, i32* %143
%144 = load double, double* %20
%145 = call double @llvm.fabs.f64(double %144)
%146 = fcmp oeq double 0.000000e+00, %145
br i1 %146, label %147, label %149
147: ; preds = %132
%148 = load double, double* %22
store double %148, double* %9
br label %285
149: ; preds = %132
%150 = load double, double* %20
%151 = load double, double* %20
%152 = load double, double* %18
%153 = load double, double* %19
%154 = fmul double %152, %153
%155 = fneg double %154
%156 = call double @llvm.fmuladd.f64(double %150, double %151, double %155)
store double %156, double* %24
%157 = load double, double* %24
%158 = load double, double* @DBL_EPSILON
%159 = fcmp olt double %157, %158
br i1 %159, label %160, label %162
160: ; preds = %149
%161 = load double, double* %22
store double %161, double* %9
br label %285
162: ; preds = %149
%163 = load double, double* %24
%164 = call double @sqrt(double %163)
store double %164, double* %24
%165 = load double, double* %22
%166 = load double, double* %22
%167 = load double, double* %10
%168 = fsub double %166, %167
%169 = load double, double* %20
%170 = fmul double %168, %169
%171 = load double, double* %18
%172 = load double, double* %19
%173 = fsub double %171, %172
%174 = call double @sign(double %173)
%175 = fmul double %170, %174
%176 = load double, double* %24
%177 = fdiv double %175, %176
%178 = fadd double %165, %177
store double %178, double* %23
%179 = load double (double*, i8*)*, double (double*, i8*)** %12
%180 = load i8*, i8** %13
%181 = call double %179(double* %23, i8* %180)
store double %181, double* %21
%182 = load i32*, i32** %17
%183 = load i32, i32* %182
%184 = add nsw i32 %183, 1
%185 = load i32*, i32** %17
store i32 %184, i32* %185
%186 = load double, double* %21
%187 = call double @llvm.fabs.f64(double %186)
%188 = fcmp oeq double 0.000000e+00, %187
br i1 %188, label %189, label %191
189: ; preds = %162
%190 = load double, double* %23
store double %190, double* %9
br label %285
191: ; preds = %162
%192 = load double, double* %21
%193 = call double @sign(double %192)
%194 = load double, double* %20
%195 = call double @sign(double %194)
%196 = fcmp une double %193, %195
br i1 %196, label %197, label %202
197: ; preds = %191
%198 = load double, double* %23
store double %198, double* %10
%199 = load double, double* %21
store double %199, double* %18
%200 = load double, double* %22
store double %200, double* %11
%201 = load double, double* %20
store double %201, double* %19
br label %257
202: ; preds = %191
%203 = load double, double* %21
%204 = call double @sign(double %203)
%205 = load double, double* %18
%206 = call double @sign(double %205)
%207 = fcmp oeq double %204, %206
br i1 %207, label %208, label %225
208: ; preds = %202
%209 = load double, double* %11
%210 = load double, double* %23
%211 = fsub double %209, %210
%212 = call double @llvm.fabs.f64(double %211)
%213 = load double, double* %11
%214 = load double, double* %22
%215 = fsub double %213, %214
%216 = call double @llvm.fabs.f64(double %215)
%217 = fcmp olt double %212, %216
br i1 %217, label %218, label %221
218: ; preds = %208
%219 = load double, double* %23
store double %219, double* %10
%220 = load double, double* %21
store double %220, double* %18
br label %224
221: ; preds = %208
%222 = load double, double* %22
store double %222, double* %10
%223 = load double, double* %20
store double %223, double* %18
br label %224
224: ; preds = %221, %218
br label %256
225: ; preds = %202
%226 = load double, double* %21
%227 = call double @sign(double %226)
%228 = load double, double* %19
%229 = call double @sign(double %228)
%230 = fcmp oeq double %227, %229
br i1 %230, label %231, label %248
231: ; preds = %225
%232 = load double, double* %10
%233 = load double, double* %23
%234 = fsub double %232, %233
%235 = call double @llvm.fabs.f64(double %234)
%236 = load double, double* %10
%237 = load double, double* %22
%238 = fsub double %236, %237
%239 = call double @llvm.fabs.f64(double %238)
%240 = fcmp olt double %235, %239
br i1 %240, label %241, label %244
241: ; preds = %231
%242 = load double, double* %23
store double %242, double* %11
%243 = load double, double* %21
store double %243, double* %19
br label %247
244: ; preds = %231
%245 = load double, double* %22
store double %245, double* %11
%246 = load double, double* %20
store double %246, double* %19
br label %247
247: ; preds = %244, %241
br label %255
248: ; preds = %225
%249 = load double, double* %21
%250 = call double @llvm.fabs.f64(double %249)
%251 = fcmp oeq double 0.000000e+00, %250
%252 = zext i1 %251 to i32
%253 = call i32 @assert(i32 %252)
%254 = load double, double* %23
store double %254, double* %9
br label %285
255: ; preds = %247
br label %256
256: ; preds = %255, %224
br label %257
257: ; preds = %256, %197
br label %107
258: ; preds = %130
%259 = load double, double* %19
%260 = load double, double* %18
%261 = fsub double %259, %260
%262 = call double @llvm.fabs.f64(double %261)
%263 = load double, double* %19
%264 = call double @llvm.fabs.f64(double %263)
%265 = load double, double* @DBL_EPSILON
%266 = fmul double %264, %265
%267 = fcmp ogt double %262, %266
br i1 %267, label %268, label %274
268: ; preds = %258
%269 = load double, double* %18
%270 = load double, double* %19
%271 = load double, double* %18
%272 = fsub double %270, %271
%273 = fdiv double %269, %272
br label %275
274: ; preds = %258
br label %275
275: ; preds = %274, %268
%276 = phi double [ %273, %268 ], [ 5.000000e-01, %274 ]
store double %276, double* %25
%277 = load double, double* %10
%278 = load double, double* %11
%279 = load double, double* %10
%280 = fsub double %278, %279
%281 = load double, double* %25
%282 = fneg double %280
%283 = call double @llvm.fmuladd.f64(double %282, double %281, double %277)
store double %283, double* %23
%284 = load double, double* %23
store double %284, double* %9
br label %285
285: ; preds = %275, %248, %189, %160, %147, %104
%286 = load double, double* %9
ret double %286
}

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