int letter_check(unsigned char c) {
  if (c >= 'a' && c <= 'z')
    return 0;
  else if (c >= 'A' && c <= 'Z')
    return 0;
  else if (c >= '0' && c <= '9')
    return 0;
  else if (c == ' ' || c == '!' || c == '?' || c == ',' || c == '.' ||
           c == '-' || c == '*' || c == '|' || c == '&' || c == '/' ||
           c == '\\' || c == '\'' || c == '"' || c == '@' || c == '#' ||
           c == '$' || c == '%' || c == '(' || c == ')' || c == '[' || c == ']')
    return 0;
  if (c == 163)
    return 0;
  return 1;
}


x86 assembly (clang, -O0):
<letter_check>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x5(%rbp)
movzbl -0x5(%rbp),%eax
cmp    $0x61,%eax
jl     1130 <letter_check+0x30>
movzbl -0x5(%rbp),%eax
cmp    $0x7a,%eax
jg     1130 <letter_check+0x30>
movl   $0x0,-0x4(%rbp)
jmp    12ca <letter_check+0x1ca>
movzbl -0x5(%rbp),%eax
cmp    $0x41,%eax
jl     1156 <letter_check+0x56>
movzbl -0x5(%rbp),%eax
cmp    $0x5a,%eax
jg     1156 <letter_check+0x56>
movl   $0x0,-0x4(%rbp)
jmp    12ca <letter_check+0x1ca>
movzbl -0x5(%rbp),%eax
cmp    $0x30,%eax
jl     117c <letter_check+0x7c>
movzbl -0x5(%rbp),%eax
cmp    $0x39,%eax
jg     117c <letter_check+0x7c>
movl   $0x0,-0x4(%rbp)
jmp    12ca <letter_check+0x1ca>
movzbl -0x5(%rbp),%eax
cmp    $0x20,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x21,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x3f,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x2c,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x2e,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x2d,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x2a,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x7c,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x26,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x2f,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x5c,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x27,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x22,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x40,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x23,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x24,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x25,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x28,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x29,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x5b,%eax
je     128d <letter_check+0x18d>
movzbl -0x5(%rbp),%eax
cmp    $0x5d,%eax
jne    1299 <letter_check+0x199>
movl   $0x0,-0x4(%rbp)
jmp    12ca <letter_check+0x1ca>
jmp    129e <letter_check+0x19e>
jmp    12a3 <letter_check+0x1a3>
jmp    12a8 <letter_check+0x1a8>
movzbl -0x5(%rbp),%eax
cmp    $0xa3,%eax
jne    12c3 <letter_check+0x1c3>
movl   $0x0,-0x4(%rbp)
jmp    12ca <letter_check+0x1ca>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<letter_check>:
lea    -0x30(%rdi),%ecx
xor    %eax,%eax
cmp    $0xa,%cl
jb     1135 <letter_check+0x35>
mov    %edi,%ecx
and    $0xdf,%cl
add    $0xbf,%cl
cmp    $0x1a,%cl
jb     1135 <letter_check+0x35>
add    $0x5d,%dil
cmp    $0xd9,%dil
ja     1136 <letter_check+0x36>
movzbl %dil,%ecx
lea    0xed4(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
ret
mov    $0x1,%eax
ret

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

LLVM IR (-O2):
define i32 @letter_check(i8 zeroext %0) {
%2 = and i8 %0, -33
%3 = add i8 %2, -65
%4 = icmp ult i8 %3, 26
%5 = add i8 %0, -48
%6 = icmp ult i8 %5, 10
%7 = or i1 %6, %4
br i1 %7, label %10, label %8
8: ; preds = %1
switch i8 %0, label %9 [
i8 124, label %10
i8 93, label %10
i8 92, label %10
i8 91, label %10
i8 64, label %10
i8 63, label %10
i8 47, label %10
i8 46, label %10
i8 45, label %10
i8 44, label %10
i8 42, label %10
i8 41, label %10
i8 40, label %10
i8 39, label %10
i8 38, label %10
i8 37, label %10
i8 36, label %10
i8 35, label %10
i8 34, label %10
i8 33, label %10
i8 32, label %10
i8 -93, label %10
]
9: ; preds = %8
br label %10
10: ; preds = %8, %8, %8, %8, %8, %8, %8, %8, %8, %8, %8, %8, %8, %8, %8, %8, %8, %8, %8, %8, %8, %8, %1, %9
%11 = phi i32 [ 1, %9 ], [ 0, %1 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ], [ 0, %8 ]
ret i32 %11
}