char dos_valid_char(char c) {
  if (c >= '0' && c <= '9')
    return c;
  if (c >= 'A' && c <= 'Z')
    return c;
  if (c == '!' || c == '#' || c == '$' || c == '%' || c == '&' || c == '\'' ||
      c == '(' || c == ')' || c == '-' || c == '@' || c == '^' || c == '_' ||
      c == '{' || c == '}' || c == '~')
    return c;
  if (c >= 'a' && c <= 'z')
    return c - 'a' + 'A';
  return 0;
}


x86 assembly (clang, -O0):
<dos_valid_char>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x2(%rbp)
movsbl -0x2(%rbp),%eax
cmp    $0x30,%eax
jl     112f <dos_valid_char+0x2f>
movsbl -0x2(%rbp),%eax
cmp    $0x39,%eax
jg     112f <dos_valid_char+0x2f>
mov    -0x2(%rbp),%al
mov    %al,-0x1(%rbp)
jmp    1252 <dos_valid_char+0x152>
movsbl -0x2(%rbp),%eax
cmp    $0x41,%eax
jl     1154 <dos_valid_char+0x54>
movsbl -0x2(%rbp),%eax
cmp    $0x5a,%eax
jg     1154 <dos_valid_char+0x54>
mov    -0x2(%rbp),%al
mov    %al,-0x1(%rbp)
jmp    1252 <dos_valid_char+0x152>
movsbl -0x2(%rbp),%eax
cmp    $0x21,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x23,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x24,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x25,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x26,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x27,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x28,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x29,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x2d,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x40,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x5e,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x5f,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x7b,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x7d,%eax
je     1217 <dos_valid_char+0x117>
movsbl -0x2(%rbp),%eax
cmp    $0x7e,%eax
jne    1222 <dos_valid_char+0x122>
mov    -0x2(%rbp),%al
mov    %al,-0x1(%rbp)
jmp    1252 <dos_valid_char+0x152>
movsbl -0x2(%rbp),%eax
cmp    $0x61,%eax
jl     124e <dos_valid_char+0x14e>
movsbl -0x2(%rbp),%eax
cmp    $0x7a,%eax
jg     124e <dos_valid_char+0x14e>
movsbl -0x2(%rbp),%eax
sub    $0x61,%eax
add    $0x41,%eax
mov    %al,-0x1(%rbp)
jmp    1252 <dos_valid_char+0x152>
movb   $0x0,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<dos_valid_char>:
mov    %edi,%eax
lea    -0x30(%rax),%ecx
cmp    $0xa,%cl
jb     112d <dos_valid_char+0x2d>
lea    -0x41(%rax),%ecx
cmp    $0x1a,%cl
jb     112d <dos_valid_char+0x2d>
lea    -0x21(%rax),%ecx
cmp    $0x5d,%cl
ja     112e <dos_valid_char+0x2e>
movzbl %cl,%ecx
lea    0xedc(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
ret
lea    -0x61(%rax),%ecx
add    $0xe0,%al
xor    %edx,%edx
cmp    $0x1a,%cl
movzbl %al,%eax
cmovae %edx,%eax
ret

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

LLVM IR (-O2):
define signext i8 @dos_valid_char(i8 signext %0) {
%2 = add i8 %0, -48
%3 = icmp ult i8 %2, 10
%4 = add i8 %0, -65
%5 = icmp ult i8 %4, 26
%6 = or i1 %3, %5
br i1 %6, label %13, label %7
7: ; preds = %1
switch i8 %0, label %8 [
i8 126, label %13
i8 125, label %13
i8 123, label %13
i8 95, label %13
i8 94, label %13
i8 64, label %13
i8 45, label %13
i8 41, label %13
i8 40, label %13
i8 39, label %13
i8 38, label %13
i8 37, label %13
i8 36, label %13
i8 35, label %13
i8 33, label %13
]
8: ; preds = %7
%9 = add i8 %0, -97
%10 = icmp ult i8 %9, 26
%11 = add i8 %0, -32
%12 = select i1 %10, i8 %11, i8 0
br label %13
13: ; preds = %8, %7, %7, %7, %7, %7, %7, %7, %7, %7, %7, %7, %7, %7, %7, %7, %1
%14 = phi i8 [ %0, %1 ], [ %0, %7 ], [ %0, %7 ], [ %0, %7 ], [ %0, %7 ], [ %0, %7 ], [ %0, %7 ], [ %0, %7 ], [ %0, %7 ], [ %0, %7 ], [ %0, %7 ], [ %0, %7 ], [ %0, %7 ], [ %0, %7 ], [ %0, %7 ], [ %0, %7 ], [ %12, %8 ]
ret i8 %14
}