int decompose_consonants(int c, int *c_first, int *c_second) {
  if (c == 3) {
    *c_first = 1;
    *c_second = 9;
  } else if (c == 5) {
    *c_first = 4;
    *c_second = 12;
  } else if (c == 6) {
    *c_first = 4;
    *c_second = 18;
  } else if (c == 9) {
    *c_first = 8;
    *c_second = 0;
  } else if (c == 10) {
    *c_first = 8;
    *c_second = 6;
  } else if (c == 11) {
    *c_first = 8;
    *c_second = 7;
  } else if (c == 12) {
    *c_first = 8;
    *c_second = 9;
  } else if (c == 13) {
    *c_first = 8;
    *c_second = 16;
  } else if (c == 14) {
    *c_first = 8;
    *c_second = 17;
  } else if (c == 15) {
    *c_first = 8;
    *c_second = 18;
  } else if (c == 18) {
    *c_first = 17;
    *c_second = 9;
  } else {
    return -1;
  }
  return 1;
}


x86 assembly (clang, -O0):
<decompose_consonants>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
cmpl   $0x3,-0x8(%rbp)
jne    1132 <decompose_consonants+0x32>
mov    -0x10(%rbp),%rax
movl   $0x1,(%rax)
mov    -0x18(%rbp),%rax
movl   $0x9,(%rax)
jmp    12ce <decompose_consonants+0x1ce>
cmpl   $0x5,-0x8(%rbp)
jne    1155 <decompose_consonants+0x55>
mov    -0x10(%rbp),%rax
movl   $0x4,(%rax)
mov    -0x18(%rbp),%rax
movl   $0xc,(%rax)
jmp    12c9 <decompose_consonants+0x1c9>
cmpl   $0x6,-0x8(%rbp)
jne    1178 <decompose_consonants+0x78>
mov    -0x10(%rbp),%rax
movl   $0x4,(%rax)
mov    -0x18(%rbp),%rax
movl   $0x12,(%rax)
jmp    12c4 <decompose_consonants+0x1c4>
cmpl   $0x9,-0x8(%rbp)
jne    119b <decompose_consonants+0x9b>
mov    -0x10(%rbp),%rax
movl   $0x8,(%rax)
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
jmp    12bf <decompose_consonants+0x1bf>
cmpl   $0xa,-0x8(%rbp)
jne    11be <decompose_consonants+0xbe>
mov    -0x10(%rbp),%rax
movl   $0x8,(%rax)
mov    -0x18(%rbp),%rax
movl   $0x6,(%rax)
jmp    12ba <decompose_consonants+0x1ba>
cmpl   $0xb,-0x8(%rbp)
jne    11e1 <decompose_consonants+0xe1>
mov    -0x10(%rbp),%rax
movl   $0x8,(%rax)
mov    -0x18(%rbp),%rax
movl   $0x7,(%rax)
jmp    12b5 <decompose_consonants+0x1b5>
cmpl   $0xc,-0x8(%rbp)
jne    1204 <decompose_consonants+0x104>
mov    -0x10(%rbp),%rax
movl   $0x8,(%rax)
mov    -0x18(%rbp),%rax
movl   $0x9,(%rax)
jmp    12b0 <decompose_consonants+0x1b0>
cmpl   $0xd,-0x8(%rbp)
jne    1227 <decompose_consonants+0x127>
mov    -0x10(%rbp),%rax
movl   $0x8,(%rax)
mov    -0x18(%rbp),%rax
movl   $0x10,(%rax)
jmp    12ab <decompose_consonants+0x1ab>
cmpl   $0xe,-0x8(%rbp)
jne    124a <decompose_consonants+0x14a>
mov    -0x10(%rbp),%rax
movl   $0x8,(%rax)
mov    -0x18(%rbp),%rax
movl   $0x11,(%rax)
jmp    12a6 <decompose_consonants+0x1a6>
cmpl   $0xf,-0x8(%rbp)
jne    126d <decompose_consonants+0x16d>
mov    -0x10(%rbp),%rax
movl   $0x8,(%rax)
mov    -0x18(%rbp),%rax
movl   $0x12,(%rax)
jmp    12a1 <decompose_consonants+0x1a1>
cmpl   $0x12,-0x8(%rbp)
jne    1290 <decompose_consonants+0x190>
mov    -0x10(%rbp),%rax
movl   $0x11,(%rax)
mov    -0x18(%rbp),%rax
movl   $0x9,(%rax)
jmp    129c <decompose_consonants+0x19c>
movl   $0xffffffff,-0x4(%rbp)
jmp    12d5 <decompose_consonants+0x1d5>
jmp    12a1 <decompose_consonants+0x1a1>
jmp    12a6 <decompose_consonants+0x1a6>
jmp    12ab <decompose_consonants+0x1ab>
jmp    12b0 <decompose_consonants+0x1b0>
jmp    12b5 <decompose_consonants+0x1b5>
jmp    12ba <decompose_consonants+0x1ba>
jmp    12bf <decompose_consonants+0x1bf>
jmp    12c4 <decompose_consonants+0x1c4>
jmp    12c9 <decompose_consonants+0x1c9>
jmp    12ce <decompose_consonants+0x1ce>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<decompose_consonants>:
add    $0xfffffffd,%edi
mov    $0xffffffff,%eax
cmp    $0xf,%edi
ja     1137 <decompose_consonants+0x37>
mov    $0x9fcd,%ecx
bt     %edi,%ecx
jae    1137 <decompose_consonants+0x37>
movslq %edi,%rax
lea    0xedf(%rip),%rcx
mov    (%rcx,%rax,4),%ecx
lea    0xf15(%rip),%rdi
mov    (%rdi,%rax,4),%eax
mov    %ecx,(%rsi)
mov    %eax,(%rdx)
mov    $0x1,%eax
ret

