int code_month(int m) {
  if (m == 1 || m == 10)
    return 1;
  if (m == 5)
    return 2;
  if (m == 8)
    return 3;
  if (m == 2 || m == 3 || m == 11)
    return 4;
  if (m == 6)
    return 5;
  if (m == 12 || m == 9)
    return 6;
  if (m == 4 || m == 7)
    return 0;
  return -1;
}


x86 assembly (clang, -O0):
<code_month>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
cmpl   $0x1,-0x8(%rbp)
je     111b <code_month+0x1b>
cmpl   $0xa,-0x8(%rbp)
jne    1127 <code_month+0x27>
movl   $0x1,-0x4(%rbp)
jmp    11da <code_month+0xda>
cmpl   $0x5,-0x8(%rbp)
jne    113d <code_month+0x3d>
movl   $0x2,-0x4(%rbp)
jmp    11da <code_month+0xda>
cmpl   $0x8,-0x8(%rbp)
jne    1153 <code_month+0x53>
movl   $0x3,-0x4(%rbp)
jmp    11da <code_month+0xda>
cmpl   $0x2,-0x8(%rbp)
je     1171 <code_month+0x71>
cmpl   $0x3,-0x8(%rbp)
je     1171 <code_month+0x71>
cmpl   $0xb,-0x8(%rbp)
jne    117d <code_month+0x7d>
movl   $0x4,-0x4(%rbp)
jmp    11da <code_month+0xda>
cmpl   $0x6,-0x8(%rbp)
jne    1193 <code_month+0x93>
movl   $0x5,-0x4(%rbp)
jmp    11da <code_month+0xda>
cmpl   $0xc,-0x8(%rbp)
je     11a7 <code_month+0xa7>
cmpl   $0x9,-0x8(%rbp)
jne    11b3 <code_month+0xb3>
movl   $0x6,-0x4(%rbp)
jmp    11da <code_month+0xda>
cmpl   $0x4,-0x8(%rbp)
je     11c7 <code_month+0xc7>
cmpl   $0x7,-0x8(%rbp)
jne    11d3 <code_month+0xd3>
movl   $0x0,-0x4(%rbp)
jmp    11da <code_month+0xda>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

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

LLVM IR (-O0):
define i32 @code_month(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
%5 = icmp eq i32 %4, 1
br i1 %5, label %9, label %6
6: ; preds = %1
%7 = load i32, i32* %3
%8 = icmp eq i32 %7, 10
br i1 %8, label %9, label %10
9: ; preds = %6, %1
store i32 1, i32* %2
br label %47
10: ; preds = %6
%11 = load i32, i32* %3
%12 = icmp eq i32 %11, 5
br i1 %12, label %13, label %14
13: ; preds = %10
store i32 2, i32* %2
br label %47
14: ; preds = %10
%15 = load i32, i32* %3
%16 = icmp eq i32 %15, 8
br i1 %16, label %17, label %18
17: ; preds = %14
store i32 3, i32* %2
br label %47
18: ; preds = %14
%19 = load i32, i32* %3
%20 = icmp eq i32 %19, 2
br i1 %20, label %27, label %21
21: ; preds = %18
%22 = load i32, i32* %3
%23 = icmp eq i32 %22, 3
br i1 %23, label %27, label %24
24: ; preds = %21
%25 = load i32, i32* %3
%26 = icmp eq i32 %25, 11
br i1 %26, label %27, label %28
27: ; preds = %24, %21, %18
store i32 4, i32* %2
br label %47
28: ; preds = %24
%29 = load i32, i32* %3
%30 = icmp eq i32 %29, 6
br i1 %30, label %31, label %32
31: ; preds = %28
store i32 5, i32* %2
br label %47
32: ; preds = %28
%33 = load i32, i32* %3
%34 = icmp eq i32 %33, 12
br i1 %34, label %38, label %35
35: ; preds = %32
%36 = load i32, i32* %3
%37 = icmp eq i32 %36, 9
br i1 %37, label %38, label %39
38: ; preds = %35, %32
store i32 6, i32* %2
br label %47
39: ; preds = %35
%40 = load i32, i32* %3
%41 = icmp eq i32 %40, 4
br i1 %41, label %45, label %42
42: ; preds = %39
%43 = load i32, i32* %3
%44 = icmp eq i32 %43, 7
br i1 %44, label %45, label %46
45: ; preds = %42, %39
store i32 0, i32* %2
br label %47
46: ; preds = %42
store i32 -1, i32* %2
br label %47
47: ; preds = %46, %45, %38, %31, %27, %17, %13, %9
%48 = load i32, i32* %2
ret i32 %48
}

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