#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 */
scalar_t__ isdigit(int);
int strlen(char *);
int get_type(char *s) {
  if (isdigit((int)*s)) {
    if (isdigit((int)*(s + strlen(s) - 1)))
      return (1);
    else if (*(s + strlen(s) - 1) == 'H')
      return (2);
    else if (*(s + strlen(s) - 1) == 'B')
      return (4);
    else if (*(s + strlen(s) - 1) == 'O')
      return (3);
  } else if (*s == '-')
    return (5);
  else if (*s == '+')
    return (6);
  else if (*s == '*')
    return (7);
  else if (*s == '/')
    return (8);
  else if (*s == '%')
    return (9);
  else if (*s == '<')
    return (10);
  else if (*s == '>')
    return (11);
  else if (*s == '|')
    return (12);
  else if (*s == '&')
    return (13);
  else if (*s == '^')
    return (14);
  else if (*s == '~')
    return (15);
  return (99);
}


x86 assembly (clang, -O0):
<get_type>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     122c <get_type+0x10c>
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x18(%rbp),%rax
movslq %ecx,%rcx
movsbl -0x1(%rax,%rcx,1),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     117c <get_type+0x5c>
movl   $0x1,-0x4(%rbp)
jmp    139e <get_type+0x27e>
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
movsbl -0x1(%rax,%rcx,1),%eax
cmp    $0x48,%eax
jne    11b0 <get_type+0x90>
movl   $0x2,-0x4(%rbp)
jmp    139e <get_type+0x27e>
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
movsbl -0x1(%rax,%rcx,1),%eax
cmp    $0x42,%eax
jne    11e4 <get_type+0xc4>
movl   $0x4,-0x4(%rbp)
jmp    139e <get_type+0x27e>
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
movsbl -0x1(%rax,%rcx,1),%eax
cmp    $0x4f,%eax
jne    1218 <get_type+0xf8>
movl   $0x3,-0x4(%rbp)
jmp    139e <get_type+0x27e>
jmp    121d <get_type+0xfd>
jmp    1222 <get_type+0x102>
jmp    1227 <get_type+0x107>
jmp    1397 <get_type+0x277>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1248 <get_type+0x128>
movl   $0x5,-0x4(%rbp)
jmp    139e <get_type+0x27e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    1264 <get_type+0x144>
movl   $0x6,-0x4(%rbp)
jmp    139e <get_type+0x27e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
jne    1280 <get_type+0x160>
movl   $0x7,-0x4(%rbp)
jmp    139e <get_type+0x27e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    129c <get_type+0x17c>
movl   $0x8,-0x4(%rbp)
jmp    139e <get_type+0x27e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x25,%eax
jne    12b8 <get_type+0x198>
movl   $0x9,-0x4(%rbp)
jmp    139e <get_type+0x27e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3c,%eax
jne    12d4 <get_type+0x1b4>
movl   $0xa,-0x4(%rbp)
jmp    139e <get_type+0x27e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3e,%eax
jne    12f0 <get_type+0x1d0>
movl   $0xb,-0x4(%rbp)
jmp    139e <get_type+0x27e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7c,%eax
jne    130c <get_type+0x1ec>
movl   $0xc,-0x4(%rbp)
jmp    139e <get_type+0x27e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x26,%eax
jne    1328 <get_type+0x208>
movl   $0xd,-0x4(%rbp)
jmp    139e <get_type+0x27e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5e,%eax
jne    1344 <get_type+0x224>
movl   $0xe,-0x4(%rbp)
jmp    139e <get_type+0x27e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7e,%eax
jne    1360 <get_type+0x240>
movl   $0xf,-0x4(%rbp)
jmp    139e <get_type+0x27e>
jmp    1365 <get_type+0x245>
jmp    136a <get_type+0x24a>
jmp    136f <get_type+0x24f>
jmp    1374 <get_type+0x254>
jmp    1379 <get_type+0x259>
jmp    137e <get_type+0x25e>
jmp    1383 <get_type+0x263>
jmp    1388 <get_type+0x268>
jmp    138d <get_type+0x26d>
jmp    1392 <get_type+0x272>
jmp    1397 <get_type+0x277>
movl   $0x63,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_type>:
push   %rbx
mov    %rdi,%rbx
movsbl (%rdi),%edi
call   1030 <isdigit@plt>
test   %rax,%rax
je     1154 <get_type+0x34>
mov    %rbx,%rdi
call   1040 <strlen@plt>
cltq
movsbl -0x1(%rbx,%rax,1),%edi
call   1030 <isdigit@plt>
mov    %rax,%rcx
mov    $0x1,%eax
test   %rcx,%rcx
je     117d <get_type+0x5d>
pop    %rbx
ret
mov    (%rbx),%cl
add    $0xdb,%cl
cmp    $0x59,%cl
ja     11c2 <get_type+0xa2>
mov    $0x5,%eax
movzbl %cl,%ecx
lea    0xe93(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
mov    $0x9,%eax
pop    %rbx
ret
mov    %rbx,%rdi
call   1040 <strlen@plt>
movslq %eax,%rcx
mov    $0x2,%eax
cmpb   $0x48,-0x1(%rbx,%rcx,1)
je     1152 <get_type+0x32>
mov    %rbx,%rdi
call   1040 <strlen@plt>
movslq %eax,%rcx
mov    $0x4,%eax
cmpb   $0x42,-0x1(%rbx,%rcx,1)
je     1152 <get_type+0x32>
mov    %rbx,%rdi
call   1040 <strlen@plt>
movslq %eax,%rcx
mov    $0x3,%eax
cmpb   $0x4f,-0x1(%rbx,%rcx,1)
je     1152 <get_type+0x32>
mov    $0x63,%eax
pop    %rbx
ret
mov    $0xd,%eax
pop    %rbx
ret
mov    $0x7,%eax
pop    %rbx
ret
mov    $0x6,%eax
pop    %rbx
ret
mov    $0x8,%eax
pop    %rbx
ret
mov    $0xa,%eax
pop    %rbx
ret
mov    $0xb,%eax
pop    %rbx
ret
mov    $0xe,%eax
pop    %rbx
ret
mov    $0xc,%eax
pop    %rbx
ret
mov    $0xf,%eax
pop    %rbx
ret

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

LLVM IR (-O2):
define i32 @get_type(i8* %0) {
%2 = load i8, i8* %0
%3 = sext i8 %2 to i32
%4 = tail call i64 @isdigit(i32 %3)
%5 = icmp eq i64 %4, 0
br i1 %5, label %36, label %6
6: ; preds = %1
%7 = tail call i32 @strlen(i8* %0)
%8 = sext i32 %7 to i64
%9 = getelementptr inbounds i8, i8* %0, i64 %8
%10 = getelementptr inbounds i8, i8* %9, i64 -1
%11 = load i8, i8* %10
%12 = sext i8 %11 to i32
%13 = tail call i64 @isdigit(i32 %12)
%14 = icmp eq i64 %13, 0
br i1 %14, label %15, label %49
15: ; preds = %6
%16 = tail call i32 @strlen(i8* %0)
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds i8, i8* %0, i64 %17
%19 = getelementptr inbounds i8, i8* %18, i64 -1
%20 = load i8, i8* %19
%21 = icmp eq i8 %20, 72
br i1 %21, label %49, label %22
22: ; preds = %15
%23 = tail call i32 @strlen(i8* %0)
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i8, i8* %0, i64 %24
%26 = getelementptr inbounds i8, i8* %25, i64 -1
%27 = load i8, i8* %26
%28 = icmp eq i8 %27, 66
br i1 %28, label %49, label %29
29: ; preds = %22
%30 = tail call i32 @strlen(i8* %0)
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds i8, i8* %0, i64 %31
%33 = getelementptr inbounds i8, i8* %32, i64 -1
%34 = load i8, i8* %33
%35 = icmp eq i8 %34, 79
br i1 %35, label %49, label %48
36: ; preds = %1
%37 = load i8, i8* %0
switch i8 %37, label %48 [
i8 45, label %49
i8 43, label %38
i8 42, label %39
i8 47, label %40
i8 37, label %41
i8 60, label %42
i8 62, label %43
i8 124, label %44
i8 38, label %45
i8 94, label %46
i8 126, label %47
]
38: ; preds = %36
br label %49
39: ; preds = %36
br label %49
40: ; preds = %36
br label %49
41: ; preds = %36
br label %49
42: ; preds = %36
br label %49
43: ; preds = %36
br label %49
44: ; preds = %36
br label %49
45: ; preds = %36
br label %49
46: ; preds = %36
br label %49
47: ; preds = %36
br label %49
48: ; preds = %36, %29
br label %49
49: ; preds = %36, %29, %22, %15, %6, %48, %47, %46, %45, %44, %43, %42, %41, %40, %39, %38
%50 = phi i32 [ 99, %48 ], [ 6, %38 ], [ 7, %39 ], [ 8, %40 ], [ 9, %41 ], [ 10, %42 ], [ 11, %43 ], [ 12, %44 ], [ 13, %45 ], [ 14, %46 ], [ 15, %47 ], [ 1, %6 ], [ 2, %15 ], [ 4, %22 ], [ 3, %29 ], [ 5, %36 ]
ret i32 %50
}