int main_function_name_length(char *arg) {
  int len;
  for (len = 0; arg[len]; len++) {
    switch (arg[len]) {
    case ' ':
    case '\t':
    case '\r':
    case '\n':
    case '0':
    case '1':
    case '.':
    case '_':
    case '=':
      return len;
    }
  }
  return len;
}


x86 assembly (clang, -O0):
<main_function_name_length>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     1171 <main_function_name_length+0x71>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
add    $0xfffffff7,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0x56,%eax
ja     115e <main_function_name_length+0x5e>
mov    -0x20(%rbp),%rax
lea    0xeb6(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1177 <main_function_name_length+0x77>
jmp    1163 <main_function_name_length+0x63>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    110f <main_function_name_length+0xf>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<main_function_name_length>:
mov    (%rdi),%dl
xor    %eax,%eax
test   %dl,%dl
je     1141 <main_function_name_length+0x41>
lea    0xef1(%rip),%rcx
jmp    112d <main_function_name_length+0x2d>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl 0x1(%rdi,%rax,1),%edx
add    $0x1,%rax
test   %dl,%dl
je     1141 <main_function_name_length+0x41>
movsbl %dl,%edx
add    $0xfffffff7,%edx
cmp    $0x56,%edx
ja     1120 <main_function_name_length+0x20>
movslq (%rcx,%rdx,4),%rdx
add    %rcx,%rdx
jmp    *%rdx
ret

LLVM IR (-O0):
define i32 @main_function_name_length(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i32
store i8* %0, i8** %3
store i32 0, i32* %4
br label %5
5: ; preds = %22, %1
%6 = load i8*, i8** %3
%7 = load i32, i32* %4
%8 = sext i32 %7 to i64
%9 = getelementptr inbounds i8, i8* %6, i64 %8
%10 = load i8, i8* %9
%11 = icmp ne i8 %10, 0
br i1 %11, label %12, label %25
12: ; preds = %5
%13 = load i8*, i8** %3
%14 = load i32, i32* %4
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds i8, i8* %13, i64 %15
%17 = load i8, i8* %16
%18 = sext i8 %17 to i32
switch i32 %18, label %21 [
i32 32, label %19
i32 9, label %19
i32 13, label %19
i32 10, label %19
i32 48, label %19
i32 49, label %19
i32 46, label %19
i32 95, label %19
i32 61, label %19
]
19: ; preds = %12, %12, %12, %12, %12, %12, %12, %12, %12
%20 = load i32, i32* %4
store i32 %20, i32* %2
br label %27
21: ; preds = %12
br label %22
22: ; preds = %21
%23 = load i32, i32* %4
%24 = add nsw i32 %23, 1
store i32 %24, i32* %4
br label %5
25: ; preds = %5
%26 = load i32, i32* %4
store i32 %26, i32* %2
br label %27
27: ; preds = %25, %19
%28 = load i32, i32* %2
ret i32 %28
}

LLVM IR (-O2):
define i32 @main_function_name_length(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = icmp eq i8 %2, 0
br i1 %3, label %17, label %4
4: ; preds = %1, %9
%5 = phi i64 [ %10, %9 ], [ 0, %1 ]
%6 = phi i8 [ %13, %9 ], [ %2, %1 ]
%7 = phi i32 [ %11, %9 ], [ 0, %1 ]
%8 = sext i8 %6 to i32
switch i32 %8, label %9 [
i32 32, label %15
i32 9, label %15
i32 13, label %15
i32 10, label %15
i32 48, label %15
i32 49, label %15
i32 46, label %15
i32 95, label %15
i32 61, label %15
]
9: ; preds = %4
%10 = add nuw i64 %5, 1
%11 = add nuw nsw i32 %7, 1
%12 = getelementptr inbounds i8, i8* %0, i64 %10
%13 = load i8, i8* %12
%14 = icmp eq i8 %13, 0
br i1 %14, label %17, label %4
15: ; preds = %4, %4, %4, %4, %4, %4, %4, %4, %4
%16 = trunc i64 %5 to i32
br label %17
17: ; preds = %9, %15, %1
%18 = phi i32 [ 0, %1 ], [ %16, %15 ], [ %11, %9 ]
ret i32 %18
}