#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 tolower(char);
int isIupacAmbiguous(char c) {
  switch (tolower(c)) {
  case 'r':
  case 'y':
  case 's':
  case 'w':
  case 'k':
  case 'm':
  case 'b':
  case 'd':
  case 'h':
  case 'v':
  case 'n':
    return 1;
  }
  return 0;
}


x86 assembly (clang, -O0):
<isIupacAmbiguous>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %dil,%al
mov    %al,-0x5(%rbp)
movsbl -0x5(%rbp),%edi
call   1030 <tolower@plt>
mov    %eax,%ecx
mov    %ecx,-0xc(%rbp)
sub    $0x62,%eax
je     11ba <isIupacAmbiguous+0xaa>
jmp    113a <isIupacAmbiguous+0x2a>
mov    -0xc(%rbp),%eax
sub    $0x64,%eax
je     11ba <isIupacAmbiguous+0xaa>
jmp    114b <isIupacAmbiguous+0x3b>
mov    -0xc(%rbp),%eax
sub    $0x68,%eax
je     11ba <isIupacAmbiguous+0xaa>
jmp    115c <isIupacAmbiguous+0x4c>
mov    -0xc(%rbp),%eax
sub    $0x6b,%eax
je     11ba <isIupacAmbiguous+0xaa>
jmp    116d <isIupacAmbiguous+0x5d>
mov    -0xc(%rbp),%eax
add    $0xffffff93,%eax
sub    $0x2,%eax
jb     11ba <isIupacAmbiguous+0xaa>
jmp    1181 <isIupacAmbiguous+0x71>
mov    -0xc(%rbp),%eax
add    $0xffffff8e,%eax
sub    $0x2,%eax
jb     11ba <isIupacAmbiguous+0xaa>
jmp    1195 <isIupacAmbiguous+0x85>
mov    -0xc(%rbp),%eax
add    $0xffffff8a,%eax
sub    $0x2,%eax
jb     11ba <isIupacAmbiguous+0xaa>
jmp    11a9 <isIupacAmbiguous+0x99>
mov    -0xc(%rbp),%eax
sub    $0x79,%eax
jne    11c6 <isIupacAmbiguous+0xb6>
jmp    11ba <isIupacAmbiguous+0xaa>
movl   $0x1,-0x4(%rbp)
jmp    11cd <isIupacAmbiguous+0xbd>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<isIupacAmbiguous>:
push   %rax
call   1030 <tolower@plt>
add    $0xffffff9e,%eax
xor    %ecx,%ecx
cmp    $0x17,%eax
ja     112c <isIupacAmbiguous+0x1c>
cltq
lea    0xed7(%rip),%rcx
mov    (%rcx,%rax,4),%ecx
mov    %ecx,%eax
pop    %rcx
ret

LLVM IR (-O0):
define i32 @isIupacAmbiguous(i8 signext %0) {
%2 = alloca i32
%3 = alloca i8
store i8 %0, i8* %3
%4 = load i8, i8* %3
%5 = call i32 @tolower(i8 signext %4)
switch i32 %5, label %7 [
i32 114, label %6
i32 121, label %6
i32 115, label %6
i32 119, label %6
i32 107, label %6
i32 109, label %6
i32 98, label %6
i32 100, label %6
i32 104, label %6
i32 118, label %6
i32 110, label %6
]
6: ; preds = %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1
store i32 1, i32* %2
br label %8
7: ; preds = %1
store i32 0, i32* %2
br label %8
8: ; preds = %7, %6
%9 = load i32, i32* %2
ret i32 %9
}

LLVM IR (-O2):
@switch.table.isIupacAmbiguous = [24 x i32] [i32 1, i32 0, i32 1, i32 0, i32 0, i32 0, i32 1, i32 0, i32 0, i32 1, i32 0, i32 1, i32 1, i32 0, i32 0, i32 0, i32 1, i32 1, i32 0, i32 0, i32 1, i32 1, i32 0, i32 1]
define i32 @isIupacAmbiguous(i8 signext %0) {
%2 = tail call i32 @tolower(i8 signext %0)
%3 = add i32 %2, -98
%4 = icmp ult i32 %3, 24
br i1 %4, label %5, label %9
5: ; preds = %1
%6 = sext i32 %3 to i64
%7 = getelementptr inbounds [24 x i32], [24 x i32]* @switch.table.isIupacAmbiguous, i64 0, i64 %6
%8 = load i32, i32* %7
br label %9
9: ; preds = %1, %5
%10 = phi i32 [ %8, %5 ], [ 0, %1 ]
ret i32 %10
}