int get_cat_len(unsigned int size) {
  if (size <= 21) {
    return size - 1;
  } else if (size <= 44) {
    return size - 2;
  } else if (size <= 87) {
    return size - 3;
  } else if (size <= 1144) {
    return size - 3 - (size - 55) / 33;
  } else {
    return size - 37 - (size - 1112) / 33;
  }
}


x86 assembly (clang, -O0):
<get_cat_len>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
cmpl   $0x15,-0x8(%rbp)
ja     111f <get_cat_len+0x1f>
mov    -0x8(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    11a7 <get_cat_len+0xa7>
cmpl   $0x2c,-0x8(%rbp)
ja     1137 <get_cat_len+0x37>
mov    -0x8(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x4(%rbp)
jmp    11a7 <get_cat_len+0xa7>
cmpl   $0x57,-0x8(%rbp)
ja     114f <get_cat_len+0x4f>
mov    -0x8(%rbp),%eax
sub    $0x3,%eax
mov    %eax,-0x4(%rbp)
jmp    11a7 <get_cat_len+0xa7>
cmpl   $0x478,-0x8(%rbp)
ja     1183 <get_cat_len+0x83>
mov    -0x8(%rbp),%eax
sub    $0x3,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%eax
sub    $0x37,%eax
mov    $0x21,%ecx
xor    %edx,%edx
div    %ecx
mov    %eax,%ecx
mov    -0xc(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    11a7 <get_cat_len+0xa7>
mov    -0x8(%rbp),%eax
sub    $0x25,%eax
mov    %eax,-0x10(%rbp)
mov    -0x8(%rbp),%eax
sub    $0x458,%eax
mov    $0x21,%ecx
xor    %edx,%edx
div    %ecx
mov    %eax,%ecx
mov    -0x10(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_cat_len>:
mov    %edi,%eax
cmp    $0x15,%edi
ja     110b <get_cat_len+0xb>
add    $0xffffffff,%eax
ret
cmp    $0x2c,%eax
ja     1114 <get_cat_len+0x14>
add    $0xfffffffe,%eax
ret
cmp    $0x57,%eax
ja     111d <get_cat_len+0x1d>
add    $0xfffffffd,%eax
ret
cmp    $0x478,%eax
ja     113b <get_cat_len+0x3b>
lea    -0x37(%rax),%ecx
movzwl %cx,%ecx
imul   $0xf83f,%ecx,%ecx
shr    $0x15,%ecx
neg    %ecx
add    %ecx,%eax
add    $0xfffffffd,%eax
ret
lea    -0x458(%rax),%ecx
imul   $0x3e0f83e1,%rcx,%rcx
shr    $0x23,%rcx
sub    %ecx,%eax
add    $0xffffffdb,%eax
ret

LLVM IR (-O0):
define i32 @get_cat_len(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
%5 = icmp ule i32 %4, 21
br i1 %5, label %6, label %9
6: ; preds = %1
%7 = load i32, i32* %3
%8 = sub i32 %7, 1
store i32 %8, i32* %2
br label %38
9: ; preds = %1
%10 = load i32, i32* %3
%11 = icmp ule i32 %10, 44
br i1 %11, label %12, label %15
12: ; preds = %9
%13 = load i32, i32* %3
%14 = sub i32 %13, 2
store i32 %14, i32* %2
br label %38
15: ; preds = %9
%16 = load i32, i32* %3
%17 = icmp ule i32 %16, 87
br i1 %17, label %18, label %21
18: ; preds = %15
%19 = load i32, i32* %3
%20 = sub i32 %19, 3
store i32 %20, i32* %2
br label %38
21: ; preds = %15
%22 = load i32, i32* %3
%23 = icmp ule i32 %22, 1144
br i1 %23, label %24, label %31
24: ; preds = %21
%25 = load i32, i32* %3
%26 = sub i32 %25, 3
%27 = load i32, i32* %3
%28 = sub i32 %27, 55
%29 = udiv i32 %28, 33
%30 = sub i32 %26, %29
store i32 %30, i32* %2
br label %38
31: ; preds = %21
%32 = load i32, i32* %3
%33 = sub i32 %32, 37
%34 = load i32, i32* %3
%35 = sub i32 %34, 1112
%36 = udiv i32 %35, 33
%37 = sub i32 %33, %36
store i32 %37, i32* %2
br label %38
38: ; preds = %31, %24, %18, %12, %6
%39 = load i32, i32* %2
ret i32 %39
}

LLVM IR (-O2):
define i32 @get_cat_len(i32 %0) {
%2 = icmp ult i32 %0, 22
br i1 %2, label %3, label %5
3: ; preds = %1
%4 = add nsw i32 %0, -1
br label %27
5: ; preds = %1
%6 = icmp ult i32 %0, 45
br i1 %6, label %7, label %9
7: ; preds = %5
%8 = add nsw i32 %0, -2
br label %27
9: ; preds = %5
%10 = icmp ult i32 %0, 88
br i1 %10, label %11, label %13
11: ; preds = %9
%12 = add nsw i32 %0, -3
br label %27
13: ; preds = %9
%14 = icmp ult i32 %0, 1145
br i1 %14, label %15, label %22
15: ; preds = %13
%16 = add nsw i32 %0, -3
%17 = trunc i32 %0 to i16
%18 = add nsw i16 %17, -55
%19 = udiv i16 %18, 33
%20 = zext i16 %19 to i32
%21 = sub nuw nsw i32 %16, %20
br label %27
22: ; preds = %13
%23 = add i32 %0, -37
%24 = add i32 %0, -1112
%25 = udiv i32 %24, 33
%26 = sub i32 %23, %25
br label %27
27: ; preds = %22, %15, %11, %7, %3
%28 = phi i32 [ %4, %3 ], [ %8, %7 ], [ %12, %11 ], [ %21, %15 ], [ %26, %22 ]
ret i32 %28
}