#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 DBL_EPSILON;
double fabs(double);
double stub1(double, double *);
double stub2(double, double *);
double stub3(double, double *);
double zeroin(double ax, double bx, double (*f)(double x, double *data),
              double *data, double tol) {
  double a, b, c;
  double fa;
  double fb;
  double fc;
  a = ax;
  b = bx;
  fa = (*f)(a, data);
  fb = (*f)(b, data);
  c = a;
  fc = fa;
  for (;;) {
    double prev_step = b - a;
    double tol_act;
    double p;
    double q;
    double new_step;
    if (fabs(fc) < fabs(fb)) {
      a = b;
      b = c;
      c = a;
      fa = fb;
      fb = fc;
      fc = fa;
    }
    tol_act = 2 * DBL_EPSILON * fabs(b) + tol / 2;
    new_step = (c - b) / 2;
    if (fabs(new_step) <= tol_act || fb == (double)0)
      return b;
    if (fabs(prev_step) >= tol_act && fabs(fa) > fabs(fb)) {
      register double t1, cb, t2;
      cb = c - b;
      if (a == c) {
        t1 = fb / fa;
        p = cb * t1;
        q = 1.0 - t1;
      } else {
        q = fa / fc;
        t1 = fb / fc;
        t2 = fb / fa;
        p = t2 * (cb * q * (q - t1) - (b - a) * (t1 - 1.0));
        q = (q - 1.0) * (t1 - 1.0) * (t2 - 1.0);
      }
      if (p > (double)0)
        q = -q;
      else
        p = -p;
      if (p < (0.75 * cb * q - fabs(tol_act * q) / 2) &&
          p < fabs(prev_step * q / 2))
        new_step = p / q;
    }
    if (fabs(new_step) < tol_act) {
      if (new_step > (double)0)
        new_step = tol_act;
      else
        new_step = -tol_act;
    }
    a = b;
    fa = fb;
    b += new_step;
    fb = (*f)(b, data);
    if ((fb > 0 && fc > 0) || (fb < 0 && fc < 0)) {
      c = a;
      fc = fa;
    }
  }
}


