#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 */
int t_special(int, int, int, char *);
int t0(int h, int k, int l, char string[]) {
  switch (string[0]) {
  case 'C':
    if ((h + k) % 2 != 0)
      return 0;
    break;
  case 'B':
    if ((h + l) % 2 != 0)
      return 0;
    break;
  case 'A':
    if ((k + l) % 2 != 0)
      return 0;
    break;
  case 'I':
    if ((h + k + l) % 2 != 0)
      return 0;
    break;
  case 'R':
    if ((h - k + l) % 3 != 0 && (-h + k + l) % 3 != 0)
      return 0;
    break;
  case 'F':
    if ((h + k) % 2 != 0 || (h + l) % 2 != 0 || (k + l) % 2 != 0)
      return 0;
    break;
  default:
    break;
  }
  return t_special(h, k, l, string);
}


x86 assembly (clang, -O0):
<t0>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
add    $0xffffffbf,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0x11,%eax
ja     1292 <t0+0x182>
mov    -0x20(%rbp),%rax
lea    0xeb7(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x8(%rbp),%eax
add    -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     1175 <t0+0x65>
movl   $0x0,-0x4(%rbp)
jmp    12ac <t0+0x19c>
jmp    1297 <t0+0x187>
mov    -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     119d <t0+0x8d>
movl   $0x0,-0x4(%rbp)
jmp    12ac <t0+0x19c>
jmp    1297 <t0+0x187>
mov    -0xc(%rbp),%eax
add    -0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     11c5 <t0+0xb5>
movl   $0x0,-0x4(%rbp)
jmp    12ac <t0+0x19c>
jmp    1297 <t0+0x187>
mov    -0x8(%rbp),%eax
add    -0xc(%rbp),%eax
add    -0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     11f0 <t0+0xe0>
movl   $0x0,-0x4(%rbp)
jmp    12ac <t0+0x19c>
jmp    1297 <t0+0x187>
mov    -0x8(%rbp),%eax
sub    -0xc(%rbp),%eax
add    -0x10(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     1237 <t0+0x127>
xor    %eax,%eax
sub    -0x8(%rbp),%eax
add    -0xc(%rbp),%eax
add    -0x10(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     1237 <t0+0x127>
movl   $0x0,-0x4(%rbp)
jmp    12ac <t0+0x19c>
jmp    1297 <t0+0x187>
mov    -0x8(%rbp),%eax
add    -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1281 <t0+0x171>
mov    -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1281 <t0+0x171>
mov    -0xc(%rbp),%eax
add    -0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     128d <t0+0x17d>
movl   $0x0,-0x4(%rbp)
jmp    12ac <t0+0x19c>
jmp    1297 <t0+0x187>
jmp    1297 <t0+0x187>
mov    -0x8(%rbp),%edi
mov    -0xc(%rbp),%esi
mov    -0x10(%rbp),%edx
mov    -0x18(%rbp),%rcx
call   1030 <t_special@plt>
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<t0>:
movsbl (%rcx),%eax
add    $0xffffffbf,%eax
cmp    $0x11,%eax
ja     118e <t0+0x7e>
lea    0xede(%rip),%r8
movslq (%r8,%rax,4),%rax
add    %r8,%rax
jmp    *%rax
lea    (%rdx,%rdi,1),%eax
test   $0x1,%al
jne    1182 <t0+0x72>
jmp    118e <t0+0x7e>
lea    (%rsi,%rdi,1),%eax
test   $0x1,%al
jne    1182 <t0+0x72>
jmp    118e <t0+0x7e>
lea    (%rsi,%rdi,1),%eax
test   $0x1,%al
jne    1182 <t0+0x72>
lea    (%rdx,%rdi,1),%eax
test   $0x1,%al
jne    1182 <t0+0x72>
lea    (%rdx,%rsi,1),%eax
test   $0x1,%al
jne    1182 <t0+0x72>
jmp    118e <t0+0x7e>
lea    (%rdx,%rdi,1),%eax
sub    %esi,%eax
imul   $0xaaaaaaab,%eax,%eax
add    $0x2aaaaaaa,%eax
cmp    $0x55555555,%eax
jb     118e <t0+0x7e>
lea    (%rdx,%rsi,1),%eax
sub    %edi,%eax
imul   $0xaaaaaaab,%eax,%eax
add    $0x2aaaaaaa,%eax
cmp    $0x55555555,%eax
jb     118e <t0+0x7e>
xor    %eax,%eax
ret
lea    (%rsi,%rdi,1),%eax
add    %edx,%eax
test   $0x1,%al
jne    1182 <t0+0x72>
jmp    1030 <t_special@plt>

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

LLVM IR (-O2):
define i32 @t0(i32 %0, i32 %1, i32 %2, i8* %3) {
%5 = load i8, i8* %3
%6 = sext i8 %5 to i32
switch i32 %6, label %46 [
i32 67, label %7
i32 66, label %11
i32 65, label %15
i32 73, label %19
i32 82, label %24
i32 70, label %34
]
7: ; preds = %4
%8 = add nsw i32 %1, %0
%9 = and i32 %8, 1
%10 = icmp eq i32 %9, 0
br i1 %10, label %46, label %48
11: ; preds = %4
%12 = add nsw i32 %2, %0
%13 = and i32 %12, 1
%14 = icmp eq i32 %13, 0
br i1 %14, label %46, label %48
15: ; preds = %4
%16 = add nsw i32 %2, %1
%17 = and i32 %16, 1
%18 = icmp eq i32 %17, 0
br i1 %18, label %46, label %48
19: ; preds = %4
%20 = add nsw i32 %1, %0
%21 = add nsw i32 %20, %2
%22 = and i32 %21, 1
%23 = icmp eq i32 %22, 0
br i1 %23, label %46, label %48
24: ; preds = %4
%25 = add i32 %2, %0
%26 = sub i32 %25, %1
%27 = srem i32 %26, 3
%28 = icmp eq i32 %27, 0
br i1 %28, label %46, label %29
29: ; preds = %24
%30 = add i32 %2, %1
%31 = sub i32 %30, %0
%32 = srem i32 %31, 3
%33 = icmp eq i32 %32, 0
br i1 %33, label %46, label %48
34: ; preds = %4
%35 = add nsw i32 %1, %0
%36 = and i32 %35, 1
%37 = icmp eq i32 %36, 0
br i1 %37, label %38, label %48
38: ; preds = %34
%39 = add nsw i32 %2, %0
%40 = and i32 %39, 1
%41 = icmp eq i32 %40, 0
br i1 %41, label %42, label %48
42: ; preds = %38
%43 = add nsw i32 %2, %1
%44 = and i32 %43, 1
%45 = icmp eq i32 %44, 0
br i1 %45, label %46, label %48
46: ; preds = %4, %42, %24, %29, %19, %15, %11, %7
%47 = tail call i32 @t_special(i32 %0, i32 %1, i32 %2, i8* %3)
br label %48
48: ; preds = %34, %38, %42, %29, %19, %15, %11, %7, %46
%49 = phi i32 [ %47, %46 ], [ 0, %7 ], [ 0, %11 ], [ 0, %15 ], [ 0, %19 ], [ 0, %29 ], [ 0, %42 ], [ 0, %38 ], [ 0, %34 ]
ret i32 %49
}