extern int contains_element(const int *a, const int a_cnt, const int elem) {
  if (a_cnt < 5) {
    int i;
    for (i = 0; i < a_cnt && !(a[i] > elem); i++)
      if (a[i] == elem)
        return i + 1;
    return 0;
  } else {
    int mid;
    int low = 0;
    int high = a_cnt - 1;
    while (low <= high) {
      mid = (low + high) / 2;
      if (a[mid] > elem)
        high = mid - 1;
      else if (a[mid] < elem)
        low = mid + 1;
      else
        return mid + 1;
    }
    return 0;
  }
}


x86 assembly (clang, -O0):
<contains_element>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
cmpl   $0x5,-0x14(%rbp)
jge    1197 <contains_element+0x97>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%ecx
xor    %eax,%eax
cmp    -0x14(%rbp),%ecx
mov    %al,-0x29(%rbp)
jge    1146 <contains_element+0x46>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x18(%rbp),%eax
setg   %al
xor    $0xff,%al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
test   $0x1,%al
jne    1156 <contains_element+0x56>
jmp    118b <contains_element+0x8b>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x18(%rbp),%eax
jne    1178 <contains_element+0x78>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1227 <contains_element+0x127>
jmp    117d <contains_element+0x7d>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    111f <contains_element+0x1f>
movl   $0x0,-0x4(%rbp)
jmp    1227 <contains_element+0x127>
movl   $0x0,-0x24(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x28(%rbp),%eax
jg     1220 <contains_element+0x120>
mov    -0x24(%rbp),%eax
add    -0x28(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x18(%rbp),%eax
jle    11e6 <contains_element+0xe6>
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    121b <contains_element+0x11b>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x18(%rbp),%eax
jge    1208 <contains_element+0x108>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1216 <contains_element+0x116>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1227 <contains_element+0x127>
jmp    121b <contains_element+0x11b>
jmp    11a7 <contains_element+0xa7>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<contains_element>:
cmp    $0x4,%esi
jg     1113 <contains_element+0x13>
xor    %eax,%eax
test   %esi,%esi
jle    1154 <contains_element+0x54>
cmp    %edx,(%rdi)
jle    114d <contains_element+0x4d>
xor    %eax,%eax
jmp    1154 <contains_element+0x54>
add    $0xffffffff,%esi
xor    %r8d,%r8d
jmp    112a <contains_element+0x2a>
nopl   0x0(%rax,%rax,1)
add    $0xffffffff,%eax
mov    %eax,%esi
cmp    %esi,%r8d
jg     110f <contains_element+0xf>
lea    (%rsi,%r8,1),%ecx
mov    %ecx,%eax
shr    $0x1f,%eax
add    %ecx,%eax
sar    %eax
movslq %eax,%rcx
mov    (%rdi,%rcx,4),%ecx
cmp    %edx,%ecx
jg     1120 <contains_element+0x20>
add    $0x1,%eax
mov    %eax,%r8d
cmp    %edx,%ecx
jl     1125 <contains_element+0x25>
jmp    1154 <contains_element+0x54>
mov    $0x1,%eax
jne    1155 <contains_element+0x55>
ret
cmp    $0x1,%esi
je     110f <contains_element+0xf>
cmp    %edx,0x4(%rdi)
jg     110f <contains_element+0xf>
mov    $0x2,%eax
je     1154 <contains_element+0x54>
cmp    $0x2,%esi
je     110f <contains_element+0xf>
cmp    %edx,0x8(%rdi)
jg     110f <contains_element+0xf>
mov    $0x3,%eax
je     1154 <contains_element+0x54>
cmp    $0x3,%esi
je     110f <contains_element+0xf>
mov    $0x4,%eax
cmp    %edx,0xc(%rdi)
jne    110f <contains_element+0xf>
jmp    1154 <contains_element+0x54>

LLVM IR (-O0):
define i32 @contains_element(i32* %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = alloca i32*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
store i32* %0, i32** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
%12 = load i32, i32* %6
%13 = icmp slt i32 %12, 5
br i1 %13, label %14, label %46
14: ; preds = %3
store i32 0, i32* %8
br label %15
15: ; preds = %42, %14
%16 = load i32, i32* %8
%17 = load i32, i32* %6
%18 = icmp slt i32 %16, %17
br i1 %18, label %19, label %28
19: ; preds = %15
%20 = load i32*, i32** %5
%21 = load i32, i32* %8
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds i32, i32* %20, i64 %22
%24 = load i32, i32* %23
%25 = load i32, i32* %7
%26 = icmp sgt i32 %24, %25
%27 = xor i1 %26, true
br label %28
28: ; preds = %19, %15
%29 = phi i1 [ false, %15 ], [ %27, %19 ]
br i1 %29, label %30, label %45
30: ; preds = %28
%31 = load i32*, i32** %5
%32 = load i32, i32* %8
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds i32, i32* %31, i64 %33
%35 = load i32, i32* %34
%36 = load i32, i32* %7
%37 = icmp eq i32 %35, %36
br i1 %37, label %38, label %41
38: ; preds = %30
%39 = load i32, i32* %8
%40 = add nsw i32 %39, 1
store i32 %40, i32* %4
br label %85
41: ; preds = %30
br label %42
42: ; preds = %41
%43 = load i32, i32* %8
%44 = add nsw i32 %43, 1
store i32 %44, i32* %8
br label %15
45: ; preds = %28
store i32 0, i32* %4
br label %85
46: ; preds = %3
store i32 0, i32* %10
%47 = load i32, i32* %6
%48 = sub nsw i32 %47, 1
store i32 %48, i32* %11
br label %49
49: ; preds = %83, %46
%50 = load i32, i32* %10
%51 = load i32, i32* %11
%52 = icmp sle i32 %50, %51
br i1 %52, label %53, label %84
53: ; preds = %49
%54 = load i32, i32* %10
%55 = load i32, i32* %11
%56 = add nsw i32 %54, %55
%57 = sdiv i32 %56, 2
store i32 %57, i32* %9
%58 = load i32*, i32** %5
%59 = load i32, i32* %9
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds i32, i32* %58, i64 %60
%62 = load i32, i32* %61
%63 = load i32, i32* %7
%64 = icmp sgt i32 %62, %63
br i1 %64, label %65, label %68
65: ; preds = %53
%66 = load i32, i32* %9
%67 = sub nsw i32 %66, 1
store i32 %67, i32* %11
br label %83
68: ; preds = %53
%69 = load i32*, i32** %5
%70 = load i32, i32* %9
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds i32, i32* %69, i64 %71
%73 = load i32, i32* %72
%74 = load i32, i32* %7
%75 = icmp slt i32 %73, %74
br i1 %75, label %76, label %79
76: ; preds = %68
%77 = load i32, i32* %9
%78 = add nsw i32 %77, 1
store i32 %78, i32* %10
br label %82
79: ; preds = %68
%80 = load i32, i32* %9
%81 = add nsw i32 %80, 1
store i32 %81, i32* %4
br label %85
82: ; preds = %76
br label %83
83: ; preds = %82, %65
br label %49
84: ; preds = %49
store i32 0, i32* %4
br label %85
85: ; preds = %84, %79, %45, %38
%86 = load i32, i32* %4
ret i32 %86
}

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