x86 assembly (clang, -O0):
<zeroin>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
movsd  %xmm2,-0x28(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  -0x30(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   *%rax
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
movsd  -0x38(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   *%rax
movsd  %xmm0,-0x50(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
subsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x58(%rbp),%xmm1
movaps 0xe73(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  -0x50(%rbp),%xmm0
movaps 0xe63(%rip),%xmm2
pand   %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    11e7 <zeroin+0xe7>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    0x2dfa(%rip),%rax
mov    (%rax),%eax
shl    $0x1,%eax
cvtsi2sd %eax,%xmm0
movsd  -0x38(%rbp),%xmm2
movaps 0xdfd(%rip),%xmm1
pand   %xmm1,%xmm2
movsd  -0x28(%rbp),%xmm1
movsd  0xdfc(%rip),%xmm3
divsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
subsd  -0x38(%rbp),%xmm0
movsd  0xdd9(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm1
movaps 0xdb4(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  -0x68(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jae    1277 <zeroin+0x177>
movsd  -0x50(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1285 <zeroin+0x185>
jp     1285 <zeroin+0x185>
movsd  -0x38(%rbp),%xmm0
add    $0xa0,%rsp
pop    %rbp
ret
movsd  -0x60(%rbp),%xmm0
movaps 0xd6f(%rip),%xmm1
pand   %xmm1,%xmm0
ucomisd -0x68(%rbp),%xmm0
jb     1519 <zeroin+0x419>
movsd  -0x48(%rbp),%xmm0
movaps 0xd54(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  -0x50(%rbp),%xmm1
movaps 0xd44(%rip),%xmm2
pand   %xmm2,%xmm1
ucomisd %xmm1,%xmm0
jbe    1519 <zeroin+0x419>
movsd  -0x40(%rbp),%xmm0
subsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x30(%rbp),%xmm0
ucomisd -0x40(%rbp),%xmm0
jne    1333 <zeroin+0x233>
jp     1333 <zeroin+0x233>
movsd  -0x50(%rbp),%xmm0
divsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
mulsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x70(%rbp)
movsd  0xcf7(%rip),%xmm0
subsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x78(%rbp)
jmp    1418 <zeroin+0x318>
movsd  -0x48(%rbp),%xmm0
divsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x50(%rbp),%xmm0
divsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
divsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
movsd  -0x90(%rbp),%xmm1
ff
mulsd  -0x78(%rbp),%xmm1
movsd  -0x78(%rbp),%xmm3
subsd  -0x88(%rbp),%xmm3
ff
movsd  -0x38(%rbp),%xmm2
subsd  -0x30(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm4
ff
movsd  0xc76(%rip),%xmm5
subsd  %xmm5,%xmm4
mulsd  %xmm4,%xmm2
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x78(%rbp),%xmm0
movsd  0xc39(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  -0x88(%rbp),%xmm1
ff
movsd  0xc25(%rip),%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  -0x98(%rbp),%xmm1
ff
movsd  0xc0d(%rip),%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x70(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1450 <zeroin+0x350>
movsd  -0x78(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x78(%rbp)
jmp    1471 <zeroin+0x371>
movsd  -0x70(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm1
movsd  0xba2(%rip),%xmm0
mulsd  -0x90(%rbp),%xmm0
ff
movsd  -0x78(%rbp),%xmm3
movsd  -0x68(%rbp),%xmm2
mulsd  -0x78(%rbp),%xmm2
movaps 0xb64(%rip),%xmm4
pand   %xmm4,%xmm2
movsd  0xb68(%rip),%xmm4
divsd  %xmm4,%xmm2
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm3,%xmm0
addsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    1514 <zeroin+0x414>
movsd  -0x70(%rbp),%xmm1
movsd  -0x60(%rbp),%xmm0
mulsd  -0x78(%rbp),%xmm0
movsd  0xb24(%rip),%xmm2
divsd  %xmm2,%xmm0
movaps 0xb09(%rip),%xmm2
pand   %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jbe    1514 <zeroin+0x414>
movsd  -0x70(%rbp),%xmm0
divsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
jmp    1519 <zeroin+0x419>
movsd  -0x80(%rbp),%xmm1
movaps 0xadb(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  -0x68(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    157f <zeroin+0x47f>
movsd  -0x80(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1559 <zeroin+0x459>
movsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
jmp    157a <zeroin+0x47a>
movsd  -0x68(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x80(%rbp)
jmp    157f <zeroin+0x47f>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x80(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  -0x38(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   *%rax
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    15da <zeroin+0x4da>
movsd  -0x58(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
ja     15f6 <zeroin+0x4f6>
xorps  %xmm0,%xmm0
ucomisd -0x50(%rbp),%xmm0
jbe    160a <zeroin+0x50a>
xorps  %xmm0,%xmm0
ucomisd -0x58(%rbp),%xmm0
jbe    160a <zeroin+0x50a>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    1172 <zeroin+0x72>

x86 assembly (clang, -O2):
<zeroin>:
push   %r15
push   %r14
push   %rbx
sub    $0x70,%rsp
movsd  %xmm2,0x8(%rsp)
mov    %rsi,%r14
mov    %rdi,%rbx
movaps %xmm1,0x20(%rsp)
movsd  %xmm0,0x10(%rsp)
mov    %rsi,%rdi
call   *%rbx
movaps %xmm0,0x30(%rsp)
movapd 0x20(%rsp),%xmm0
mov    %r14,%rdi
call   *%rbx
movsd  0x10(%rsp),%xmm9
movapd 0x30(%rsp),%xmm14
movsd  0x8(%rsp),%xmm1
mulsd  0xeaf(%rip),%xmm1
movsd  %xmm1,0x8(%rsp)
unpcklpd %xmm14,%xmm14
movapd 0xecb(%rip),%xmm11
mov    0x2e7c(%rip),%r15
xorpd  %xmm12,%xmm12
movapd 0xeb6(%rip),%xmm13
movapd %xmm9,%xmm4
jmp    11a2 <zeroin+0xa2>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
unpcklpd %xmm1,%xmm1
movapd %xmm2,%xmm9
movapd %xmm2,%xmm4
movapd %xmm1,%xmm14
movapd %xmm14,%xmm15
unpckhpd %xmm14,%xmm15
movapd %xmm15,%xmm1
andpd  %xmm11,%xmm1
movapd %xmm0,%xmm2
andpd  %xmm11,%xmm2
ucomisd %xmm1,%xmm2
jbe    11e0 <zeroin+0xe0>
unpcklpd %xmm0,%xmm0
movapd 0x20(%rsp),%xmm7
movapd %xmm7,%xmm8
movapd %xmm7,%xmm10
movapd %xmm0,%xmm14
jmp    11fa <zeroin+0xfa>
movapd %xmm0,%xmm15
movapd %xmm9,%xmm8
movapd 0x20(%rsp),%xmm7
movapd %xmm7,%xmm9
movapd %xmm4,%xmm10
mov    (%r15),%eax
add    %eax,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movapd %xmm9,%xmm0
andpd  %xmm11,%xmm0
mulsd  %xmm1,%xmm0
addsd  0x8(%rsp),%xmm0
movapd %xmm8,%xmm3
subsd  %xmm9,%xmm3
movapd %xmm3,%xmm1
mulsd  0xdd0(%rip),%xmm1
movapd %xmm1,%xmm2
andpd  %xmm11,%xmm2
ucomisd %xmm2,%xmm0
jae    14ba <zeroin+0x3ba>
ucomisd %xmm12,%xmm15
jne    1250 <zeroin+0x150>
jnp    14ba <zeroin+0x3ba>
subsd  %xmm4,%xmm7
movapd %xmm7,%xmm4
andpd  %xmm13,%xmm4
ucomisd %xmm0,%xmm4
movapd %xmm14,%xmm5
unpckhpd %xmm14,%xmm5
movapd %xmm9,0x10(%rsp)
movsd  %xmm8,0x48(%rsp)
movapd %xmm5,0x50(%rsp)
jb     1360 <zeroin+0x260>
movapd %xmm14,%xmm4
andpd  %xmm11,%xmm4
movapd %xmm15,%xmm6
andpd  %xmm11,%xmm6
ucomisd %xmm6,%xmm4
jbe    1360 <zeroin+0x260>
ucomisd %xmm8,%xmm10
movapd 0xda0(%rip),%xmm4
jne    1415 <zeroin+0x315>
jp     1415 <zeroin+0x315>
movapd %xmm15,%xmm6
divsd  %xmm14,%xmm6
movsd  0xd41(%rip),%xmm11
subsd  %xmm6,%xmm11
mulsd  %xmm3,%xmm6
ucomisd %xmm12,%xmm6
jbe    12e4 <zeroin+0x1e4>
xorpd  %xmm4,%xmm11
movapd %xmm6,%xmm8
xorpd  %xmm4,%xmm8
xorpd  %xmm5,%xmm5
cmpltsd %xmm6,%xmm5
movapd %xmm5,%xmm4
andnpd %xmm8,%xmm4
andpd  %xmm6,%xmm5
orpd   %xmm4,%xmm5
mulsd  0xd08(%rip),%xmm3
movapd %xmm0,%xmm4
mulsd  %xmm11,%xmm4
andpd  %xmm13,%xmm4
mulsd  0xcfa(%rip),%xmm4
mulsd  %xmm11,%xmm3
addsd  %xmm4,%xmm3
ucomisd %xmm5,%xmm3
jbe    1360 <zeroin+0x260>
mulsd  %xmm11,%xmm7
mulsd  0xcbe(%rip),%xmm7
andpd  %xmm13,%xmm7
ucomisd %xmm5,%xmm7
jbe    1360 <zeroin+0x260>
divsd  %xmm11,%xmm5
movapd %xmm5,%xmm2
andpd  %xmm13,%xmm2
movapd %xmm5,%xmm1
nop
ucomisd %xmm2,%xmm0
movapd %xmm14,0x30(%rsp)
movapd %xmm15,0x60(%rsp)
jbe    1387 <zeroin+0x287>
ucomisd %xmm12,%xmm1
ja     1383 <zeroin+0x283>
xorpd  0xccd(%rip),%xmm0
movapd %xmm0,%xmm1
movapd %xmm1,%xmm0
addsd  %xmm9,%xmm0
movapd %xmm0,0x20(%rsp)
mov    %r14,%rdi
call   *%rbx
movapd 0x10(%rsp),%xmm2
xorpd  %xmm12,%xmm12
ucomisd %xmm12,%xmm0
movapd 0xc7c(%rip),%xmm11
movapd 0xc73(%rip),%xmm13
movapd 0x30(%rsp),%xmm14
movapd 0x60(%rsp),%xmm1
movsd  0x48(%rsp),%xmm3
movapd 0x50(%rsp),%xmm5
jbe    13e3 <zeroin+0x2e3>
ucomisd %xmm12,%xmm5
ja     1190 <zeroin+0x90>
ucomisd %xmm0,%xmm12
movsd  %xmm1,%xmm14
movapd %xmm3,%xmm9
movapd %xmm2,%xmm4
jbe    11a2 <zeroin+0xa2>
ucomisd %xmm5,%xmm12
movapd %xmm3,%xmm9
movapd %xmm2,%xmm4
ja     1190 <zeroin+0x90>
jmp    11a2 <zeroin+0xa2>
movapd %xmm14,%xmm11
divsd  %xmm5,%xmm11
movapd %xmm15,%xmm9
unpcklpd %xmm15,%xmm9
divpd  %xmm14,%xmm9
movapd %xmm7,%xmm4
movapd %xmm11,%xmm8
mulsd  %xmm3,%xmm8
movapd %xmm9,%xmm5
unpckhpd %xmm9,%xmm5
movapd %xmm11,%xmm6
subsd  %xmm5,%xmm6
mulsd  %xmm8,%xmm6
movapd 0x10(%rsp),%xmm5
subsd  %xmm10,%xmm5
movapd %xmm9,%xmm8
addpd  0xbd3(%rip),%xmm8
movapd %xmm8,%xmm7
unpckhpd %xmm8,%xmm7
mulsd  %xmm7,%xmm5
subsd  %xmm5,%xmm6
mulsd  %xmm9,%xmm6
movapd 0x10(%rsp),%xmm9
addsd  0xb74(%rip),%xmm11
mulsd  %xmm7,%xmm11
mulsd  %xmm8,%xmm11
movapd %xmm4,%xmm7
movapd 0xba6(%rip),%xmm4
ucomisd %xmm12,%xmm6
ja     12df <zeroin+0x1df>
jmp    12e4 <zeroin+0x1e4>
movapd %xmm9,%xmm0
add    $0x70,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret

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

LLVM IR (-O2):
@DBL_EPSILON = global i32 0
define double @zeroin(double %0, double %1, double (double, double*)* nocapture %2, double* %3, double %4) {
%6 = tail call double %2(double %0, double* %3)
%7 = tail call double %2(double %1, double* %3)
%8 = fmul double %4, 5.000000e-01
%9 = insertelement <2 x double> poison, double %6, i64 0
%10 = shufflevector <2 x double> %9, <2 x double> poison, <2 x i32> zeroinitializer
br label %11
11: ; preds = %120, %5
%12 = phi double [ %7, %5 ], [ %110, %120 ]
%13 = phi double [ %0, %5 ], [ %121, %120 ]
%14 = phi double [ %1, %5 ], [ %109, %120 ]
%15 = phi double [ %0, %5 ], [ %28, %120 ]
%16 = phi <2 x double> [ %10, %5 ], [ %122, %120 ]
%17 = fsub double %14, %15
%18 = extractelement <2 x double> %16, i64 1
%19 = tail call double @llvm.fabs.f64(double %18)
%20 = tail call double @llvm.fabs.f64(double %12)
%21 = fcmp olt double %19, %20
br i1 %21, label %22, label %25
22: ; preds = %11
%23 = insertelement <2 x double> poison, double %12, i64 0
%24 = shufflevector <2 x double> %23, <2 x double> poison, <2 x i32> zeroinitializer
br label %25
25: ; preds = %22, %11
%26 = phi double [ %18, %22 ], [ %12, %11 ]
%27 = phi double [ %14, %22 ], [ %13, %11 ]
%28 = phi double [ %13, %22 ], [ %14, %11 ]
%29 = phi double [ %14, %22 ], [ %15, %11 ]
%30 = phi <2 x double> [ %24, %22 ], [ %16, %11 ]
%31 = load i32, i32* @DBL_EPSILON
%32 = shl nsw i32 %31, 1
%33 = sitofp i32 %32 to double
%34 = tail call double @llvm.fabs.f64(double %28)
%35 = tail call double @llvm.fmuladd.f64(double %33, double %34, double %8)
%36 = fsub double %27, %28
%37 = fmul double %36, 5.000000e-01
%38 = tail call double @llvm.fabs.f64(double %37)
%39 = fcmp ole double %38, %35
%40 = fcmp oeq double %26, 0.000000e+00
%41 = select i1 %39, i1 true, i1 %40
br i1 %41, label %126, label %42
42: ; preds = %25
%43 = tail call double @llvm.fabs.f64(double %17)
%44 = fcmp ult double %43, %35
br i1 %44, label %99, label %45
45: ; preds = %42
%46 = extractelement <2 x double> %30, i64 0
%47 = tail call double @llvm.fabs.f64(double %46)
%48 = tail call double @llvm.fabs.f64(double %26)
%49 = fcmp ogt double %47, %48
br i1 %49, label %50, label %99
50: ; preds = %45
%51 = fcmp oeq double %29, %27
br i1 %51, label %52, label %56
52: ; preds = %50
%53 = fdiv double %26, %46
%54 = fmul double %53, %36
%55 = fsub double 1.000000e+00, %53
br label %77
56: ; preds = %50
%57 = extractelement <2 x double> %30, i64 1
%58 = fdiv double %46, %57
%59 = insertelement <2 x double> poison, double %26, i64 0
%60 = shufflevector <2 x double> %59, <2 x double> poison, <2 x i32> zeroinitializer
%61 = fdiv <2 x double> %60, %30
%62 = fmul double %58, %36
%63 = extractelement <2 x double> %61, i64 1
%64 = fsub double %58, %63
%65 = fsub double %28, %29
%66 = fneg double %65
%67 = fadd <2 x double> %61, <double -1.000000e+00, double -1.000000e+00>
%68 = extractelement <2 x double> %67, i64 1
%69 = fmul double %68, %66
%70 = tail call double @llvm.fmuladd.f64(double %62, double %64, double %69)
%71 = extractelement <2 x double> %61, i64 0
%72 = fmul double %71, %70
%73 = fadd double %58, -1.000000e+00
%74 = fmul double %73, %68
%75 = extractelement <2 x double> %67, i64 0
%76 = fmul double %75, %74
br label %77
77: ; preds = %56, %52
%78 = phi double [ %54, %52 ], [ %72, %56 ]
%79 = phi double [ %55, %52 ], [ %76, %56 ]
%80 = fcmp ogt double %78, 0.000000e+00
%81 = fneg double %79
%82 = fneg double %78
%83 = select i1 %80, double %78, double %82
%84 = select i1 %80, double %81, double %79
%85 = fmul double %36, 7.500000e-01
%86 = fmul double %35, %84
%87 = tail call double @llvm.fabs.f64(double %86)
%88 = fmul double %87, -5.000000e-01
%89 = tail call double @llvm.fmuladd.f64(double %85, double %84, double %88)
%90 = fcmp olt double %83, %89
br i1 %90, label %91, label %99
91: ; preds = %77
%92 = fmul double %17, %84
%93 = fmul double %92, 5.000000e-01
%94 = tail call double @llvm.fabs.f64(double %93)
%95 = fcmp olt double %83, %94
br i1 %95, label %96, label %99
96: ; preds = %91
%97 = fdiv double %83, %84
%98 = tail call double @llvm.fabs.f64(double %97)
br label %99
99: ; preds = %77, %91, %96, %45, %42
%100 = phi double [ %38, %77 ], [ %38, %91 ], [ %98, %96 ], [ %38, %45 ], [ %38, %42 ]
%101 = phi double [ %37, %77 ], [ %37, %91 ], [ %97, %96 ], [ %37, %45 ], [ %37, %42 ]
%102 = fcmp olt double %100, %35
br i1 %102, label %103, label %107
103: ; preds = %99
%104 = fcmp ogt double %101, 0.000000e+00
br i1 %104, label %107, label %105
105: ; preds = %103
%106 = fneg double %35
br label %107
107: ; preds = %103, %105, %99
%108 = phi double [ %106, %105 ], [ %101, %99 ], [ %35, %103 ]
%109 = fadd double %28, %108
%110 = tail call double %2(double %109, double* %3)
%111 = fcmp ogt double %110, 0.000000e+00
%112 = extractelement <2 x double> %30, i64 1
%113 = fcmp ogt double %112, 0.000000e+00
%114 = select i1 %111, i1 %113, i1 false
br i1 %114, label %123, label %115
115: ; preds = %107
%116 = fcmp olt double %110, 0.000000e+00
%117 = fcmp olt double %112, 0.000000e+00
%118 = select i1 %116, i1 %117, i1 false
%119 = insertelement <2 x double> %30, double %26, i64 0
br i1 %118, label %123, label %120
120: ; preds = %115, %123
%121 = phi double [ %27, %115 ], [ %28, %123 ]
%122 = phi <2 x double> [ %119, %115 ], [ %125, %123 ]
br label %11
123: ; preds = %115, %107
%124 = insertelement <2 x double> poison, double %26, i64 0
%125 = shufflevector <2 x double> %124, <2 x double> poison, <2 x i32> zeroinitializer
br label %120
126: ; preds = %25
ret double %28
}