int check_vowel(char ch) {
  if (ch == 'i' || ch == 'I' || ch == 'e' || ch == 'E' || ch == 'a' ||
      ch == 'A' || ch == 'y' || ch == 'Y' || ch == 'u' || ch == 'U' ||
      ch == 'o' || ch == 'O')
    return 1;
  else
    return 0;
}


x86 assembly (clang, -O0):
<check_vowel>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x5(%rbp)
movsbl -0x5(%rbp),%eax
cmp    $0x69,%eax
je     11a6 <check_vowel+0xa6>
movsbl -0x5(%rbp),%eax
cmp    $0x49,%eax
je     11a6 <check_vowel+0xa6>
movsbl -0x5(%rbp),%eax
cmp    $0x65,%eax
je     11a6 <check_vowel+0xa6>
movsbl -0x5(%rbp),%eax
cmp    $0x45,%eax
je     11a6 <check_vowel+0xa6>
movsbl -0x5(%rbp),%eax
cmp    $0x61,%eax
je     11a6 <check_vowel+0xa6>
movsbl -0x5(%rbp),%eax
cmp    $0x41,%eax
je     11a6 <check_vowel+0xa6>
movsbl -0x5(%rbp),%eax
cmp    $0x79,%eax
je     11a6 <check_vowel+0xa6>
movsbl -0x5(%rbp),%eax
cmp    $0x59,%eax
je     11a6 <check_vowel+0xa6>
movsbl -0x5(%rbp),%eax
cmp    $0x75,%eax
je     11a6 <check_vowel+0xa6>
movsbl -0x5(%rbp),%eax
cmp    $0x55,%eax
je     11a6 <check_vowel+0xa6>
movsbl -0x5(%rbp),%eax
cmp    $0x6f,%eax
je     11a6 <check_vowel+0xa6>
movsbl -0x5(%rbp),%eax
cmp    $0x4f,%eax
jne    11b2 <check_vowel+0xb2>
movl   $0x1,-0x4(%rbp)
jmp    11b9 <check_vowel+0xb9>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<check_vowel>:
add    $0xbf,%dil
ror    %dil
xor    %eax,%eax
cmp    $0x1c,%dil
ja     111d <check_vowel+0x1d>
movsbq %dil,%rax
lea    0xee6(%rip),%rcx
mov    (%rcx,%rax,4),%eax
ret

LLVM IR (-O0):
define i32 @check_vowel(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, 105
br i1 %6, label %51, label %7
7: ; preds = %1
%8 = load i8, i8* %3
%9 = sext i8 %8 to i32
%10 = icmp eq i32 %9, 73
br i1 %10, label %51, label %11
11: ; preds = %7
%12 = load i8, i8* %3
%13 = sext i8 %12 to i32
%14 = icmp eq i32 %13, 101
br i1 %14, label %51, label %15
15: ; preds = %11
%16 = load i8, i8* %3
%17 = sext i8 %16 to i32
%18 = icmp eq i32 %17, 69
br i1 %18, label %51, label %19
19: ; preds = %15
%20 = load i8, i8* %3
%21 = sext i8 %20 to i32
%22 = icmp eq i32 %21, 97
br i1 %22, label %51, label %23
23: ; preds = %19
%24 = load i8, i8* %3
%25 = sext i8 %24 to i32
%26 = icmp eq i32 %25, 65
br i1 %26, label %51, label %27
27: ; preds = %23
%28 = load i8, i8* %3
%29 = sext i8 %28 to i32
%30 = icmp eq i32 %29, 121
br i1 %30, label %51, label %31
31: ; preds = %27
%32 = load i8, i8* %3
%33 = sext i8 %32 to i32
%34 = icmp eq i32 %33, 89
br i1 %34, label %51, label %35
35: ; preds = %31
%36 = load i8, i8* %3
%37 = sext i8 %36 to i32
%38 = icmp eq i32 %37, 117
br i1 %38, label %51, label %39
39: ; preds = %35
%40 = load i8, i8* %3
%41 = sext i8 %40 to i32
%42 = icmp eq i32 %41, 85
br i1 %42, label %51, label %43
43: ; preds = %39
%44 = load i8, i8* %3
%45 = sext i8 %44 to i32
%46 = icmp eq i32 %45, 111
br i1 %46, label %51, label %47
47: ; preds = %43
%48 = load i8, i8* %3
%49 = sext i8 %48 to i32
%50 = icmp eq i32 %49, 79
br i1 %50, label %51, label %52
51: ; preds = %47, %43, %39, %35, %31, %27, %23, %19, %15, %11, %7, %1
store i32 1, i32* %2
br label %53
52: ; preds = %47
store i32 0, i32* %2
br label %53
53: ; preds = %52, %51
%54 = load i32, i32* %2
ret i32 %54
}

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