char other(char x, char y) {
  if (x == 'a' && y == 'b')
    return 'c';
  if (x == 'a' && y == 'c')
    return 'b';
  if (x == 'b' && y == 'c')
    return 'a';
  if (x == 'b' && y == 'a')
    return 'c';
  if (x == 'c' && y == 'a')
    return 'b';
  return 'a';
}


x86 assembly (clang, -O0):
<other>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %dil,%cl
mov    %cl,-0x2(%rbp)
mov    %al,-0x3(%rbp)
movsbl -0x2(%rbp),%eax
cmp    $0x61,%eax
jne    1133 <other+0x33>
movsbl -0x3(%rbp),%eax
cmp    $0x62,%eax
jne    1133 <other+0x33>
movb   $0x63,-0x1(%rbp)
jmp    11c3 <other+0xc3>
movsbl -0x2(%rbp),%eax
cmp    $0x61,%eax
jne    1156 <other+0x56>
movsbl -0x3(%rbp),%eax
cmp    $0x63,%eax
jne    1156 <other+0x56>
movb   $0x62,-0x1(%rbp)
jmp    11c3 <other+0xc3>
movsbl -0x2(%rbp),%eax
cmp    $0x62,%eax
jne    1179 <other+0x79>
movsbl -0x3(%rbp),%eax
cmp    $0x63,%eax
jne    1179 <other+0x79>
movb   $0x61,-0x1(%rbp)
jmp    11c3 <other+0xc3>
movsbl -0x2(%rbp),%eax
cmp    $0x62,%eax
jne    119c <other+0x9c>
movsbl -0x3(%rbp),%eax
cmp    $0x61,%eax
jne    119c <other+0x9c>
movb   $0x63,-0x1(%rbp)
jmp    11c3 <other+0xc3>
movsbl -0x2(%rbp),%eax
cmp    $0x63,%eax
jne    11bf <other+0xbf>
movsbl -0x3(%rbp),%eax
cmp    $0x61,%eax
jne    11bf <other+0xbf>
movb   $0x62,-0x1(%rbp)
jmp    11c3 <other+0xc3>
movb   $0x61,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<other>:
mov    $0x63,%al
cmp    $0x61,%dil
jne    110f <other+0xf>
cmp    $0x62,%sil
jne    110f <other+0xf>
ret
cmp    $0x61,%dil
jne    111d <other+0x1d>
mov    $0x62,%al
cmp    $0x63,%sil
je     110e <other+0xe>
cmp    $0x62,%dil
jne    112b <other+0x2b>
mov    $0x61,%al
cmp    $0x63,%sil
je     110e <other+0xe>
cmp    $0x62,%dil
jne    1139 <other+0x39>
mov    $0x63,%al
cmp    $0x61,%sil
je     110e <other+0xe>
xor    $0x61,%sil
xor    $0x63,%dil
or     %sil,%dil
sete   %al
add    $0x61,%al
ret

LLVM IR (-O0):
define signext i8 @other(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* %4
%7 = sext i8 %6 to i32
%8 = icmp eq i32 %7, 97
br i1 %8, label %9, label %14
9: ; preds = %2
%10 = load i8, i8* %5
%11 = sext i8 %10 to i32
%12 = icmp eq i32 %11, 98
br i1 %12, label %13, label %14
13: ; preds = %9
store i8 99, i8* %3
br label %51
14: ; preds = %9, %2
%15 = load i8, i8* %4
%16 = sext i8 %15 to i32
%17 = icmp eq i32 %16, 97
br i1 %17, label %18, label %23
18: ; preds = %14
%19 = load i8, i8* %5
%20 = sext i8 %19 to i32
%21 = icmp eq i32 %20, 99
br i1 %21, label %22, label %23
22: ; preds = %18
store i8 98, i8* %3
br label %51
23: ; preds = %18, %14
%24 = load i8, i8* %4
%25 = sext i8 %24 to i32
%26 = icmp eq i32 %25, 98
br i1 %26, label %27, label %32
27: ; preds = %23
%28 = load i8, i8* %5
%29 = sext i8 %28 to i32
%30 = icmp eq i32 %29, 99
br i1 %30, label %31, label %32
31: ; preds = %27
store i8 97, i8* %3
br label %51
32: ; preds = %27, %23
%33 = load i8, i8* %4
%34 = sext i8 %33 to i32
%35 = icmp eq i32 %34, 98
br i1 %35, label %36, label %41
36: ; preds = %32
%37 = load i8, i8* %5
%38 = sext i8 %37 to i32
%39 = icmp eq i32 %38, 97
br i1 %39, label %40, label %41
40: ; preds = %36
store i8 99, i8* %3
br label %51
41: ; preds = %36, %32
%42 = load i8, i8* %4
%43 = sext i8 %42 to i32
%44 = icmp eq i32 %43, 99
br i1 %44, label %45, label %50
45: ; preds = %41
%46 = load i8, i8* %5
%47 = sext i8 %46 to i32
%48 = icmp eq i32 %47, 97
br i1 %48, label %49, label %50
49: ; preds = %45
store i8 98, i8* %3
br label %51
50: ; preds = %45, %41
store i8 97, i8* %3
br label %51
51: ; preds = %50, %49, %40, %31, %22, %13
%52 = load i8, i8* %3
ret i8 %52
}

LLVM IR (-O2):
define signext i8 @other(i8 signext %0, i8 signext %1) {
%3 = icmp eq i8 %0, 97
%4 = icmp eq i8 %1, 98
%5 = and i1 %3, %4
br i1 %5, label %19, label %6
6: ; preds = %2
%7 = icmp eq i8 %1, 99
%8 = and i1 %3, %7
br i1 %8, label %19, label %9
9: ; preds = %6
%10 = icmp eq i8 %0, 98
%11 = and i1 %10, %7
br i1 %11, label %19, label %12
12: ; preds = %9
%13 = icmp eq i8 %1, 97
%14 = and i1 %10, %13
br i1 %14, label %19, label %15
15: ; preds = %12
%16 = icmp eq i8 %0, 99
%17 = and i1 %16, %13
%18 = select i1 %17, i8 98, i8 97
br label %19
19: ; preds = %15, %12, %9, %6, %2
%20 = phi i8 [ 99, %2 ], [ 98, %6 ], [ 97, %9 ], [ 99, %12 ], [ %18, %15 ]
ret i8 %20
}