int greater(char char1, char char2) {
  if (char1 == char2) {
    return -1;
  } else if ((char1 == 'r') && (char2 == 's')) {
    return 1;
  } else if ((char2 == 'r' && char1 == 's')) {
    return 0;
  } else if ((char1 == 'p') && (char2 == 'r')) {
    return 1;
  } else if ((char2 == 'p') && (char1 == 'r')) {
    return 0;
  } else if ((char1 == 's') && (char2 == 'p')) {
    return 1;
  } else if ((char2 == 's') && (char1 == 'p')) {
    return 0;
  }
}


x86 assembly (clang, -O0):
<greater>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %dil,%cl
mov    %cl,-0x5(%rbp)
mov    %al,-0x6(%rbp)
movsbl -0x5(%rbp),%eax
movsbl -0x6(%rbp),%ecx
cmp    %ecx,%eax
jne    112c <greater+0x2c>
movl   $0xffffffff,-0x4(%rbp)
jmp    122e <greater+0x12e>
movsbl -0x5(%rbp),%eax
cmp    $0x72,%eax
jne    1152 <greater+0x52>
movsbl -0x6(%rbp),%eax
cmp    $0x73,%eax
jne    1152 <greater+0x52>
movl   $0x1,-0x4(%rbp)
jmp    122e <greater+0x12e>
movsbl -0x6(%rbp),%eax
cmp    $0x72,%eax
jne    1178 <greater+0x78>
movsbl -0x5(%rbp),%eax
cmp    $0x73,%eax
jne    1178 <greater+0x78>
movl   $0x0,-0x4(%rbp)
jmp    122e <greater+0x12e>
movsbl -0x5(%rbp),%eax
cmp    $0x70,%eax
jne    119e <greater+0x9e>
movsbl -0x6(%rbp),%eax
cmp    $0x72,%eax
jne    119e <greater+0x9e>
movl   $0x1,-0x4(%rbp)
jmp    122e <greater+0x12e>
movsbl -0x6(%rbp),%eax
cmp    $0x70,%eax
jne    11c4 <greater+0xc4>
movsbl -0x5(%rbp),%eax
cmp    $0x72,%eax
jne    11c4 <greater+0xc4>
movl   $0x0,-0x4(%rbp)
jmp    122e <greater+0x12e>
movsbl -0x5(%rbp),%eax
cmp    $0x73,%eax
jne    11ea <greater+0xea>
movsbl -0x6(%rbp),%eax
cmp    $0x70,%eax
jne    11ea <greater+0xea>
movl   $0x1,-0x4(%rbp)
jmp    122e <greater+0x12e>
movsbl -0x6(%rbp),%eax
cmp    $0x73,%eax
jne    1210 <greater+0x110>
movsbl -0x5(%rbp),%eax
cmp    $0x70,%eax
jne    1210 <greater+0x110>
movl   $0x0,-0x4(%rbp)
jmp    122e <greater+0x12e>
jmp    1215 <greater+0x115>
jmp    121a <greater+0x11a>
jmp    121f <greater+0x11f>
jmp    1224 <greater+0x124>
jmp    1229 <greater+0x129>
jmp    122e <greater+0x12e>
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<greater>:
mov    $0xffffffff,%eax
cmp    %sil,%dil
je     111b <greater+0x1b>
mov    $0x1,%eax
cmp    $0x72,%dil
jne    111c <greater+0x1c>
cmp    $0x73,%sil
jne    111c <greater+0x1c>
ret
cmp    $0x73,%dil
jne    112b <greater+0x2b>
cmp    $0x72,%sil
jne    112b <greater+0x2b>
xor    %eax,%eax
ret
cmp    $0x70,%dil
jne    1137 <greater+0x37>
cmp    $0x72,%sil
je     111b <greater+0x1b>
cmp    $0x72,%dil
jne    1148 <greater+0x48>
mov    $0x0,%eax
cmp    $0x70,%sil
je     111b <greater+0x1b>
xor    $0x70,%sil
xor    $0x73,%dil
xor    %eax,%eax
or     %sil,%dil
sete   %al
ret

