int string_to_bool(char *str) {
  if (*str == 'y' || *str == 'Y')
    return 1;
  if (*str == 't' || *str == 'T')
    return 1;
  if (*str == '1')
    return 1;
  if (*str == 'o' || *str == 'O') {
    if (*str == 'f' || *str == 'F')
      return 1;
  }
  return 0;
}


x86 assembly (clang, -O0):
<string_to_bool>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x79,%eax
je     1128 <string_to_bool+0x28>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x59,%eax
jne    1134 <string_to_bool+0x34>
movl   $0x1,-0x4(%rbp)
jmp    11d4 <string_to_bool+0xd4>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x74,%eax
je     1154 <string_to_bool+0x54>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x54,%eax
jne    1160 <string_to_bool+0x60>
movl   $0x1,-0x4(%rbp)
jmp    11d4 <string_to_bool+0xd4>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x31,%eax
jne    117c <string_to_bool+0x7c>
movl   $0x1,-0x4(%rbp)
jmp    11d4 <string_to_bool+0xd4>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x6f,%eax
je     119c <string_to_bool+0x9c>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x4f,%eax
jne    11cd <string_to_bool+0xcd>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x66,%eax
je     11bc <string_to_bool+0xbc>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x46,%eax
jne    11c8 <string_to_bool+0xc8>
movl   $0x1,-0x4(%rbp)
jmp    11d4 <string_to_bool+0xd4>
jmp    11cd <string_to_bool+0xcd>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<string_to_bool>:
mov    (%rdi),%cl
mov    $0x1,%eax
lea    -0x4f(%rcx),%edx
cmp    $0x2a,%dl
ja     113c <string_to_bool+0x3c>
movzbl %dl,%edx
movabs $0x42000000420,%rsi
bt     %rdx,%rsi
jae    1123 <string_to_bool+0x23>
ret
movabs $0x100000001,%rsi
bt     %rdx,%rsi
jae    113c <string_to_bool+0x3c>
xor    %eax,%eax
cmp    $0x66,%cl
sete   %al
ret
cmp    $0x31,%cl
je     1122 <string_to_bool+0x22>
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @string_to_bool(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 = icmp eq i32 %6, 121
br i1 %7, label %13, label %8
8: ; preds = %1
%9 = load i8*, i8** %3
%10 = load i8, i8* %9
%11 = sext i8 %10 to i32
%12 = icmp eq i32 %11, 89
br i1 %12, label %13, label %14
13: ; preds = %8, %1
store i32 1, i32* %2
br label %54
14: ; preds = %8
%15 = load i8*, i8** %3
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = icmp eq i32 %17, 116
br i1 %18, label %24, label %19
19: ; preds = %14
%20 = load i8*, i8** %3
%21 = load i8, i8* %20
%22 = sext i8 %21 to i32
%23 = icmp eq i32 %22, 84
br i1 %23, label %24, label %25
24: ; preds = %19, %14
store i32 1, i32* %2
br label %54
25: ; preds = %19
%26 = load i8*, i8** %3
%27 = load i8, i8* %26
%28 = sext i8 %27 to i32
%29 = icmp eq i32 %28, 49
br i1 %29, label %30, label %31
30: ; preds = %25
store i32 1, i32* %2
br label %54
31: ; preds = %25
%32 = load i8*, i8** %3
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
%35 = icmp eq i32 %34, 111
br i1 %35, label %41, label %36
36: ; preds = %31
%37 = load i8*, i8** %3
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = icmp eq i32 %39, 79
br i1 %40, label %41, label %53
41: ; preds = %36, %31
%42 = load i8*, i8** %3
%43 = load i8, i8* %42
%44 = sext i8 %43 to i32
%45 = icmp eq i32 %44, 102
br i1 %45, label %51, label %46
46: ; preds = %41
%47 = load i8*, i8** %3
%48 = load i8, i8* %47
%49 = sext i8 %48 to i32
%50 = icmp eq i32 %49, 70
br i1 %50, label %51, label %52
51: ; preds = %46, %41
store i32 1, i32* %2
br label %54
52: ; preds = %46
br label %53
53: ; preds = %52, %36
store i32 0, i32* %2
br label %54
54: ; preds = %53, %51, %30, %24, %13
%55 = load i32, i32* %2
ret i32 %55
}

LLVM IR (-O2):
define i32 @string_to_bool(i8* nocapture %0) {
%2 = load i8, i8* %0
switch i8 %2, label %6 [
i8 121, label %7
i8 89, label %7
i8 116, label %7
i8 84, label %7
i8 49, label %7
i8 111, label %3
i8 79, label %3
]
3: ; preds = %1, %1
%4 = icmp eq i8 %2, 102
%5 = zext i1 %4 to i32
br label %7
6: ; preds = %1
br label %7
7: ; preds = %3, %1, %1, %1, %1, %1, %6
%8 = phi i32 [ 0, %6 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ 1, %1 ], [ %5, %3 ]
ret i32 %8
}