LLVM IR (-O0):
define i32 @decompose_consonants(i32 %0, i32* %1, i32* %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32*
%7 = alloca i32*
store i32 %0, i32* %5
store i32* %1, i32** %6
store i32* %2, i32** %7
%8 = load i32, i32* %5
%9 = icmp eq i32 %8, 3
br i1 %9, label %10, label %13
10: ; preds = %3
%11 = load i32*, i32** %6
store i32 1, i32* %11
%12 = load i32*, i32** %7
store i32 9, i32* %12
br label %84
13: ; preds = %3
%14 = load i32, i32* %5
%15 = icmp eq i32 %14, 5
br i1 %15, label %16, label %19
16: ; preds = %13
%17 = load i32*, i32** %6
store i32 4, i32* %17
%18 = load i32*, i32** %7
store i32 12, i32* %18
br label %83
19: ; preds = %13
%20 = load i32, i32* %5
%21 = icmp eq i32 %20, 6
br i1 %21, label %22, label %25
22: ; preds = %19
%23 = load i32*, i32** %6
store i32 4, i32* %23
%24 = load i32*, i32** %7
store i32 18, i32* %24
br label %82
25: ; preds = %19
%26 = load i32, i32* %5
%27 = icmp eq i32 %26, 9
br i1 %27, label %28, label %31
28: ; preds = %25
%29 = load i32*, i32** %6
store i32 8, i32* %29
%30 = load i32*, i32** %7
store i32 0, i32* %30
br label %81
31: ; preds = %25
%32 = load i32, i32* %5
%33 = icmp eq i32 %32, 10
br i1 %33, label %34, label %37
34: ; preds = %31
%35 = load i32*, i32** %6
store i32 8, i32* %35
%36 = load i32*, i32** %7
store i32 6, i32* %36
br label %80
37: ; preds = %31
%38 = load i32, i32* %5
%39 = icmp eq i32 %38, 11
br i1 %39, label %40, label %43
40: ; preds = %37
%41 = load i32*, i32** %6
store i32 8, i32* %41
%42 = load i32*, i32** %7
store i32 7, i32* %42
br label %79
43: ; preds = %37
%44 = load i32, i32* %5
%45 = icmp eq i32 %44, 12
br i1 %45, label %46, label %49
46: ; preds = %43
%47 = load i32*, i32** %6
store i32 8, i32* %47
%48 = load i32*, i32** %7
store i32 9, i32* %48
br label %78
49: ; preds = %43
%50 = load i32, i32* %5
%51 = icmp eq i32 %50, 13
br i1 %51, label %52, label %55
52: ; preds = %49
%53 = load i32*, i32** %6
store i32 8, i32* %53
%54 = load i32*, i32** %7
store i32 16, i32* %54
br label %77
55: ; preds = %49
%56 = load i32, i32* %5
%57 = icmp eq i32 %56, 14
br i1 %57, label %58, label %61
58: ; preds = %55
%59 = load i32*, i32** %6
store i32 8, i32* %59
%60 = load i32*, i32** %7
store i32 17, i32* %60
br label %76
61: ; preds = %55
%62 = load i32, i32* %5
%63 = icmp eq i32 %62, 15
br i1 %63, label %64, label %67
64: ; preds = %61
%65 = load i32*, i32** %6
store i32 8, i32* %65
%66 = load i32*, i32** %7
store i32 18, i32* %66
br label %75
67: ; preds = %61
%68 = load i32, i32* %5
%69 = icmp eq i32 %68, 18
br i1 %69, label %70, label %73
70: ; preds = %67
%71 = load i32*, i32** %6
store i32 17, i32* %71
%72 = load i32*, i32** %7
store i32 9, i32* %72
br label %74
73: ; preds = %67
store i32 -1, i32* %4
br label %85
74: ; preds = %70
br label %75
75: ; preds = %74, %64
br label %76
76: ; preds = %75, %58
br label %77
77: ; preds = %76, %52
br label %78
78: ; preds = %77, %46
br label %79
79: ; preds = %78, %40
br label %80
80: ; preds = %79, %34
br label %81
81: ; preds = %80, %28
br label %82
82: ; preds = %81, %22
br label %83
83: ; preds = %82, %16
br label %84
84: ; preds = %83, %10
store i32 1, i32* %4
br label %85
85: ; preds = %84, %73
%86 = load i32, i32* %4
ret i32 %86
}

