void search(int n, double *x, double t, int *l) {
  int il, iu;
  if (t < x[0]) {
    *l = 0;
    return;
  }
  if (t >= x[n - 1]) {
    *l = n;
    return;
  }
  *l = (*l > 1) ? *l : 1;
  if (*l >= n) {
    *l = n - 1;
  }
  if (t >= x[*l - 1]) {
    if (t < x[*l]) {
      return;
    } else {
      (*l)++;
      if (t < x[*l]) {
        return;
      }
      il = *l + 1;
      iu = n;
    }
  } else {
    (*l)--;
    if (t >= x[*l - 1]) {
      return;
    } else {
      il = 1;
      iu = *l;
    }
  }
  while (1 == 1) {
    *l = (il + iu) / 2;
    if ((iu - il) <= 1) {
      return;
    }
    if (t < x[*l - 1]) {
      iu = *l;
    } else {
      il = *l;
    }
  }
}


x86 assembly (clang, -O0):
<search>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
movsd  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    113a <search+0x3a>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
jmp    12ef <search+0x1ef>
movsd  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x4(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
ucomisd (%rax,%rcx,8),%xmm0
jb     1165 <search+0x65>
mov    -0x4(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
jmp    12ef <search+0x1ef>
mov    -0x20(%rbp),%rax
cmpl   $0x1,(%rax)
jle    1180 <search+0x80>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x2c(%rbp)
jmp    118d <search+0x8d>
mov    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    118d <search+0x8d>
mov    -0x2c(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
cmp    -0x4(%rbp),%eax
jl     11b1 <search+0xb1>
mov    -0x4(%rbp),%ecx
sub    $0x1,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movsd  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
ucomisd (%rax,%rcx,8),%xmm0
jb     123b <search+0x13b>
movsd  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movslq (%rcx),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    11f5 <search+0xf5>
jmp    12ef <search+0x1ef>
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
movsd  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movslq (%rcx),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    1224 <search+0x124>
jmp    12ef <search+0x1ef>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x4(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    1280 <search+0x180>
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
add    $0xffffffff,%ecx
mov    %ecx,(%rax)
movsd  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
ucomisd (%rax,%rcx,8),%xmm0
jb     126b <search+0x16b>
jmp    12ef <search+0x1ef>
movl   $0x1,-0x24(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x28(%rbp)
jmp    1280 <search+0x180>
jmp    1285 <search+0x185>
mov    -0x24(%rbp),%eax
add    -0x28(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%eax
sub    -0x24(%rbp),%eax
cmp    $0x1,%eax
jg     12af <search+0x1af>
jmp    12ef <search+0x1ef>
movsd  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    12e1 <search+0x1e1>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x28(%rbp)
jmp    12ea <search+0x1ea>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x24(%rbp)
jmp    1285 <search+0x185>
pop    %rbp
ret

x86 assembly (clang, -O2):
<search>:
movsd  (%rsi),%xmm1
xor    %ecx,%ecx
ucomisd %xmm0,%xmm1
ja     114f <search+0x4f>
movslq %edi,%rax
ucomisd -0x8(%rsi,%rax,8),%xmm0
jae    114d <search+0x4d>
lea    -0x1(%rdi),%r8d
mov    (%rdx),%ecx
test   %ecx,%ecx
mov    $0x1,%r9d
cmovle %r9d,%ecx
cmp    %edi,%ecx
cmovge %r8d,%ecx
mov    %ecx,(%rdx)
movslq %ecx,%r8
ucomisd -0x8(%rsi,%r8,8),%xmm0
jae    1152 <search+0x52>
lea    -0x1(%r8),%edi
mov    %edi,(%rdx)
ucomisd -0x10(%rsi,%r8,8),%xmm0
jb     1177 <search+0x77>
ret
mov    %edi,%ecx
mov    %ecx,(%rdx)
ret
movsd  (%rsi,%r8,8),%xmm1
ucomisd %xmm0,%xmm1
ja     114c <search+0x4c>
lea    0x1(%r8),%eax
mov    %eax,(%rdx)
movsd  0x8(%rsi,%r8,8),%xmm1
ucomisd %xmm0,%xmm1
ja     114c <search+0x4c>
add    $0x2,%ecx
mov    %ecx,%r9d
lea    (%rdi,%r9,1),%r8d
mov    %r8d,%ecx
shr    $0x1f,%ecx
add    %r8d,%ecx
sar    %ecx
mov    %edi,%eax
sub    %r9d,%eax
cmp    $0x2,%eax
jge    11ba <search+0xba>
jmp    114f <search+0x4f>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %ecx,%r9d
lea    (%rdi,%r9,1),%eax
mov    %eax,%ecx
shr    $0x1f,%ecx
add    %eax,%ecx
sar    %ecx
mov    %edi,%eax
sub    %r9d,%eax
cmp    $0x1,%eax
jle    114f <search+0x4f>
movslq %ecx,%rax
movsd  -0x8(%rsi,%rax,8),%xmm1
ucomisd %xmm0,%xmm1
jbe    11a0 <search+0xa0>
mov    %ecx,%edi
jmp    11a3 <search+0xa3>

LLVM IR (-O0):
define void @search(i32 %0, double* %1, double %2, i32* %3) {
%5 = alloca i32
%6 = alloca double*
%7 = alloca double
%8 = alloca i32*
%9 = alloca i32
%10 = alloca i32
store i32 %0, i32* %5
store double* %1, double** %6
store double %2, double* %7
store i32* %3, i32** %8
%11 = load double, double* %7
%12 = load double*, double** %6
%13 = getelementptr inbounds double, double* %12, i64 0
%14 = load double, double* %13
%15 = fcmp olt double %11, %14
br i1 %15, label %16, label %18
16: ; preds = %4
%17 = load i32*, i32** %8
store i32 0, i32* %17
br label %135
18: ; preds = %4
%19 = load double, double* %7
%20 = load double*, double** %6
%21 = load i32, i32* %5
%22 = sub nsw i32 %21, 1
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds double, double* %20, i64 %23
%25 = load double, double* %24
%26 = fcmp oge double %19, %25
br i1 %26, label %27, label %30
27: ; preds = %18
%28 = load i32, i32* %5
%29 = load i32*, i32** %8
store i32 %28, i32* %29
br label %135
30: ; preds = %18
%31 = load i32*, i32** %8
%32 = load i32, i32* %31
%33 = icmp sgt i32 %32, 1
br i1 %33, label %34, label %37
34: ; preds = %30
%35 = load i32*, i32** %8
%36 = load i32, i32* %35
br label %38
37: ; preds = %30
br label %38
38: ; preds = %37, %34
%39 = phi i32 [ %36, %34 ], [ 1, %37 ]
%40 = load i32*, i32** %8
store i32 %39, i32* %40
%41 = load i32*, i32** %8
%42 = load i32, i32* %41
%43 = load i32, i32* %5
%44 = icmp sge i32 %42, %43
br i1 %44, label %45, label %49
45: ; preds = %38
%46 = load i32, i32* %5
%47 = sub nsw i32 %46, 1
%48 = load i32*, i32** %8
store i32 %47, i32* %48
br label %49
49: ; preds = %45, %38
%50 = load double, double* %7
%51 = load double*, double** %6
%52 = load i32*, i32** %8
%53 = load i32, i32* %52
%54 = sub nsw i32 %53, 1
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds double, double* %51, i64 %55
%57 = load double, double* %56
%58 = fcmp oge double %50, %57
br i1 %58, label %59, label %88
59: ; preds = %49
%60 = load double, double* %7
%61 = load double*, double** %6
%62 = load i32*, i32** %8
%63 = load i32, i32* %62
%64 = sext i32 %63 to i64
%65 = getelementptr inbounds double, double* %61, i64 %64
%66 = load double, double* %65
%67 = fcmp olt double %60, %66
br i1 %67, label %68, label %69
68: ; preds = %59
br label %135
69: ; preds = %59
%70 = load i32*, i32** %8
%71 = load i32, i32* %70
%72 = add nsw i32 %71, 1
store i32 %72, i32* %70
%73 = load double, double* %7
%74 = load double*, double** %6
%75 = load i32*, i32** %8
%76 = load i32, i32* %75
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds double, double* %74, i64 %77
%79 = load double, double* %78
%80 = fcmp olt double %73, %79
br i1 %80, label %81, label %82
81: ; preds = %69
br label %135
82: ; preds = %69
%83 = load i32*, i32** %8
%84 = load i32, i32* %83
%85 = add nsw i32 %84, 1
store i32 %85, i32* %9
%86 = load i32, i32* %5
store i32 %86, i32* %10
br label %87
87: ; preds = %82
br label %106
88: ; preds = %49
%89 = load i32*, i32** %8
%90 = load i32, i32* %89
%91 = add nsw i32 %90, -1
store i32 %91, i32* %89
%92 = load double, double* %7
%93 = load double*, double** %6
%94 = load i32*, i32** %8
%95 = load i32, i32* %94
%96 = sub nsw i32 %95, 1
%97 = sext i32 %96 to i64
%98 = getelementptr inbounds double, double* %93, i64 %97
%99 = load double, double* %98
%100 = fcmp oge double %92, %99
br i1 %100, label %101, label %102
101: ; preds = %88
br label %135
102: ; preds = %88
store i32 1, i32* %9
%103 = load i32*, i32** %8
%104 = load i32, i32* %103
store i32 %104, i32* %10
br label %105
105: ; preds = %102
br label %106
106: ; preds = %105, %87
br label %107
107: ; preds = %106, %134
%108 = load i32, i32* %9
%109 = load i32, i32* %10
%110 = add nsw i32 %108, %109
%111 = sdiv i32 %110, 2
%112 = load i32*, i32** %8
store i32 %111, i32* %112
%113 = load i32, i32* %10
%114 = load i32, i32* %9
%115 = sub nsw i32 %113, %114
%116 = icmp sle i32 %115, 1
br i1 %116, label %117, label %118
117: ; preds = %107
br label %135
118: ; preds = %107
%119 = load double, double* %7
%120 = load double*, double** %6
%121 = load i32*, i32** %8
%122 = load i32, i32* %121
%123 = sub nsw i32 %122, 1
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds double, double* %120, i64 %124
%126 = load double, double* %125
%127 = fcmp olt double %119, %126
br i1 %127, label %128, label %131
128: ; preds = %118
%129 = load i32*, i32** %8
%130 = load i32, i32* %129
store i32 %130, i32* %10
br label %134
131: ; preds = %118
%132 = load i32*, i32** %8
%133 = load i32, i32* %132
store i32 %133, i32* %9
br label %134
134: ; preds = %131, %128
br label %107
135: ; preds = %117, %101, %81, %68, %27, %16
ret void
}

LLVM IR (-O2):
define void @search(i32 %0, double* nocapture %1, double %2, i32* nocapture %3) {
%5 = load double, double* %1
%6 = fcmp ogt double %5, %2
br i1 %6, label %65, label %7
7: ; preds = %4
%8 = add nsw i32 %0, -1
%9 = sext i32 %8 to i64
%10 = getelementptr inbounds double, double* %1, i64 %9
%11 = load double, double* %10
%12 = fcmp ugt double %11, %2
br i1 %12, label %13, label %65
13: ; preds = %7
%14 = load i32, i32* %3
%15 = icmp sgt i32 %14, 1
%16 = select i1 %15, i32 %14, i32 1
%17 = icmp slt i32 %16, %0
%18 = select i1 %17, i32 %16, i32 %8
store i32 %18, i32* %3
%19 = add nsw i32 %18, -1
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds double, double* %1, i64 %20
%22 = load double, double* %21
%23 = fcmp ugt double %22, %2
br i1 %23, label %37, label %24
24: ; preds = %13
%25 = sext i32 %18 to i64
%26 = getelementptr inbounds double, double* %1, i64 %25
%27 = load double, double* %26
%28 = fcmp ogt double %27, %2
br i1 %28, label %67, label %29
29: ; preds = %24
%30 = add nsw i32 %18, 1
store i32 %30, i32* %3
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds double, double* %1, i64 %31
%33 = load double, double* %32
%34 = fcmp ogt double %33, %2
br i1 %34, label %67, label %35
35: ; preds = %29
%36 = add nsw i32 %18, 2
br label %43
37: ; preds = %13
store i32 %19, i32* %3
%38 = add nsw i32 %18, -2
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds double, double* %1, i64 %39
%41 = load double, double* %40
%42 = fcmp ugt double %41, %2
br i1 %42, label %43, label %67
43: ; preds = %37, %35
%44 = phi i32 [ %36, %35 ], [ 1, %37 ]
%45 = phi i32 [ %0, %35 ], [ %19, %37 ]
%46 = add nsw i32 %45, %44
%47 = sdiv i32 %46, 2
%48 = sub nsw i32 %45, %44
%49 = icmp slt i32 %48, 2
br i1 %49, label %65, label %50
50: ; preds = %43, %50
%51 = phi i32 [ %62, %50 ], [ %47, %43 ]
%52 = phi i32 [ %60, %50 ], [ %45, %43 ]
%53 = phi i32 [ %59, %50 ], [ %44, %43 ]
%54 = add nsw i32 %51, -1
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds double, double* %1, i64 %55
%57 = load double, double* %56
%58 = fcmp ogt double %57, %2
%59 = select i1 %58, i32 %53, i32 %51
%60 = select i1 %58, i32 %51, i32 %52
%61 = add nsw i32 %60, %59
%62 = sdiv i32 %61, 2
%63 = sub nsw i32 %60, %59
%64 = icmp slt i32 %63, 2
br i1 %64, label %65, label %50
65: ; preds = %50, %43, %7, %4
%66 = phi i32 [ 0, %4 ], [ %0, %7 ], [ %47, %43 ], [ %62, %50 ]
store i32 %66, i32* %3
br label %67
67: ; preds = %65, %37, %29, %24
ret void
}