int word_size(const char *word) {
  register int result;
  register int state;
  result = 0;
  state = 0;
  while ('\0' != *word) {
    switch (state) {
    case 0:
      state = (('a' == (*word) || 'e' == (*word) || 'i' == (*word) ||
                'o' == (*word) || 'u' == (*word)))
                  ? 1
                  : 2;
      break;
    case 1:
      state = (('a' == (*word) || 'e' == (*word) || 'i' == (*word) ||
                'o' == (*word) || 'u' == (*word)))
                  ? 1
                  : 2;
      if (2 == state)
        result++;
      break;
    case 2:
      state = (('a' == (*word) || 'e' == (*word) || 'i' == (*word) ||
                'o' == (*word) || 'u' == (*word)) ||
               ('y' == *word))
                  ? 1
                  : 2;
      break;
    }
    word++;
  }
  return (result);
}


x86 assembly (clang, -O0):
<word_size>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    %ecx,%eax
je     1351 <word_size+0x251>
mov    -0x10(%rbp),%eax
mov    %eax,-0x14(%rbp)
test   %eax,%eax
je     115c <word_size+0x5c>
jmp    113a <word_size+0x3a>
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
je     11ef <word_size+0xef>
jmp    114b <word_size+0x4b>
mov    -0x14(%rbp),%eax
sub    $0x2,%eax
je     1299 <word_size+0x199>
jmp    1340 <word_size+0x240>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%al
mov    $0x61,%ecx
cmp    %edx,%ecx
mov    %al,-0x15(%rbp)
je     11d4 <word_size+0xd4>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%al
mov    $0x65,%ecx
cmp    %edx,%ecx
mov    %al,-0x15(%rbp)
je     11d4 <word_size+0xd4>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%al
mov    $0x69,%ecx
cmp    %edx,%ecx
mov    %al,-0x15(%rbp)
je     11d4 <word_size+0xd4>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%al
mov    $0x6f,%ecx
cmp    %edx,%ecx
mov    %al,-0x15(%rbp)
je     11d4 <word_size+0xd4>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x75,%eax
cmp    %ecx,%eax
sete   %al
mov    %al,-0x15(%rbp)
mov    -0x15(%rbp),%dl
mov    $0x2,%eax
mov    $0x1,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x10(%rbp)
jmp    1340 <word_size+0x240>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%al
mov    $0x61,%ecx
cmp    %edx,%ecx
mov    %al,-0x16(%rbp)
je     1267 <word_size+0x167>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%al
mov    $0x65,%ecx
cmp    %edx,%ecx
mov    %al,-0x16(%rbp)
je     1267 <word_size+0x167>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%al
mov    $0x69,%ecx
cmp    %edx,%ecx
mov    %al,-0x16(%rbp)
je     1267 <word_size+0x167>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%al
mov    $0x6f,%ecx
cmp    %edx,%ecx
mov    %al,-0x16(%rbp)
je     1267 <word_size+0x167>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x75,%eax
cmp    %ecx,%eax
sete   %al
mov    %al,-0x16(%rbp)
mov    -0x16(%rbp),%dl
mov    $0x2,%eax
mov    $0x1,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x10(%rbp)
mov    $0x2,%eax
cmp    -0x10(%rbp),%eax
jne    1294 <word_size+0x194>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1340 <word_size+0x240>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%al
mov    $0x61,%ecx
cmp    %edx,%ecx
mov    %al,-0x17(%rbp)
je     132a <word_size+0x22a>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%al
mov    $0x65,%ecx
cmp    %edx,%ecx
mov    %al,-0x17(%rbp)
je     132a <word_size+0x22a>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%al
mov    $0x69,%ecx
cmp    %edx,%ecx
mov    %al,-0x17(%rbp)
je     132a <word_size+0x22a>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%al
mov    $0x6f,%ecx
cmp    %edx,%ecx
mov    %al,-0x17(%rbp)
je     132a <word_size+0x22a>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%al
mov    $0x75,%ecx
cmp    %edx,%ecx
mov    %al,-0x17(%rbp)
je     132a <word_size+0x22a>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x79,%eax
cmp    %ecx,%eax
sete   %al
mov    %al,-0x17(%rbp)
mov    -0x17(%rbp),%dl
mov    $0x2,%eax
mov    $0x1,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1116 <word_size+0x16>
mov    -0xc(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<word_size>:
mov    (%rdi),%cl
test   %cl,%cl
je     11a3 <word_size+0xa3>
add    $0x1,%rdi
xor    %esi,%esi
mov    $0x1495,%r8d
mov    $0x495,%edx
xor    %eax,%eax
jmp    1130 <word_size+0x30>
nop
mov    $0x1,%esi
movzbl (%rdi),%ecx
add    $0x1,%rdi
test   %cl,%cl
je     11a2 <word_size+0xa2>
cmp    $0x2,%esi
je     1160 <word_size+0x60>
cmp    $0x1,%esi
je     1180 <word_size+0x80>
test   %esi,%esi
jne    1125 <word_size+0x25>
add    $0x9f,%cl
ror    %cl
mov    $0x2,%esi
cmp    $0xa,%cl
ja     1125 <word_size+0x25>
movzbl %cl,%ecx
bt     %rcx,%rdx
jb     1120 <word_size+0x20>
jmp    1125 <word_size+0x25>
nopl   0x0(%rax,%rax,1)
add    $0x9f,%cl
ror    %cl
mov    $0x2,%esi
cmp    $0xc,%cl
ja     1125 <word_size+0x25>
movzbl %cl,%ecx
bt     %rcx,%r8
jb     1120 <word_size+0x20>
jmp    1125 <word_size+0x25>
nopw   0x0(%rax,%rax,1)
add    $0x9f,%cl
ror    %cl
cmp    $0xa,%cl
ja     1198 <word_size+0x98>
mov    $0x1,%esi
movzbl %cl,%ecx
bt     %rcx,%rdx
jb     1125 <word_size+0x25>
add    $0x1,%eax
mov    $0x2,%esi
jmp    1125 <word_size+0x25>
ret
xor    %eax,%eax
ret

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

LLVM IR (-O2):
define i32 @word_size(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = icmp eq i8 %2, 0
br i1 %3, label %28, label %4
4: ; preds = %1, %22
%5 = phi i8 [ %26, %22 ], [ %2, %1 ]
%6 = phi i32 [ %24, %22 ], [ 0, %1 ]
%7 = phi i32 [ %23, %22 ], [ 0, %1 ]
%8 = phi i8* [ %25, %22 ], [ %0, %1 ]
switch i32 %6, label %22 [
i32 0, label %9
i32 1, label %13
i32 2, label %18
]
9: ; preds = %4
%10 = add i8 %5, -97
%11 = tail call i8 @llvm.fshl.i8(i8 %10, i8 %10, i8 7)
switch i8 %11, label %22 [
i8 0, label %12
i8 2, label %12
i8 4, label %12
i8 7, label %12
i8 10, label %12
]
12: ; preds = %9, %9, %9, %9, %9
br label %22
13: ; preds = %4
%14 = add i8 %5, -97
%15 = tail call i8 @llvm.fshl.i8(i8 %14, i8 %14, i8 7)
switch i8 %15, label %16 [
i8 0, label %22
i8 2, label %22
i8 4, label %22
i8 7, label %22
i8 10, label %22
]
16: ; preds = %13
%17 = add nsw i32 %7, 1
br label %22
18: ; preds = %4
%19 = add i8 %5, -97
%20 = tail call i8 @llvm.fshl.i8(i8 %19, i8 %19, i8 7)
switch i8 %20, label %22 [
i8 0, label %21
i8 2, label %21
i8 4, label %21
i8 7, label %21
i8 10, label %21
i8 12, label %21
]
21: ; preds = %18, %18, %18, %18, %18, %18
br label %22
22: ; preds = %21, %18, %16, %13, %13, %13, %13, %13, %12, %9, %4
%23 = phi i32 [ %7, %4 ], [ %7, %9 ], [ %7, %12 ], [ %17, %16 ], [ %7, %13 ], [ %7, %13 ], [ %7, %13 ], [ %7, %13 ], [ %7, %13 ], [ %7, %18 ], [ %7, %21 ]
%24 = phi i32 [ %6, %4 ], [ 2, %9 ], [ 1, %12 ], [ 2, %16 ], [ 1, %13 ], [ 1, %13 ], [ 1, %13 ], [ 1, %13 ], [ 1, %13 ], [ 2, %18 ], [ 1, %21 ]
%25 = getelementptr inbounds i8, i8* %8, i64 1
%26 = load i8, i8* %25
%27 = icmp eq i8 %26, 0
br i1 %27, label %28, label %4
28: ; preds = %22, %1
%29 = phi i32 [ 0, %1 ], [ %23, %22 ]
ret i32 %29
}