#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
char EOF;
char text(char cc) {
  char dd;
  {
    if (((cc >= 'A') && (cc <= 'Z')) || ((cc >= 'a') && (cc <= 'z'))) {
      dd = cc + ('a' - 'A') * (cc < 'a');
    } else if (cc == 39)
      dd = 39;
    else if (cc == 45)
      dd = 45;
    else if (cc == EOF)
      dd = -1;
    else if ((cc >= '0') && (cc <= '9'))
      dd = cc;
    else
      dd = 0;
    return (dd);
  }
}


x86 assembly (clang, -O0):
<text>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
cmp    $0x41,%eax
jl     1124 <text+0x24>
movsbl -0x1(%rbp),%eax
cmp    $0x5a,%eax
jle    113e <text+0x3e>
movsbl -0x1(%rbp),%eax
cmp    $0x61,%eax
jl     115f <text+0x5f>
movsbl -0x1(%rbp),%eax
cmp    $0x7a,%eax
jg     115f <text+0x5f>
movsbl -0x1(%rbp),%eax
movsbl -0x1(%rbp),%ecx
cmp    $0x61,%ecx
setl   %cl
and    $0x1,%cl
movzbl %cl,%ecx
shl    $0x5,%ecx
add    %ecx,%eax
mov    %al,-0x2(%rbp)
jmp    11e7 <text+0xe7>
movsbl -0x1(%rbp),%eax
cmp    $0x27,%eax
jne    1175 <text+0x75>
movb   $0x27,-0x2(%rbp)
jmp    11e2 <text+0xe2>
movsbl -0x1(%rbp),%eax
cmp    $0x2d,%eax
jne    118b <text+0x8b>
movb   $0x2d,-0x2(%rbp)
jmp    11dd <text+0xdd>
movsbl -0x1(%rbp),%eax
mov    0x2e52(%rip),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    11aa <text+0xaa>
movb   $0xff,-0x2(%rbp)
jmp    11d8 <text+0xd8>
movsbl -0x1(%rbp),%eax
cmp    $0x30,%eax
jl     11cf <text+0xcf>
movsbl -0x1(%rbp),%eax
cmp    $0x39,%eax
jg     11cf <text+0xcf>
mov    -0x1(%rbp),%al
mov    %al,-0x2(%rbp)
jmp    11d3 <text+0xd3>
movb   $0x0,-0x2(%rbp)
jmp    11d8 <text+0xd8>
jmp    11dd <text+0xdd>
jmp    11e2 <text+0xe2>
jmp    11e7 <text+0xe7>
movsbl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<text>:
mov    %edi,%eax
and    $0xdf,%al
add    $0xbf,%al
cmp    $0x19,%al
ja     1118 <text+0x18>
cmp    $0x61,%dil
setb   %al
shl    $0x5,%al
add    %dil,%al
ret
cmp    $0x27,%dil
je     1127 <text+0x27>
cmp    $0x2d,%dil
jne    112a <text+0x2a>
mov    $0x2d,%al
ret
mov    %edi,%eax
ret
mov    0x2eb7(%rip),%rcx
mov    $0xff,%al
cmp    %dil,(%rcx)
je     1146 <text+0x46>
lea    -0x30(%rdi),%eax
xor    %ecx,%ecx
cmp    $0xa,%al
movzbl %dil,%eax
cmovae %ecx,%eax
ret

LLVM IR (-O0):
@EOF = global i8 0
define signext i8 @text(i8 signext %0) {
%2 = alloca i8
%3 = alloca i8
store i8 %0, i8* %2
%4 = load i8, i8* %2
%5 = sext i8 %4 to i32
%6 = icmp sge i32 %5, 65
br i1 %6, label %7, label %11
7: ; preds = %1
%8 = load i8, i8* %2
%9 = sext i8 %8 to i32
%10 = icmp sle i32 %9, 90
br i1 %10, label %19, label %11
11: ; preds = %7, %1
%12 = load i8, i8* %2
%13 = sext i8 %12 to i32
%14 = icmp sge i32 %13, 97
br i1 %14, label %15, label %29
15: ; preds = %11
%16 = load i8, i8* %2
%17 = sext i8 %16 to i32
%18 = icmp sle i32 %17, 122
br i1 %18, label %19, label %29
19: ; preds = %15, %7
%20 = load i8, i8* %2
%21 = sext i8 %20 to i32
%22 = load i8, i8* %2
%23 = sext i8 %22 to i32
%24 = icmp slt i32 %23, 97
%25 = zext i1 %24 to i32
%26 = mul nsw i32 32, %25
%27 = add nsw i32 %21, %26
%28 = trunc i32 %27 to i8
store i8 %28, i8* %3
br label %61
29: ; preds = %15, %11
%30 = load i8, i8* %2
%31 = sext i8 %30 to i32
%32 = icmp eq i32 %31, 39
br i1 %32, label %33, label %34
33: ; preds = %29
store i8 39, i8* %3
br label %60
34: ; preds = %29
%35 = load i8, i8* %2
%36 = sext i8 %35 to i32
%37 = icmp eq i32 %36, 45
br i1 %37, label %38, label %39
38: ; preds = %34
store i8 45, i8* %3
br label %59
39: ; preds = %34
%40 = load i8, i8* %2
%41 = sext i8 %40 to i32
%42 = load i8, i8* @EOF
%43 = sext i8 %42 to i32
%44 = icmp eq i32 %41, %43
br i1 %44, label %45, label %46
45: ; preds = %39
store i8 -1, i8* %3
br label %58
46: ; preds = %39
%47 = load i8, i8* %2
%48 = sext i8 %47 to i32
%49 = icmp sge i32 %48, 48
br i1 %49, label %50, label %56
50: ; preds = %46
%51 = load i8, i8* %2
%52 = sext i8 %51 to i32
%53 = icmp sle i32 %52, 57
br i1 %53, label %54, label %56
54: ; preds = %50
%55 = load i8, i8* %2
store i8 %55, i8* %3
br label %57
56: ; preds = %50, %46
store i8 0, i8* %3
br label %57
57: ; preds = %56, %54
br label %58
58: ; preds = %57, %45
br label %59
59: ; preds = %58, %38
br label %60
60: ; preds = %59, %33
br label %61
61: ; preds = %60, %19
%62 = load i8, i8* %3
ret i8 %62
}

LLVM IR (-O2):
@EOF = global i8 0
define signext i8 @text(i8 signext %0) {
%2 = and i8 %0, -33
%3 = add i8 %2, -65
%4 = icmp ult i8 %3, 26
br i1 %4, label %5, label %9
5: ; preds = %1
%6 = icmp ult i8 %0, 97
%7 = select i1 %6, i8 32, i8 0
%8 = add nuw i8 %7, %0
br label %18
9: ; preds = %1
switch i8 %0, label %11 [
i8 39, label %18
i8 45, label %10
]
10: ; preds = %9
br label %18
11: ; preds = %9
%12 = load i8, i8* @EOF
%13 = icmp eq i8 %12, %0
br i1 %13, label %18, label %14
14: ; preds = %11
%15 = add i8 %0, -48
%16 = icmp ult i8 %15, 10
%17 = select i1 %16, i8 %0, i8 0
br label %18
18: ; preds = %14, %11, %9, %10, %5
%19 = phi i8 [ %8, %5 ], [ 45, %10 ], [ %0, %9 ], [ -1, %11 ], [ %17, %14 ]
ret i8 %19
}