int compose_vowels(int v1, int v2) {
  if (v1 == 8 && v2 == 0)
    return 9;
  if (v1 == 8 && v2 == 1)
    return 10;
  if (v1 == 8 && v2 == 20)
    return 11;
  if (v1 == 13 && v2 == 4)
    return 14;
  if (v1 == 13 && v2 == 5)
    return 15;
  if (v1 == 13 && v2 == 20)
    return 16;
  if (v1 == 18 && v2 == 20)
    return 19;
  return -1;
}


x86 assembly (clang, -O0):
<compose_vowels>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
cmpl   $0x8,-0x8(%rbp)
jne    112a <compose_vowels+0x2a>
cmpl   $0x0,-0xc(%rbp)
jne    112a <compose_vowels+0x2a>
movl   $0x9,-0x4(%rbp)
jmp    11f1 <compose_vowels+0xf1>
cmpl   $0x8,-0x8(%rbp)
jne    114a <compose_vowels+0x4a>
cmpl   $0x1,-0xc(%rbp)
jne    114a <compose_vowels+0x4a>
movl   $0xa,-0x4(%rbp)
jmp    11f1 <compose_vowels+0xf1>
cmpl   $0x8,-0x8(%rbp)
jne    116a <compose_vowels+0x6a>
cmpl   $0x14,-0xc(%rbp)
jne    116a <compose_vowels+0x6a>
movl   $0xb,-0x4(%rbp)
jmp    11f1 <compose_vowels+0xf1>
cmpl   $0xd,-0x8(%rbp)
jne    118a <compose_vowels+0x8a>
cmpl   $0x4,-0xc(%rbp)
jne    118a <compose_vowels+0x8a>
movl   $0xe,-0x4(%rbp)
jmp    11f1 <compose_vowels+0xf1>
cmpl   $0xd,-0x8(%rbp)
jne    11aa <compose_vowels+0xaa>
cmpl   $0x5,-0xc(%rbp)
jne    11aa <compose_vowels+0xaa>
movl   $0xf,-0x4(%rbp)
jmp    11f1 <compose_vowels+0xf1>
cmpl   $0xd,-0x8(%rbp)
jne    11ca <compose_vowels+0xca>
cmpl   $0x14,-0xc(%rbp)
jne    11ca <compose_vowels+0xca>
movl   $0x10,-0x4(%rbp)
jmp    11f1 <compose_vowels+0xf1>
cmpl   $0x12,-0x8(%rbp)
jne    11ea <compose_vowels+0xea>
cmpl   $0x14,-0xc(%rbp)
jne    11ea <compose_vowels+0xea>
movl   $0x13,-0x4(%rbp)
jmp    11f1 <compose_vowels+0xf1>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<compose_vowels>:
cmp    $0x8,%edi
jne    110f <compose_vowels+0xf>
mov    $0x9,%eax
test   %esi,%esi
jne    110f <compose_vowels+0xf>
ret
cmp    $0x8,%edi
jne    111e <compose_vowels+0x1e>
mov    $0xa,%eax
cmp    $0x1,%esi
je     110e <compose_vowels+0xe>
cmp    $0x8,%edi
jne    112d <compose_vowels+0x2d>
mov    $0xb,%eax
cmp    $0x14,%esi
je     110e <compose_vowels+0xe>
cmp    $0xd,%edi
jne    113c <compose_vowels+0x3c>
mov    $0xe,%eax
cmp    $0x4,%esi
je     110e <compose_vowels+0xe>
cmp    $0xd,%edi
jne    114b <compose_vowels+0x4b>
mov    $0xf,%eax
cmp    $0x5,%esi
je     110e <compose_vowels+0xe>
cmp    $0xd,%edi
jne    115a <compose_vowels+0x5a>
mov    $0x10,%eax
cmp    $0x14,%esi
je     110e <compose_vowels+0xe>
xor    $0x14,%esi
xor    $0x12,%edi
or     %esi,%edi
mov    $0x13,%ecx
mov    $0xffffffff,%eax
cmove  %ecx,%eax
ret

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

LLVM IR (-O2):
define i32 @compose_vowels(i32 %0, i32 %1) {
%3 = icmp eq i32 %0, 8
%4 = icmp eq i32 %1, 0
%5 = and i1 %3, %4
br i1 %5, label %25, label %6
6: ; preds = %2
%7 = icmp eq i32 %1, 1
%8 = and i1 %3, %7
br i1 %8, label %25, label %9
9: ; preds = %6
%10 = icmp eq i32 %1, 20
%11 = and i1 %3, %10
br i1 %11, label %25, label %12
12: ; preds = %9
%13 = icmp eq i32 %0, 13
%14 = icmp eq i32 %1, 4
%15 = and i1 %13, %14
br i1 %15, label %25, label %16
16: ; preds = %12
%17 = icmp eq i32 %1, 5
%18 = and i1 %13, %17
br i1 %18, label %25, label %19
19: ; preds = %16
%20 = and i1 %13, %10
br i1 %20, label %25, label %21
21: ; preds = %19
%22 = icmp eq i32 %0, 18
%23 = and i1 %22, %10
%24 = select i1 %23, i32 19, i32 -1
br label %25
25: ; preds = %21, %19, %16, %12, %9, %6, %2
%26 = phi i32 [ 9, %2 ], [ 10, %6 ], [ 11, %9 ], [ 14, %12 ], [ 15, %16 ], [ 16, %19 ], [ %24, %21 ]
ret i32 %26
}