int getCharIndex(char ch) {
  if (ch == 'a' || ch == 'd' || ch == 'g' || ch == 'j' || ch == 'm' ||
      ch == 'p' || ch == 't' || ch == 'w')
    return 1;
  else if (ch == 'b' || ch == 'e' || ch == 'h' || ch == 'k' || ch == 'n' ||
           ch == 'q' || ch == 'u' || ch == 'x')
    return 2;
  else if (ch == 'c' || ch == 'f' || ch == 'i' || ch == 'l' || ch == 'o' ||
           ch == 'r' || ch == 'v' || ch == 'y')
    return 3;
  else
    return 4;
}


x86 assembly (clang, -O0):
<getCharIndex>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x5(%rbp)
movsbl -0x5(%rbp),%eax
cmp    $0x61,%eax
je     1172 <getCharIndex+0x72>
movsbl -0x5(%rbp),%eax
cmp    $0x64,%eax
je     1172 <getCharIndex+0x72>
movsbl -0x5(%rbp),%eax
cmp    $0x67,%eax
je     1172 <getCharIndex+0x72>
movsbl -0x5(%rbp),%eax
cmp    $0x6a,%eax
je     1172 <getCharIndex+0x72>
movsbl -0x5(%rbp),%eax
cmp    $0x6d,%eax
je     1172 <getCharIndex+0x72>
movsbl -0x5(%rbp),%eax
cmp    $0x70,%eax
je     1172 <getCharIndex+0x72>
movsbl -0x5(%rbp),%eax
cmp    $0x74,%eax
je     1172 <getCharIndex+0x72>
movsbl -0x5(%rbp),%eax
cmp    $0x77,%eax
jne    117e <getCharIndex+0x7e>
movl   $0x1,-0x4(%rbp)
jmp    126d <getCharIndex+0x16d>
movsbl -0x5(%rbp),%eax
cmp    $0x62,%eax
je     11e6 <getCharIndex+0xe6>
movsbl -0x5(%rbp),%eax
cmp    $0x65,%eax
je     11e6 <getCharIndex+0xe6>
movsbl -0x5(%rbp),%eax
cmp    $0x68,%eax
je     11e6 <getCharIndex+0xe6>
movsbl -0x5(%rbp),%eax
cmp    $0x6b,%eax
je     11e6 <getCharIndex+0xe6>
movsbl -0x5(%rbp),%eax
cmp    $0x6e,%eax
je     11e6 <getCharIndex+0xe6>
movsbl -0x5(%rbp),%eax
cmp    $0x71,%eax
je     11e6 <getCharIndex+0xe6>
movsbl -0x5(%rbp),%eax
cmp    $0x75,%eax
je     11e6 <getCharIndex+0xe6>
movsbl -0x5(%rbp),%eax
cmp    $0x78,%eax
jne    11f2 <getCharIndex+0xf2>
movl   $0x2,-0x4(%rbp)
jmp    126d <getCharIndex+0x16d>
movsbl -0x5(%rbp),%eax
cmp    $0x63,%eax
je     125a <getCharIndex+0x15a>
movsbl -0x5(%rbp),%eax
cmp    $0x66,%eax
je     125a <getCharIndex+0x15a>
movsbl -0x5(%rbp),%eax
cmp    $0x69,%eax
je     125a <getCharIndex+0x15a>
movsbl -0x5(%rbp),%eax
cmp    $0x6c,%eax
je     125a <getCharIndex+0x15a>
movsbl -0x5(%rbp),%eax
cmp    $0x6f,%eax
je     125a <getCharIndex+0x15a>
movsbl -0x5(%rbp),%eax
cmp    $0x72,%eax
je     125a <getCharIndex+0x15a>
movsbl -0x5(%rbp),%eax
cmp    $0x76,%eax
je     125a <getCharIndex+0x15a>
movsbl -0x5(%rbp),%eax
cmp    $0x79,%eax
jne    1266 <getCharIndex+0x166>
movl   $0x3,-0x4(%rbp)
jmp    126d <getCharIndex+0x16d>
movl   $0x4,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<getCharIndex>:
add    $0x9f,%dil
mov    $0x4,%eax
cmp    $0x18,%dil
ja     111d <getCharIndex+0x1d>
movsbq %dil,%rax
lea    0xee6(%rip),%rcx
mov    (%rcx,%rax,4),%eax
ret

