#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 ceil_away0(double const);
scalar_t__ sqrt(double);
int get_interval_from_guess(const double *const arr, const int N,
                            const double t, int i) {
  int sqrt_nt = (int)sqrt((double)N) + 1;
  int h;
  int di;
  double dtdi;
  int lower_bound = -1;
  int upper_bound = N;
  int gteq_ti;
  int lt_tip1;
  int eq_tip1;
  if (N <= 2)
    return 0;
  if (t < arr[0])
    return -1;
  if (i > N - 2)
    i = N - 2;
  else if (i < 0)
    i = 0;
  gteq_ti = (t >= arr[i]);
  lt_tip1 = (t < arr[i + 1]);
  eq_tip1 = (t == arr[i + 1]);
  if (eq_tip1)
    return i + 1;
  while (!(gteq_ti & lt_tip1)) {
    if (gteq_ti)
      h = sqrt_nt;
    else
      h = -sqrt_nt;
    while (((i + h) >= upper_bound) || ((i + h) <= lower_bound)) {
      h /= 2;
      if (h == 0) {
        h = (upper_bound - lower_bound) - i;
        break;
      }
    }
    dtdi = (arr[i + h] - arr[i]) / h;
    di = ceil_away0((t - arr[i]) / dtdi);
    while (((i + di) >= upper_bound) || ((i + di) <= lower_bound)) {
      di /= 2;
      if (di == 0)
        di = (upper_bound - lower_bound) - i;
    }
    i += di;
    gteq_ti = (t >= arr[i]);
    lt_tip1 = (t < arr[i + 1]);
    eq_tip1 = (t == arr[i + 1]);
    if (eq_tip1)
      return i + 1;
    if ((gteq_ti) && (i > lower_bound))
      lower_bound = i;
    if ((lt_tip1) && (i < upper_bound))
      upper_bound = i;
    if ((i == lower_bound) && (i + 1 == upper_bound))
      return i;
  }
  return i;
}


