char get_mod(char fr, char fl) {
  if (fl == 'j')
    return (fl);
  else if (fr == 'h' && fl == 'h')
    fl = 'f';
  else if (fr == 'h' && fl == 'f')
    fl = 'h';
  else if (fr == 'l' && fl == 'l')
    fl = 'm';
  else if (fr == 'l' && fl == 'm')
    fl = 'l';
  else if (fr > fl || fr == 'j')
    fl = fr;
  return (fl);
}


x86 assembly (clang, -O0):
<get_mod>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %dil,%cl
mov    %cl,-0x2(%rbp)
mov    %al,-0x3(%rbp)
movsbl -0x3(%rbp),%eax
cmp    $0x6a,%eax
jne    1128 <get_mod+0x28>
mov    -0x3(%rbp),%al
mov    %al,-0x1(%rbp)
jmp    11f6 <get_mod+0xf6>
movsbl -0x2(%rbp),%eax
cmp    $0x68,%eax
jne    114b <get_mod+0x4b>
movsbl -0x3(%rbp),%eax
cmp    $0x68,%eax
jne    114b <get_mod+0x4b>
movb   $0x66,-0x3(%rbp)
jmp    11eb <get_mod+0xeb>
movsbl -0x2(%rbp),%eax
cmp    $0x68,%eax
jne    116e <get_mod+0x6e>
movsbl -0x3(%rbp),%eax
cmp    $0x66,%eax
jne    116e <get_mod+0x6e>
movb   $0x68,-0x3(%rbp)
jmp    11e6 <get_mod+0xe6>
movsbl -0x2(%rbp),%eax
cmp    $0x6c,%eax
jne    1191 <get_mod+0x91>
movsbl -0x3(%rbp),%eax
cmp    $0x6c,%eax
jne    1191 <get_mod+0x91>
movb   $0x6d,-0x3(%rbp)
jmp    11e1 <get_mod+0xe1>
movsbl -0x2(%rbp),%eax
cmp    $0x6c,%eax
jne    11b4 <get_mod+0xb4>
movsbl -0x3(%rbp),%eax
cmp    $0x6d,%eax
jne    11b4 <get_mod+0xb4>
movb   $0x6c,-0x3(%rbp)
jmp    11dc <get_mod+0xdc>
movsbl -0x2(%rbp),%eax
movsbl -0x3(%rbp),%ecx
cmp    %ecx,%eax
jg     11d1 <get_mod+0xd1>
movsbl -0x2(%rbp),%eax
cmp    $0x6a,%eax
jne    11d7 <get_mod+0xd7>
mov    -0x2(%rbp),%al
mov    %al,-0x3(%rbp)
jmp    11dc <get_mod+0xdc>
jmp    11e1 <get_mod+0xe1>
jmp    11e6 <get_mod+0xe6>
jmp    11eb <get_mod+0xeb>
jmp    11f0 <get_mod+0xf0>
mov    -0x3(%rbp),%al
mov    %al,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_mod>:
mov    $0x6a,%al
cmp    $0x6a,%sil
je     1116 <get_mod+0x16>
cmp    $0x68,%dil
jne    1117 <get_mod+0x17>
mov    $0x66,%al
cmp    $0x68,%sil
jne    1117 <get_mod+0x17>
ret
cmp    $0x68,%dil
jne    1125 <get_mod+0x25>
mov    $0x68,%al
cmp    $0x66,%sil
je     1116 <get_mod+0x16>
cmp    $0x6c,%dil
jne    1133 <get_mod+0x33>
mov    $0x6d,%al
cmp    $0x6c,%sil
je     1116 <get_mod+0x16>
cmp    $0x6c,%dil
jne    1141 <get_mod+0x41>
mov    $0x6c,%al
cmp    $0x6d,%sil
je     1116 <get_mod+0x16>
cmp    %sil,%dil
movzbl %dil,%ecx
movzbl %sil,%eax
cmovg  %ecx,%eax
cmp    $0x6a,%dil
cmove  %ecx,%eax
ret

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

LLVM IR (-O2):
define signext i8 @get_mod(i8 signext %0, i8 signext %1) {
%3 = icmp eq i8 %1, 106
br i1 %3, label %23, label %4
4: ; preds = %2
%5 = icmp eq i8 %0, 104
%6 = icmp eq i8 %1, 104
%7 = and i1 %5, %6
br i1 %7, label %23, label %8
8: ; preds = %4
%9 = icmp eq i8 %1, 102
%10 = and i1 %5, %9
br i1 %10, label %23, label %11
11: ; preds = %8
%12 = icmp eq i8 %0, 108
%13 = icmp eq i8 %1, 108
%14 = and i1 %12, %13
br i1 %14, label %23, label %15
15: ; preds = %11
%16 = icmp eq i8 %1, 109
%17 = and i1 %12, %16
br i1 %17, label %23, label %18
18: ; preds = %15
%19 = icmp sgt i8 %0, %1
%20 = icmp eq i8 %0, 106
%21 = or i1 %20, %19
%22 = select i1 %21, i8 %0, i8 %1
br label %23
23: ; preds = %18, %4, %8, %11, %15, %2
%24 = phi i8 [ 106, %2 ], [ 102, %4 ], [ 104, %8 ], [ 109, %11 ], [ 108, %15 ], [ %22, %18 ]
ret i8 %24
}