LLVM IR (-O0):
define i32 @getCharIndex(i8 signext %0) {
%2 = alloca i32
%3 = alloca i8
store i8 %0, i8* %3
%4 = load i8, i8* %3
%5 = sext i8 %4 to i32
%6 = icmp eq i32 %5, 97
br i1 %6, label %35, label %7
7: ; preds = %1
%8 = load i8, i8* %3
%9 = sext i8 %8 to i32
%10 = icmp eq i32 %9, 100
br i1 %10, label %35, label %11
11: ; preds = %7
%12 = load i8, i8* %3
%13 = sext i8 %12 to i32
%14 = icmp eq i32 %13, 103
br i1 %14, label %35, label %15
15: ; preds = %11
%16 = load i8, i8* %3
%17 = sext i8 %16 to i32
%18 = icmp eq i32 %17, 106
br i1 %18, label %35, label %19
19: ; preds = %15
%20 = load i8, i8* %3
%21 = sext i8 %20 to i32
%22 = icmp eq i32 %21, 109
br i1 %22, label %35, label %23
23: ; preds = %19
%24 = load i8, i8* %3
%25 = sext i8 %24 to i32
%26 = icmp eq i32 %25, 112
br i1 %26, label %35, label %27
27: ; preds = %23
%28 = load i8, i8* %3
%29 = sext i8 %28 to i32
%30 = icmp eq i32 %29, 116
br i1 %30, label %35, label %31
31: ; preds = %27
%32 = load i8, i8* %3
%33 = sext i8 %32 to i32
%34 = icmp eq i32 %33, 119
br i1 %34, label %35, label %36
35: ; preds = %31, %27, %23, %19, %15, %11, %7, %1
store i32 1, i32* %2
br label %103
36: ; preds = %31
%37 = load i8, i8* %3
%38 = sext i8 %37 to i32
%39 = icmp eq i32 %38, 98
br i1 %39, label %68, label %40
40: ; preds = %36
%41 = load i8, i8* %3
%42 = sext i8 %41 to i32
%43 = icmp eq i32 %42, 101
br i1 %43, label %68, label %44
44: ; preds = %40
%45 = load i8, i8* %3
%46 = sext i8 %45 to i32
%47 = icmp eq i32 %46, 104
br i1 %47, label %68, label %48
48: ; preds = %44
%49 = load i8, i8* %3
%50 = sext i8 %49 to i32
%51 = icmp eq i32 %50, 107
br i1 %51, label %68, label %52
52: ; preds = %48
%53 = load i8, i8* %3
%54 = sext i8 %53 to i32
%55 = icmp eq i32 %54, 110
br i1 %55, label %68, label %56
56: ; preds = %52
%57 = load i8, i8* %3
%58 = sext i8 %57 to i32
%59 = icmp eq i32 %58, 113
br i1 %59, label %68, label %60
60: ; preds = %56
%61 = load i8, i8* %3
%62 = sext i8 %61 to i32
%63 = icmp eq i32 %62, 117
br i1 %63, label %68, label %64
64: ; preds = %60
%65 = load i8, i8* %3
%66 = sext i8 %65 to i32
%67 = icmp eq i32 %66, 120
br i1 %67, label %68, label %69
68: ; preds = %64, %60, %56, %52, %48, %44, %40, %36
store i32 2, i32* %2
br label %103
69: ; preds = %64
%70 = load i8, i8* %3
%71 = sext i8 %70 to i32
%72 = icmp eq i32 %71, 99
br i1 %72, label %101, label %73
73: ; preds = %69
%74 = load i8, i8* %3
%75 = sext i8 %74 to i32
%76 = icmp eq i32 %75, 102
br i1 %76, label %101, label %77
77: ; preds = %73
%78 = load i8, i8* %3
%79 = sext i8 %78 to i32
%80 = icmp eq i32 %79, 105
br i1 %80, label %101, label %81
81: ; preds = %77
%82 = load i8, i8* %3
%83 = sext i8 %82 to i32
%84 = icmp eq i32 %83, 108
br i1 %84, label %101, label %85
85: ; preds = %81
%86 = load i8, i8* %3
%87 = sext i8 %86 to i32
%88 = icmp eq i32 %87, 111
br i1 %88, label %101, label %89
89: ; preds = %85
%90 = load i8, i8* %3
%91 = sext i8 %90 to i32
%92 = icmp eq i32 %91, 114
br i1 %92, label %101, label %93
93: ; preds = %89
%94 = load i8, i8* %3
%95 = sext i8 %94 to i32
%96 = icmp eq i32 %95, 118
br i1 %96, label %101, label %97
97: ; preds = %93
%98 = load i8, i8* %3
%99 = sext i8 %98 to i32
%100 = icmp eq i32 %99, 121
br i1 %100, label %101, label %102
101: ; preds = %97, %93, %89, %85, %81, %77, %73, %69
store i32 3, i32* %2
br label %103
102: ; preds = %97
store i32 4, i32* %2
br label %103
103: ; preds = %102, %101, %68, %35
%104 = load i32, i32* %2
ret i32 %104
}

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