LLVM IR (-O2):
@switch.table.decompose_consonants = [16 x i32] [i32 1, i32 1, i32 4, i32 4, i32 1, i32 1, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 1, i32 1, i32 17]
@switch.table.decompose_consonants.1 = [16 x i32] [i32 9, i32 9, i32 12, i32 18, i32 9, i32 9, i32 0, i32 6, i32 7, i32 9, i32 16, i32 17, i32 18, i32 9, i32 9, i32 9]
define i32 @decompose_consonants(i32 %0, i32* nocapture writeonly %1, i32* nocapture writeonly %2) {
%4 = add i32 %0, -3
%5 = icmp ult i32 %4, 16
br i1 %5, label %6, label %18
6: ; preds = %3
%7 = trunc i32 %4 to i16
%8 = lshr i16 -24627, %7
%9 = and i16 %8, 1
%10 = icmp eq i16 %9, 0
br i1 %10, label %18, label %11
11: ; preds = %6
%12 = sext i32 %4 to i64
%13 = getelementptr inbounds [16 x i32], [16 x i32]* @switch.table.decompose_consonants, i64 0, i64 %12
%14 = load i32, i32* %13
%15 = sext i32 %4 to i64
%16 = getelementptr inbounds [16 x i32], [16 x i32]* @switch.table.decompose_consonants.1, i64 0, i64 %15
%17 = load i32, i32* %16
store i32 %14, i32* %1
store i32 %17, i32* %2
br label %18
18: ; preds = %6, %3, %11
%19 = phi i32 [ -1, %3 ], [ 1, %11 ], [ -1, %6 ]
ret i32 %19
}