int Precede(char x, char y) {
  switch (x) {
  case '+':
  case '-':
    x = 1;
    break;
  case '*':
  case '/':
    x = 2;
    break;
  }
  switch (y) {
  case '+':
  case '-':
    y = 1;
    break;
  case '*':
  case '/':
    y = 2;
    break;
  }
  return x - y;
}


x86 assembly (clang, -O0):
<Precede>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %dil,%cl
mov    %cl,-0x1(%rbp)
mov    %al,-0x2(%rbp)
movsbl -0x1(%rbp),%eax
add    $0xffffffd6,%eax
mov    %eax,%ecx
mov    %rcx,-0x10(%rbp)
sub    $0x5,%eax
ja     1147 <Precede+0x47>
mov    -0x10(%rbp),%rax
lea    0xecf(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movb   $0x1,-0x1(%rbp)
jmp    1147 <Precede+0x47>
movb   $0x2,-0x1(%rbp)
movsbl -0x2(%rbp),%eax
add    $0xffffffd6,%eax
mov    %eax,%ecx
mov    %rcx,-0x18(%rbp)
sub    $0x5,%eax
ja     117e <Precede+0x7e>
mov    -0x18(%rbp),%rax
lea    0xeb0(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movb   $0x1,-0x2(%rbp)
jmp    117e <Precede+0x7e>
movb   $0x2,-0x2(%rbp)
movsbl -0x1(%rbp),%eax
movsbl -0x2(%rbp),%ecx
sub    %ecx,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<Precede>:
mov    %edi,%ecx
add    $0xffffffd6,%ecx
cmp    $0x5,%ecx
ja     1124 <Precede+0x24>
mov    $0x2b,%eax
bt     %ecx,%eax
jae    1124 <Precede+0x24>
shl    $0x3,%ecx
movabs $0x20101010102,%rdi
shr    %cl,%rdi
movsbl %sil,%ecx
add    $0xffffffd6,%ecx
cmp    $0x5,%ecx
ja     114a <Precede+0x4a>
mov    $0x2b,%eax
bt     %ecx,%eax
jae    114a <Precede+0x4a>
shl    $0x3,%ecx
movabs $0x20101010102,%rsi
shr    %cl,%rsi
movsbl %dil,%eax
movsbl %sil,%ecx
sub    %ecx,%eax
ret

LLVM IR (-O0):
define i32 @Precede(i8 signext %0, i8 signext %1) {
%3 = alloca i8
%4 = alloca i8
store i8 %0, i8* %3
store i8 %1, i8* %4
%5 = load i8, i8* %3
%6 = sext i8 %5 to i32
switch i32 %6, label %9 [
i32 43, label %7
i32 45, label %7
i32 42, label %8
i32 47, label %8
]
7: ; preds = %2, %2
store i8 1, i8* %3
br label %9
8: ; preds = %2, %2
store i8 2, i8* %3
br label %9
9: ; preds = %2, %8, %7
%10 = load i8, i8* %4
%11 = sext i8 %10 to i32
switch i32 %11, label %14 [
i32 43, label %12
i32 45, label %12
i32 42, label %13
i32 47, label %13
]
12: ; preds = %9, %9
store i8 1, i8* %4
br label %14
13: ; preds = %9, %9
store i8 2, i8* %4
br label %14
14: ; preds = %9, %13, %12
%15 = load i8, i8* %3
%16 = sext i8 %15 to i32
%17 = load i8, i8* %4
%18 = sext i8 %17 to i32
%19 = sub nsw i32 %16, %18
ret i32 %19
}

LLVM IR (-O2):
define i32 @Precede(i8 signext %0, i8 signext %1) {
%3 = sext i8 %0 to i32
%4 = add nsw i32 %3, -42
%5 = icmp ult i32 %4, 6
br i1 %5, label %6, label %16
6: ; preds = %2
%7 = trunc i32 %4 to i8
%8 = lshr i8 43, %7
%9 = and i8 %8, 1
%10 = icmp eq i8 %9, 0
br i1 %10, label %16, label %11
11: ; preds = %6
%12 = zext i32 %4 to i48
%13 = shl nuw nsw i48 %12, 3
%14 = lshr i48 2203335065858, %13
%15 = trunc i48 %14 to i8
br label %16
16: ; preds = %11, %6, %2
%17 = phi i8 [ %0, %2 ], [ %0, %6 ], [ %15, %11 ]
%18 = sext i8 %1 to i32
%19 = add nsw i32 %18, -42
%20 = icmp ult i32 %19, 6
br i1 %20, label %21, label %31
21: ; preds = %16
%22 = trunc i32 %19 to i8
%23 = lshr i8 43, %22
%24 = and i8 %23, 1
%25 = icmp eq i8 %24, 0
br i1 %25, label %31, label %26
26: ; preds = %21
%27 = zext i32 %19 to i48
%28 = shl nuw nsw i48 %27, 3
%29 = lshr i48 2203335065858, %28
%30 = trunc i48 %29 to i8
br label %31
31: ; preds = %26, %21, %16
%32 = phi i8 [ %1, %16 ], [ %1, %21 ], [ %30, %26 ]
%33 = sext i8 %17 to i32
%34 = sext i8 %32 to i32
%35 = sub nsw i32 %33, %34
ret i32 %35
}