int vs_get_headtype(int head) {
  switch (head) {
  case 1000:
  case 1004:
  case 1008:
  case 1012:
  case 1016:
  case 1020:
  case 1024:
  case 1028:
  case 1032:
  case 1036:
  case 1040:
  case 1044:
  case 1048:
  case 1052:
  case 1056:
  case 1060:
  case 1064:
  case 1068:
  case 1072:
  case 1076:
  case 1080:
  case 1084:
    return 4;
  case 1001:
  case 1005:
  case 1009:
  case 1013:
  case 1017:
  case 1021:
  case 1025:
  case 1029:
  case 1033:
  case 1037:
  case 1041:
  case 1045:
  case 1049:
  case 1053:
  case 1057:
  case 1061:
  case 1065:
  case 1069:
  case 1073:
  case 1077:
  case 1081:
  case 1085:
    return 5;
  }
  return 0;
}


x86 assembly (clang, -O0):
<vs_get_headtype>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0xfffffc18,%eax
mov    %eax,%ecx
mov    %rcx,-0x10(%rbp)
sub    $0x55,%eax
ja     114a <vs_get_headtype+0x4a>
mov    -0x10(%rbp),%rax
lea    0xed7(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x4,-0x4(%rbp)
jmp    1151 <vs_get_headtype+0x51>
movl   $0x5,-0x4(%rbp)
jmp    1151 <vs_get_headtype+0x51>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<vs_get_headtype>:
add    $0xfffffc18,%edi
xor    %eax,%eax
cmp    $0x55,%edi
ja     111a <vs_get_headtype+0x1a>
movslq %edi,%rax
lea    0xee9(%rip),%rcx
mov    (%rcx,%rax,4),%eax
ret

LLVM IR (-O0):
define i32 @vs_get_headtype(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
switch i32 %4, label %7 [
i32 1000, label %5
i32 1004, label %5
i32 1008, label %5
i32 1012, label %5
i32 1016, label %5
i32 1020, label %5
i32 1024, label %5
i32 1028, label %5
i32 1032, label %5
i32 1036, label %5
i32 1040, label %5
i32 1044, label %5
i32 1048, label %5
i32 1052, label %5
i32 1056, label %5
i32 1060, label %5
i32 1064, label %5
i32 1068, label %5
i32 1072, label %5
i32 1076, label %5
i32 1080, label %5
i32 1084, label %5
i32 1001, label %6
i32 1005, label %6
i32 1009, label %6
i32 1013, label %6
i32 1017, label %6
i32 1021, label %6
i32 1025, label %6
i32 1029, label %6
i32 1033, label %6
i32 1037, label %6
i32 1041, label %6
i32 1045, label %6
i32 1049, label %6
i32 1053, label %6
i32 1057, label %6
i32 1061, label %6
i32 1065, label %6
i32 1069, label %6
i32 1073, label %6
i32 1077, label %6
i32 1081, label %6
i32 1085, label %6
]
5: ; preds = %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1
store i32 4, i32* %2
br label %8
6: ; preds = %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1
store i32 5, i32* %2
br label %8
7: ; preds = %1
store i32 0, i32* %2
br label %8
8: ; preds = %7, %6, %5
%9 = load i32, i32* %2
ret i32 %9
}

LLVM IR (-O2):
@switch.table.vs_get_headtype = [86 x i32] [i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5, i32 0, i32 0, i32 4, i32 5]
define i32 @vs_get_headtype(i32 %0) {
%2 = add i32 %0, -1000
%3 = icmp ult i32 %2, 86
br i1 %3, label %4, label %8
4: ; preds = %1
%5 = sext i32 %2 to i64
%6 = getelementptr inbounds [86 x i32], [86 x i32]* @switch.table.vs_get_headtype, i64 0, i64 %5
%7 = load i32, i32* %6
br label %8
8: ; preds = %1, %4
%9 = phi i32 [ %7, %4 ], [ 0, %1 ]
ret i32 %9
}