LLVM IR (-O0):
define i32 @greater(i8 signext %0, i8 signext %1) {
%3 = alloca i32
%4 = alloca i8
%5 = alloca i8
store i8 %0, i8* %4
store i8 %1, i8* %5
%6 = load i8, i8* %4
%7 = sext i8 %6 to i32
%8 = load i8, i8* %5
%9 = sext i8 %8 to i32
%10 = icmp eq i32 %7, %9
br i1 %10, label %11, label %12
11: ; preds = %2
store i32 -1, i32* %3
br label %72
12: ; preds = %2
%13 = load i8, i8* %4
%14 = sext i8 %13 to i32
%15 = icmp eq i32 %14, 114
br i1 %15, label %16, label %21
16: ; preds = %12
%17 = load i8, i8* %5
%18 = sext i8 %17 to i32
%19 = icmp eq i32 %18, 115
br i1 %19, label %20, label %21
20: ; preds = %16
store i32 1, i32* %3
br label %72
21: ; preds = %16, %12
%22 = load i8, i8* %5
%23 = sext i8 %22 to i32
%24 = icmp eq i32 %23, 114
br i1 %24, label %25, label %30
25: ; preds = %21
%26 = load i8, i8* %4
%27 = sext i8 %26 to i32
%28 = icmp eq i32 %27, 115
br i1 %28, label %29, label %30
29: ; preds = %25
store i32 0, i32* %3
br label %72
30: ; preds = %25, %21
%31 = load i8, i8* %4
%32 = sext i8 %31 to i32
%33 = icmp eq i32 %32, 112
br i1 %33, label %34, label %39
34: ; preds = %30
%35 = load i8, i8* %5
%36 = sext i8 %35 to i32
%37 = icmp eq i32 %36, 114
br i1 %37, label %38, label %39
38: ; preds = %34
store i32 1, i32* %3
br label %72
39: ; preds = %34, %30
%40 = load i8, i8* %5
%41 = sext i8 %40 to i32
%42 = icmp eq i32 %41, 112
br i1 %42, label %43, label %48
43: ; preds = %39
%44 = load i8, i8* %4
%45 = sext i8 %44 to i32
%46 = icmp eq i32 %45, 114
br i1 %46, label %47, label %48
47: ; preds = %43
store i32 0, i32* %3
br label %72
48: ; preds = %43, %39
%49 = load i8, i8* %4
%50 = sext i8 %49 to i32
%51 = icmp eq i32 %50, 115
br i1 %51, label %52, label %57
52: ; preds = %48
%53 = load i8, i8* %5
%54 = sext i8 %53 to i32
%55 = icmp eq i32 %54, 112
br i1 %55, label %56, label %57
56: ; preds = %52
store i32 1, i32* %3
br label %72
57: ; preds = %52, %48
%58 = load i8, i8* %5
%59 = sext i8 %58 to i32
%60 = icmp eq i32 %59, 115
br i1 %60, label %61, label %66
61: ; preds = %57
%62 = load i8, i8* %4
%63 = sext i8 %62 to i32
%64 = icmp eq i32 %63, 112
br i1 %64, label %65, label %66
65: ; preds = %61
store i32 0, i32* %3
br label %72
66: ; preds = %61, %57
br label %67
67: ; preds = %66
br label %68
68: ; preds = %67
br label %69
69: ; preds = %68
br label %70
70: ; preds = %69
br label %71
71: ; preds = %70
br label %72
72: ; preds = %11, %20, %29, %38, %47, %56, %65, %71
%73 = load i32, i32* %3
ret i32 %73
}

LLVM IR (-O2):
define i32 @greater(i8 signext %0, i8 signext %1) {
%3 = icmp eq i8 %0, %1
br i1 %3, label %21, label %4
4: ; preds = %2
%5 = icmp eq i8 %0, 114
%6 = icmp eq i8 %1, 115
%7 = and i1 %5, %6
br i1 %7, label %21, label %8
8: ; preds = %4
%9 = icmp eq i8 %1, 114
%10 = icmp eq i8 %0, 115
%11 = and i1 %10, %9
br i1 %11, label %21, label %12
12: ; preds = %8
%13 = icmp eq i8 %0, 112
%14 = and i1 %13, %9
br i1 %14, label %21, label %15
15: ; preds = %12
%16 = icmp eq i8 %1, 112
%17 = and i1 %5, %16
br i1 %17, label %21, label %18
18: ; preds = %15
%19 = and i1 %10, %16
%20 = zext i1 %19 to i32
br label %21
21: ; preds = %18, %15, %12, %8, %4, %2
%22 = phi i32 [ -1, %2 ], [ 1, %4 ], [ 0, %8 ], [ 1, %12 ], [ 0, %15 ], [ %20, %18 ]
ret i32 %22
}