x86 assembly (clang, -O0):
<get_interval_from_guess>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movsd  %xmm0,-0x20(%rbp)
mov    %edx,-0x24(%rbp)
cvtsi2sdl -0x14(%rbp),%xmm0
call   1030 <sqrt@plt>
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
movl   $0xffffffff,-0x3c(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x40(%rbp)
cmpl   $0x2,-0x14(%rbp)
jg     116a <get_interval_from_guess+0x4a>
movl   $0x0,-0x4(%rbp)
jmp    1483 <get_interval_from_guess+0x363>
movsd  -0x20(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    118d <get_interval_from_guess+0x6d>
movl   $0xffffffff,-0x4(%rbp)
jmp    1483 <get_interval_from_guess+0x363>
mov    -0x24(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x2,%ecx
cmp    %ecx,%eax
jle    11ac <get_interval_from_guess+0x8c>
mov    -0x14(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x24(%rbp)
jmp    11c2 <get_interval_from_guess+0xa2>
cmpl   $0x0,-0x24(%rbp)
jge    11bd <get_interval_from_guess+0x9d>
movl   $0x0,-0x24(%rbp)
jmp    11c2 <get_interval_from_guess+0xa2>
movsd  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x44(%rbp)
movsd  -0x20(%rbp),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x48(%rbp)
movsd  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
ucomisd (%rax,%rcx,8),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
je     1244 <get_interval_from_guess+0x124>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1483 <get_interval_from_guess+0x363>
jmp    1249 <get_interval_from_guess+0x129>
mov    -0x44(%rbp),%eax
and    -0x48(%rbp),%eax
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
test   $0x1,%al
jne    1264 <get_interval_from_guess+0x144>
jmp    147d <get_interval_from_guess+0x35d>
cmpl   $0x0,-0x44(%rbp)
je     1279 <get_interval_from_guess+0x159>
mov    -0x28(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    1281 <get_interval_from_guess+0x161>
xor    %eax,%eax
sub    -0x28(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    1286 <get_interval_from_guess+0x166>
mov    -0x24(%rbp),%ecx
add    -0x2c(%rbp),%ecx
mov    $0x1,%al
cmp    -0x40(%rbp),%ecx
mov    %al,-0x4d(%rbp)
jge    12a9 <get_interval_from_guess+0x189>
mov    -0x24(%rbp),%eax
add    -0x2c(%rbp),%eax
cmp    -0x3c(%rbp),%eax
setle  %al
mov    %al,-0x4d(%rbp)
mov    -0x4d(%rbp),%al
test   $0x1,%al
jne    12b9 <get_interval_from_guess+0x199>
jmp    12e7 <get_interval_from_guess+0x1c7>
mov    -0x2c(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x2c(%rbp)
cmpl   $0x0,-0x2c(%rbp)
jne    12e2 <get_interval_from_guess+0x1c2>
mov    -0x40(%rbp),%eax
sub    -0x3c(%rbp),%eax
sub    -0x24(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    12e7 <get_interval_from_guess+0x1c7>
jmp    1286 <get_interval_from_guess+0x166>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
cvtsi2sdl -0x2c(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
divsd  -0x38(%rbp),%xmm0
call   1040 <ceil_away0@plt>
mov    %eax,-0x30(%rbp)
mov    -0x24(%rbp),%ecx
add    -0x30(%rbp),%ecx
mov    $0x1,%al
cmp    -0x40(%rbp),%ecx
mov    %al,-0x4e(%rbp)
jge    1356 <get_interval_from_guess+0x236>
mov    -0x24(%rbp),%eax
add    -0x30(%rbp),%eax
cmp    -0x3c(%rbp),%eax
setle  %al
mov    %al,-0x4e(%rbp)
mov    -0x4e(%rbp),%al
test   $0x1,%al
jne    1366 <get_interval_from_guess+0x246>
jmp    138f <get_interval_from_guess+0x26f>
mov    -0x30(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x30(%rbp)
cmpl   $0x0,-0x30(%rbp)
jne    138a <get_interval_from_guess+0x26a>
mov    -0x40(%rbp),%eax
sub    -0x3c(%rbp),%eax
sub    -0x24(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    1333 <get_interval_from_guess+0x213>
mov    -0x30(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
movsd  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x44(%rbp)
movsd  -0x20(%rbp),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x48(%rbp)
movsd  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
ucomisd (%rax,%rcx,8),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
je     141a <get_interval_from_guess+0x2fa>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1483 <get_interval_from_guess+0x363>
cmpl   $0x0,-0x44(%rbp)
je     1436 <get_interval_from_guess+0x316>
mov    -0x24(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jle    1436 <get_interval_from_guess+0x316>
mov    -0x24(%rbp),%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0x0,-0x48(%rbp)
je     1452 <get_interval_from_guess+0x332>
mov    -0x24(%rbp),%eax
cmp    -0x40(%rbp),%eax
jge    1452 <get_interval_from_guess+0x332>
mov    -0x24(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jne    1478 <get_interval_from_guess+0x358>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
cmp    -0x40(%rbp),%eax
jne    1478 <get_interval_from_guess+0x358>
mov    -0x24(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1483 <get_interval_from_guess+0x363>
jmp    1249 <get_interval_from_guess+0x129>
mov    -0x24(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_interval_from_guess>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %edx,%r12d
movsd  %xmm0,(%rsp)
mov    %esi,%ebx
mov    %rdi,%r14
xorps  %xmm0,%xmm0
cvtsi2sd %esi,%xmm0
call   1030 <sqrt@plt>
movsd  (%rsp),%xmm3
mov    %rax,%r15
xor    %eax,%eax
cmp    $0x3,%ebx
jl     118d <get_interval_from_guess+0x6d>
movsd  (%r14),%xmm0
mov    $0xffffffff,%eax
ucomisd %xmm3,%xmm0
ja     118d <get_interval_from_guess+0x6d>
xor    %ebp,%ebp
test   %r12d,%r12d
cmovns %r12d,%ebp
lea    -0x2(%rbx),%eax
cmp    %r12d,%eax
cmovl  %eax,%ebp
lea    0x1(%r15),%r12d
movsd  0x8(%r14,%rbp,8),%xmm0
ucomisd %xmm3,%xmm0
jne    119c <get_interval_from_guess+0x7c>
jp     119c <get_interval_from_guess+0x7c>
add    $0x1,%ebp
mov    %ebp,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
seta   %dl
mov    %ebp,%eax
ucomisd (%r14,%rax,8),%xmm3
setae  %cl
not    %r15d
mov    $0xffffffff,%r13d
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
test   $0x1,%cl
je     11ca <get_interval_from_guess+0xaa>
test   $0x1,%dl
jne    118b <get_interval_from_guess+0x6b>
test   $0x1,%cl
mov    %r15d,%eax
cmovne %r12d,%eax
jmp    11f3 <get_interval_from_guess+0xd3>
cs nopw 0x0(%rax,%rax,1)
mov    %eax,%ecx
shr    $0x1f,%ecx
add    %eax,%ecx
sar    %ecx
add    $0x1,%eax
cmp    $0x2,%eax
mov    %ecx,%eax
jbe    1210 <get_interval_from_guess+0xf0>
lea    (%rax,%rbp,1),%ecx
cmp    %ebx,%ecx
jge    11e0 <get_interval_from_guess+0xc0>
cmp    %r13d,%ecx
jle    11e0 <get_interval_from_guess+0xc0>
jmp    121a <get_interval_from_guess+0xfa>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %ebx,%eax
sub    %r13d,%eax
sub    %ebp,%eax
lea    (%rax,%rbp,1),%ecx
movslq %ecx,%rcx
movsd  (%r14,%rcx,8),%xmm1
movslq %ebp,%rcx
movsd  (%r14,%rcx,8),%xmm2
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
subsd  %xmm2,%xmm1
divsd  %xmm0,%xmm1
movapd %xmm3,%xmm0
subsd  %xmm2,%xmm0
divsd  %xmm1,%xmm0
call   1040 <ceil_away0@plt>
mov    %eax,%ecx
lea    (%rcx,%rbp,1),%eax
cmp    %ebx,%eax
jge    125a <get_interval_from_guess+0x13a>
cmp    %r13d,%eax
jg     1293 <get_interval_from_guess+0x173>
mov    %ebx,%edx
sub    %r13d,%edx
sub    %ebp,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
lea    0x1(%rcx),%eax
mov    %edx,%esi
cmp    $0x3,%eax
jb     1283 <get_interval_from_guess+0x163>
mov    %ecx,%esi
shr    $0x1f,%esi
add    %ecx,%esi
sar    %esi
lea    (%rsi,%rbp,1),%eax
mov    %esi,%ecx
cmp    %ebx,%eax
jge    1270 <get_interval_from_guess+0x150>
mov    %esi,%ecx
cmp    %r13d,%eax
jle    1270 <get_interval_from_guess+0x150>
movslq %eax,%rsi
movsd  (%r14,%rsi,8),%xmm0
movsd  (%rsp),%xmm3
ucomisd %xmm0,%xmm3
setae  %cl
add    $0x1,%esi
movsd  (%r14,%rsi,8),%xmm1
ucomisd %xmm3,%xmm1
seta   %dl
jne    12bc <get_interval_from_guess+0x19c>
jnp    12e5 <get_interval_from_guess+0x1c5>
ucomisd %xmm0,%xmm3
cmovae %eax,%r13d
ucomisd %xmm3,%xmm1
cmova  %eax,%ebx
mov    %eax,%ebp
cmp    %r13d,%eax
jne    11c0 <get_interval_from_guess+0xa0>
mov    %eax,%ebp
cmp    %ebx,%esi
jne    11c0 <get_interval_from_guess+0xa0>
jmp    118d <get_interval_from_guess+0x6d>
mov    %esi,%eax
jmp    118d <get_interval_from_guess+0x6d>

LLVM IR (-O0):
define i32 @get_interval_from_guess(double* %0, i32 %1, double %2, i32 %3) {
%5 = alloca i32
%6 = alloca double*
%7 = alloca i32
%8 = alloca double
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca double
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
store double* %0, double** %6
store i32 %1, i32* %7
store double %2, double* %8
store i32 %3, i32* %9
%19 = load i32, i32* %7
%20 = sitofp i32 %19 to double
%21 = call i64 @sqrt(double %20)
%22 = trunc i64 %21 to i32
%23 = add nsw i32 %22, 1
store i32 %23, i32* %10
store i32 -1, i32* %14
%24 = load i32, i32* %7
store i32 %24, i32* %15
%25 = load i32, i32* %7
%26 = icmp sle i32 %25, 2
br i1 %26, label %27, label %28
27: ; preds = %4
store i32 0, i32* %5
br label %242
28: ; preds = %4
%29 = load double, double* %8
%30 = load double*, double** %6
%31 = getelementptr inbounds double, double* %30, i64 0
%32 = load double, double* %31
%33 = fcmp olt double %29, %32
br i1 %33, label %34, label %35
34: ; preds = %28
store i32 -1, i32* %5
br label %242
35: ; preds = %28
%36 = load i32, i32* %9
%37 = load i32, i32* %7
%38 = sub nsw i32 %37, 2
%39 = icmp sgt i32 %36, %38
br i1 %39, label %40, label %43
40: ; preds = %35
%41 = load i32, i32* %7
%42 = sub nsw i32 %41, 2
store i32 %42, i32* %9
br label %48
43: ; preds = %35
%44 = load i32, i32* %9
%45 = icmp slt i32 %44, 0
br i1 %45, label %46, label %47
46: ; preds = %43
store i32 0, i32* %9
br label %47
47: ; preds = %46, %43
br label %48
48: ; preds = %47, %40
%49 = load double, double* %8
%50 = load double*, double** %6
%51 = load i32, i32* %9
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds double, double* %50, i64 %52
%54 = load double, double* %53
%55 = fcmp oge double %49, %54
%56 = zext i1 %55 to i32
store i32 %56, i32* %16
%57 = load double, double* %8
%58 = load double*, double** %6
%59 = load i32, i32* %9
%60 = add nsw i32 %59, 1
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds double, double* %58, i64 %61
%63 = load double, double* %62
%64 = fcmp olt double %57, %63
%65 = zext i1 %64 to i32
store i32 %65, i32* %17
%66 = load double, double* %8
%67 = load double*, double** %6
%68 = load i32, i32* %9
%69 = add nsw i32 %68, 1
%70 = sext i32 %69 to i64
%71 = getelementptr inbounds double, double* %67, i64 %70
%72 = load double, double* %71
%73 = fcmp oeq double %66, %72
%74 = zext i1 %73 to i32
store i32 %74, i32* %18
%75 = load i32, i32* %18
%76 = icmp ne i32 %75, 0
br i1 %76, label %77, label %80
77: ; preds = %48
%78 = load i32, i32* %9
%79 = add nsw i32 %78, 1
store i32 %79, i32* %5
br label %242
80: ; preds = %48
br label %81
81: ; preds = %239, %80
%82 = load i32, i32* %16
%83 = load i32, i32* %17
%84 = and i32 %82, %83
%85 = icmp ne i32 %84, 0
%86 = xor i1 %85, true
br i1 %86, label %87, label %240
87: ; preds = %81
%88 = load i32, i32* %16
%89 = icmp ne i32 %88, 0
br i1 %89, label %90, label %92
90: ; preds = %87
%91 = load i32, i32* %10
store i32 %91, i32* %11
br label %95
92: ; preds = %87
%93 = load i32, i32* %10
%94 = sub nsw i32 0, %93
store i32 %94, i32* %11
br label %95
95: ; preds = %92, %90
br label %96
96: ; preds = %121, %95
%97 = load i32, i32* %9
%98 = load i32, i32* %11
%99 = add nsw i32 %97, %98
%100 = load i32, i32* %15
%101 = icmp sge i32 %99, %100
br i1 %101, label %108, label %102
102: ; preds = %96
%103 = load i32, i32* %9
%104 = load i32, i32* %11
%105 = add nsw i32 %103, %104
%106 = load i32, i32* %14
%107 = icmp sle i32 %105, %106
br label %108
108: ; preds = %102, %96
%109 = phi i1 [ true, %96 ], [ %107, %102 ]
br i1 %109, label %110, label %122
110: ; preds = %108
%111 = load i32, i32* %11
%112 = sdiv i32 %111, 2
store i32 %112, i32* %11
%113 = load i32, i32* %11
%114 = icmp eq i32 %113, 0
br i1 %114, label %115, label %121
115: ; preds = %110
%116 = load i32, i32* %15
%117 = load i32, i32* %14
%118 = sub nsw i32 %116, %117
%119 = load i32, i32* %9
%120 = sub nsw i32 %118, %119
store i32 %120, i32* %11
br label %122
121: ; preds = %110
br label %96
122: ; preds = %115, %108
%123 = load double*, double** %6
%124 = load i32, i32* %9
%125 = load i32, i32* %11
%126 = add nsw i32 %124, %125
%127 = sext i32 %126 to i64
%128 = getelementptr inbounds double, double* %123, i64 %127
%129 = load double, double* %128
%130 = load double*, double** %6
%131 = load i32, i32* %9
%132 = sext i32 %131 to i64
%133 = getelementptr inbounds double, double* %130, i64 %132
%134 = load double, double* %133
%135 = fsub double %129, %134
%136 = load i32, i32* %11
%137 = sitofp i32 %136 to double
%138 = fdiv double %135, %137
store double %138, double* %13
%139 = load double, double* %8
%140 = load double*, double** %6
%141 = load i32, i32* %9
%142 = sext i32 %141 to i64
%143 = getelementptr inbounds double, double* %140, i64 %142
%144 = load double, double* %143
%145 = fsub double %139, %144
%146 = load double, double* %13
%147 = fdiv double %145, %146
%148 = call i32 @ceil_away0(double %147)
store i32 %148, i32* %12
br label %149
149: ; preds = %174, %122
%150 = load i32, i32* %9
%151 = load i32, i32* %12
%152 = add nsw i32 %150, %151
%153 = load i32, i32* %15
%154 = icmp sge i32 %152, %153
br i1 %154, label %161, label %155
155: ; preds = %149
%156 = load i32, i32* %9
%157 = load i32, i32* %12
%158 = add nsw i32 %156, %157
%159 = load i32, i32* %14
%160 = icmp sle i32 %158, %159
br label %161
161: ; preds = %155, %149
%162 = phi i1 [ true, %149 ], [ %160, %155 ]
br i1 %162, label %163, label %175
163: ; preds = %161
%164 = load i32, i32* %12
%165 = sdiv i32 %164, 2
store i32 %165, i32* %12
%166 = load i32, i32* %12
%167 = icmp eq i32 %166, 0
br i1 %167, label %168, label %174
168: ; preds = %163
%169 = load i32, i32* %15
%170 = load i32, i32* %14
%171 = sub nsw i32 %169, %170
%172 = load i32, i32* %9
%173 = sub nsw i32 %171, %172
store i32 %173, i32* %12
br label %174
174: ; preds = %168, %163
br label %149
175: ; preds = %161
%176 = load i32, i32* %12
%177 = load i32, i32* %9
%178 = add nsw i32 %177, %176
store i32 %178, i32* %9
%179 = load double, double* %8
%180 = load double*, double** %6
%181 = load i32, i32* %9
%182 = sext i32 %181 to i64
%183 = getelementptr inbounds double, double* %180, i64 %182
%184 = load double, double* %183
%185 = fcmp oge double %179, %184
%186 = zext i1 %185 to i32
store i32 %186, i32* %16
%187 = load double, double* %8
%188 = load double*, double** %6
%189 = load i32, i32* %9
%190 = add nsw i32 %189, 1
%191 = sext i32 %190 to i64
%192 = getelementptr inbounds double, double* %188, i64 %191
%193 = load double, double* %192
%194 = fcmp olt double %187, %193
%195 = zext i1 %194 to i32
store i32 %195, i32* %17
%196 = load double, double* %8
%197 = load double*, double** %6
%198 = load i32, i32* %9
%199 = add nsw i32 %198, 1
%200 = sext i32 %199 to i64
%201 = getelementptr inbounds double, double* %197, i64 %200
%202 = load double, double* %201
%203 = fcmp oeq double %196, %202
%204 = zext i1 %203 to i32
store i32 %204, i32* %18
%205 = load i32, i32* %18
%206 = icmp ne i32 %205, 0
br i1 %206, label %207, label %210
207: ; preds = %175
%208 = load i32, i32* %9
%209 = add nsw i32 %208, 1
store i32 %209, i32* %5
br label %242
210: ; preds = %175
%211 = load i32, i32* %16
%212 = icmp ne i32 %211, 0
br i1 %212, label %213, label %219
213: ; preds = %210
%214 = load i32, i32* %9
%215 = load i32, i32* %14
%216 = icmp sgt i32 %214, %215
br i1 %216, label %217, label %219
217: ; preds = %213
%218 = load i32, i32* %9
store i32 %218, i32* %14
br label %219
219: ; preds = %217, %213, %210
%220 = load i32, i32* %17
%221 = icmp ne i32 %220, 0
br i1 %221, label %222, label %228
222: ; preds = %219
%223 = load i32, i32* %9
%224 = load i32, i32* %15
%225 = icmp slt i32 %223, %224
br i1 %225, label %226, label %228
226: ; preds = %222
%227 = load i32, i32* %9
store i32 %227, i32* %15
br label %228
228: ; preds = %226, %222, %219
%229 = load i32, i32* %9
%230 = load i32, i32* %14
%231 = icmp eq i32 %229, %230
br i1 %231, label %232, label %239
232: ; preds = %228
%233 = load i32, i32* %9
%234 = add nsw i32 %233, 1
%235 = load i32, i32* %15
%236 = icmp eq i32 %234, %235
br i1 %236, label %237, label %239
237: ; preds = %232
%238 = load i32, i32* %9
store i32 %238, i32* %5
br label %242
239: ; preds = %232, %228
br label %81
240: ; preds = %81
%241 = load i32, i32* %9
store i32 %241, i32* %5
br label %242
242: ; preds = %240, %237, %207, %77, %34, %27
%243 = load i32, i32* %5
ret i32 %243
}

LLVM IR (-O2):
define i32 @get_interval_from_guess(double* nocapture %0, i32 %1, double %2, i32 %3) {
%5 = sitofp i32 %1 to double
%6 = tail call i64 @sqrt(double %5)
%7 = trunc i64 %6 to i32
%8 = add nsw i32 %7, 1
%9 = icmp slt i32 %1, 3
br i1 %9, label %104, label %10
10: ; preds = %4
%11 = load double, double* %0
%12 = fcmp ogt double %11, %2
br i1 %12, label %104, label %13
13: ; preds = %10
%14 = add nsw i32 %1, -2
%15 = icmp slt i32 %14, %3
%16 = icmp sgt i32 %3, 0
%17 = select i1 %16, i32 %3, i32 0
%18 = select i1 %15, i32 %14, i32 %17
%19 = add nuw nsw i32 %18, 1
%20 = zext i32 %19 to i64
%21 = getelementptr inbounds double, double* %0, i64 %20
%22 = load double, double* %21
%23 = fcmp oeq double %22, %2
br i1 %23, label %104, label %24
24: ; preds = %13
%25 = fcmp ogt double %22, %2
%26 = zext i32 %18 to i64
%27 = getelementptr inbounds double, double* %0, i64 %26
%28 = load double, double* %27
%29 = fcmp ole double %28, %2
%30 = xor i32 %7, -1
br label %31
31: ; preds = %24, %98
%32 = phi i32 [ %87, %98 ], [ %18, %24 ]
%33 = phi i32 [ %99, %98 ], [ -1, %24 ]
%34 = phi i32 [ %100, %98 ], [ %1, %24 ]
%35 = phi i1 [ %91, %98 ], [ %29, %24 ]
%36 = phi i1 [ %96, %98 ], [ %25, %24 ]
%37 = and i1 %35, %36
br i1 %37, label %104, label %38
38: ; preds = %31
%39 = select i1 %35, i32 %8, i32 %30
br label %40
40: ; preds = %46, %38
%41 = phi i32 [ %39, %38 ], [ %47, %46 ]
%42 = add nsw i32 %41, %32
%43 = icmp slt i32 %42, %34
%44 = icmp sgt i32 %42, %33
%45 = select i1 %43, i1 %44, i1 false
br i1 %45, label %54, label %46
46: ; preds = %40
%47 = sdiv i32 %41, 2
%48 = add i32 %41, 1
%49 = icmp ult i32 %48, 3
br i1 %49, label %50, label %40
50: ; preds = %46
%51 = add i32 %33, %32
%52 = sub i32 %34, %51
%53 = add nsw i32 %52, %32
br label %54
54: ; preds = %40, %50
%55 = phi i32 [ %53, %50 ], [ %42, %40 ]
%56 = phi i32 [ %52, %50 ], [ %41, %40 ]
%57 = sext i32 %55 to i64
%58 = getelementptr inbounds double, double* %0, i64 %57
%59 = load double, double* %58
%60 = sext i32 %32 to i64
%61 = getelementptr inbounds double, double* %0, i64 %60
%62 = load double, double* %61
%63 = fsub double %59, %62
%64 = sitofp i32 %56 to double
%65 = fdiv double %63, %64
%66 = fsub double %2, %62
%67 = fdiv double %66, %65
%68 = tail call i32 @ceil_away0(double %67)
%69 = add nsw i32 %68, %32
%70 = icmp slt i32 %69, %34
%71 = icmp sgt i32 %69, %33
%72 = select i1 %70, i1 %71, i1 false
br i1 %72, label %86, label %73
73: ; preds = %54
%74 = add i32 %33, %32
%75 = sub i32 %34, %74
br label %76
76: ; preds = %73, %76
%77 = phi i32 [ %68, %73 ], [ %81, %76 ]
%78 = sdiv i32 %77, 2
%79 = add i32 %77, 1
%80 = icmp ult i32 %79, 3
%81 = select i1 %80, i32 %75, i32 %78
%82 = add nsw i32 %81, %32
%83 = icmp slt i32 %82, %34
%84 = icmp sgt i32 %82, %33
%85 = select i1 %83, i1 %84, i1 false
br i1 %85, label %86, label %76
86: ; preds = %76, %54
%87 = phi i32 [ %69, %54 ], [ %82, %76 ]
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds double, double* %0, i64 %88
%90 = load double, double* %89
%91 = fcmp ole double %90, %2
%92 = add nsw i32 %87, 1
%93 = zext i32 %92 to i64
%94 = getelementptr inbounds double, double* %0, i64 %93
%95 = load double, double* %94
%96 = fcmp ogt double %95, %2
%97 = fcmp oeq double %95, %2
br i1 %97, label %104, label %98
98: ; preds = %86
%99 = select i1 %91, i32 %87, i32 %33
%100 = select i1 %96, i32 %87, i32 %34
%101 = icmp eq i32 %87, %99
%102 = icmp eq i32 %92, %100
%103 = select i1 %101, i1 %102, i1 false
br i1 %103, label %104, label %31
104: ; preds = %31, %98, %86, %13, %10, %4
%105 = phi i32 [ 0, %4 ], [ -1, %10 ], [ %19, %13 ], [ %32, %31 ], [ %87, %98 ], [ %92, %86 ]
ret i32 %105
}