int hev_thresh_from_level(int level, int keyframe) {
  if (keyframe) {
    return (level >= 40) ? 2 : (level >= 15) ? 1 : 0;
  } else {
    return (level >= 40) ? 3 : (level >= 20) ? 2 : (level >= 15) ? 1 : 0;
  }
}


x86 assembly (clang, -O0):
<hev_thresh_from_level>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
cmpl   $0x0,-0xc(%rbp)
je     1149 <hev_thresh_from_level+0x49>
cmpl   $0x28,-0x8(%rbp)
jl     112b <hev_thresh_from_level+0x2b>
mov    $0x2,%eax
mov    %eax,-0x10(%rbp)
jmp    113e <hev_thresh_from_level+0x3e>
mov    -0x8(%rbp),%edx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0xf,%edx
cmovge %ecx,%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1196 <hev_thresh_from_level+0x96>
cmpl   $0x28,-0x8(%rbp)
jl     1160 <hev_thresh_from_level+0x60>
mov    $0x3,%eax
mov    %eax,-0x14(%rbp)
jmp    1190 <hev_thresh_from_level+0x90>
cmpl   $0x14,-0x8(%rbp)
jl     1177 <hev_thresh_from_level+0x77>
mov    $0x2,%eax
mov    %eax,-0x18(%rbp)
jmp    118a <hev_thresh_from_level+0x8a>
mov    -0x8(%rbp),%edx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0xf,%edx
cmovge %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<hev_thresh_from_level>:
test   %esi,%esi
je     1118 <hev_thresh_from_level+0x18>
xor    %ecx,%ecx
cmp    $0xf,%edi
setge  %cl
cmp    $0x28,%edi
mov    $0x2,%eax
cmovl  %ecx,%eax
ret
mov    $0x3,%eax
cmp    $0x27,%edi
jg     1134 <hev_thresh_from_level+0x34>
mov    $0x2,%eax
cmp    $0x13,%edi
jg     1134 <hev_thresh_from_level+0x34>
xor    %eax,%eax
cmp    $0xf,%edi
setge  %al
ret

LLVM IR (-O0):
define i32 @hev_thresh_from_level(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
store i32 %0, i32* %4
store i32 %1, i32* %5
%6 = load i32, i32* %5
%7 = icmp ne i32 %6, 0
br i1 %7, label %8, label %19
8: ; preds = %2
%9 = load i32, i32* %4
%10 = icmp sge i32 %9, 40
br i1 %10, label %11, label %12
11: ; preds = %8
br label %17
12: ; preds = %8
%13 = load i32, i32* %4
%14 = icmp sge i32 %13, 15
%15 = zext i1 %14 to i64
%16 = select i1 %14, i32 1, i32 0
br label %17
17: ; preds = %12, %11
%18 = phi i32 [ 2, %11 ], [ %16, %12 ]
store i32 %18, i32* %3
br label %36
19: ; preds = %2
%20 = load i32, i32* %4
%21 = icmp sge i32 %20, 40
br i1 %21, label %22, label %23
22: ; preds = %19
br label %34
23: ; preds = %19
%24 = load i32, i32* %4
%25 = icmp sge i32 %24, 20
br i1 %25, label %26, label %27
26: ; preds = %23
br label %32
27: ; preds = %23
%28 = load i32, i32* %4
%29 = icmp sge i32 %28, 15
%30 = zext i1 %29 to i64
%31 = select i1 %29, i32 1, i32 0
br label %32
32: ; preds = %27, %26
%33 = phi i32 [ 2, %26 ], [ %31, %27 ]
br label %34
34: ; preds = %32, %22
%35 = phi i32 [ 3, %22 ], [ %33, %32 ]
store i32 %35, i32* %3
br label %36
36: ; preds = %34, %17
%37 = load i32, i32* %3
ret i32 %37
}

LLVM IR (-O2):
define i32 @hev_thresh_from_level(i32 %0, i32 %1) {
%3 = icmp eq i32 %1, 0
%4 = icmp sgt i32 %0, 39
br i1 %3, label %9, label %5
5: ; preds = %2
%6 = icmp sgt i32 %0, 14
%7 = zext i1 %6 to i32
%8 = select i1 %4, i32 2, i32 %7
br label %15
9: ; preds = %2
br i1 %4, label %15, label %10
10: ; preds = %9
%11 = icmp sgt i32 %0, 19
br i1 %11, label %15, label %12
12: ; preds = %10
%13 = icmp sgt i32 %0, 14
%14 = zext i1 %13 to i32
br label %15
15: ; preds = %9, %10, %12, %5
%16 = phi i32 [ %8, %5 ], [ 3, %9 ], [ %14, %12 ], [ 2, %10 ]
ret i32 %16
}