void move(char board[][3], int move, int player) {
  char piece;
  if (player == 1) {
    piece = 'X';
  } else if (player == 2) {
    piece = 'O';
  }
  switch (move) {
  case 1:
    board[2][0] = piece;
    break;
  case 2:
    board[2][1] = piece;
    break;
  case 3:
    board[2][2] = piece;
    break;
  case 4:
    board[1][0] = piece;
    break;
  case 5:
    board[1][1] = piece;
    break;
  case 6:
    board[1][2] = piece;
    break;
  case 7:
    board[0][0] = piece;
    break;
  case 8:
    board[0][1] = piece;
    break;
  case 9:
    board[0][2] = piece;
    break;
  }
}


x86 assembly (clang, -O0):
<move>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
cmpl   $0x1,-0x10(%rbp)
jne    1121 <move+0x21>
movb   $0x58,-0x11(%rbp)
jmp    1134 <move+0x34>
cmpl   $0x2,-0x10(%rbp)
jne    112f <move+0x2f>
movb   $0x4f,-0x11(%rbp)
jmp    1134 <move+0x34>
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0x8,%eax
ja     11de <move+0xde>
mov    -0x20(%rbp),%rax
lea    0xeac(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x11(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x6(%rax)
jmp    11de <move+0xde>
mov    -0x11(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x7(%rax)
jmp    11de <move+0xde>
mov    -0x11(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x8(%rax)
jmp    11de <move+0xde>
mov    -0x11(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x3(%rax)
jmp    11de <move+0xde>
mov    -0x11(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x4(%rax)
jmp    11de <move+0xde>
mov    -0x11(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x5(%rax)
jmp    11de <move+0xde>
mov    -0x11(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    11de <move+0xde>
mov    -0x11(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x1(%rax)
jmp    11de <move+0xde>
mov    -0x11(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x2(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<move>:
xor    %eax,%eax
cmp    $0x2,%edx
setne  %cl
add    $0xffffffff,%esi
cmp    $0x8,%esi
ja     1158 <move+0x58>
mov    %cl,%al
lea    (%rax,%rax,8),%eax
add    $0x4f,%eax
lea    0xee1(%rip),%rcx
movslq (%rcx,%rsi,4),%rdx
add    %rcx,%rdx
jmp    *%rdx
add    $0x6,%rdi
jmp    1156 <move+0x56>
add    $0x7,%rdi
jmp    1156 <move+0x56>
add    $0x8,%rdi
jmp    1156 <move+0x56>
add    $0x3,%rdi
jmp    1156 <move+0x56>
add    $0x4,%rdi
jmp    1156 <move+0x56>
add    $0x5,%rdi
jmp    1156 <move+0x56>
add    $0x1,%rdi
jmp    1156 <move+0x56>
add    $0x2,%rdi
mov    %al,(%rdi)
ret

LLVM IR (-O0):
define void @move([3 x i8]* %0, i32 %1, i32 %2) {
%4 = alloca [3 x i8]*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i8
store [3 x i8]* %0, [3 x i8]** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%8 = load i32, i32* %6
%9 = icmp eq i32 %8, 1
br i1 %9, label %10, label %11
10: ; preds = %3
store i8 88, i8* %7
br label %16
11: ; preds = %3
%12 = load i32, i32* %6
%13 = icmp eq i32 %12, 2
br i1 %13, label %14, label %15
14: ; preds = %11
store i8 79, i8* %7
br label %15
15: ; preds = %14, %11
br label %16
16: ; preds = %15, %10
%17 = load i32, i32* %5
switch i32 %17, label %63 [
i32 1, label %18
i32 2, label %23
i32 3, label %28
i32 4, label %33
i32 5, label %38
i32 6, label %43
i32 7, label %48
i32 8, label %53
i32 9, label %58
]
18: ; preds = %16
%19 = load i8, i8* %7
%20 = load [3 x i8]*, [3 x i8]** %4
%21 = getelementptr inbounds [3 x i8], [3 x i8]* %20, i64 2
%22 = getelementptr inbounds [3 x i8], [3 x i8]* %21, i64 0, i64 0
store i8 %19, i8* %22
br label %63
23: ; preds = %16
%24 = load i8, i8* %7
%25 = load [3 x i8]*, [3 x i8]** %4
%26 = getelementptr inbounds [3 x i8], [3 x i8]* %25, i64 2
%27 = getelementptr inbounds [3 x i8], [3 x i8]* %26, i64 0, i64 1
store i8 %24, i8* %27
br label %63
28: ; preds = %16
%29 = load i8, i8* %7
%30 = load [3 x i8]*, [3 x i8]** %4
%31 = getelementptr inbounds [3 x i8], [3 x i8]* %30, i64 2
%32 = getelementptr inbounds [3 x i8], [3 x i8]* %31, i64 0, i64 2
store i8 %29, i8* %32
br label %63
33: ; preds = %16
%34 = load i8, i8* %7
%35 = load [3 x i8]*, [3 x i8]** %4
%36 = getelementptr inbounds [3 x i8], [3 x i8]* %35, i64 1
%37 = getelementptr inbounds [3 x i8], [3 x i8]* %36, i64 0, i64 0
store i8 %34, i8* %37
br label %63
38: ; preds = %16
%39 = load i8, i8* %7
%40 = load [3 x i8]*, [3 x i8]** %4
%41 = getelementptr inbounds [3 x i8], [3 x i8]* %40, i64 1
%42 = getelementptr inbounds [3 x i8], [3 x i8]* %41, i64 0, i64 1
store i8 %39, i8* %42
br label %63
43: ; preds = %16
%44 = load i8, i8* %7
%45 = load [3 x i8]*, [3 x i8]** %4
%46 = getelementptr inbounds [3 x i8], [3 x i8]* %45, i64 1
%47 = getelementptr inbounds [3 x i8], [3 x i8]* %46, i64 0, i64 2
store i8 %44, i8* %47
br label %63
48: ; preds = %16
%49 = load i8, i8* %7
%50 = load [3 x i8]*, [3 x i8]** %4
%51 = getelementptr inbounds [3 x i8], [3 x i8]* %50, i64 0
%52 = getelementptr inbounds [3 x i8], [3 x i8]* %51, i64 0, i64 0
store i8 %49, i8* %52
br label %63
53: ; preds = %16
%54 = load i8, i8* %7
%55 = load [3 x i8]*, [3 x i8]** %4
%56 = getelementptr inbounds [3 x i8], [3 x i8]* %55, i64 0
%57 = getelementptr inbounds [3 x i8], [3 x i8]* %56, i64 0, i64 1
store i8 %54, i8* %57
br label %63
58: ; preds = %16
%59 = load i8, i8* %7
%60 = load [3 x i8]*, [3 x i8]** %4
%61 = getelementptr inbounds [3 x i8], [3 x i8]* %60, i64 0
%62 = getelementptr inbounds [3 x i8], [3 x i8]* %61, i64 0, i64 2
store i8 %59, i8* %62
br label %63
63: ; preds = %16, %58, %53, %48, %43, %38, %33, %28, %23, %18
ret void
}

LLVM IR (-O2):
define void @move([3 x i8]* nocapture writeonly %0, i32 %1, i32 %2) {
%4 = icmp eq i32 %2, 2
%5 = select i1 %4, i8 79, i8 88
switch i32 %1, label %26 [
i32 1, label %6
i32 2, label %8
i32 3, label %10
i32 4, label %12
i32 5, label %14
i32 6, label %16
i32 7, label %18
i32 8, label %20
i32 9, label %22
]
6: ; preds = %3
%7 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 2, i64 0
br label %24
8: ; preds = %3
%9 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 2, i64 1
br label %24
10: ; preds = %3
%11 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 2, i64 2
br label %24
12: ; preds = %3
%13 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 1, i64 0
br label %24
14: ; preds = %3
%15 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 1, i64 1
br label %24
16: ; preds = %3
%17 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 1, i64 2
br label %24
18: ; preds = %3
%19 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 0, i64 0
br label %24
20: ; preds = %3
%21 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 0, i64 1
br label %24
22: ; preds = %3
%23 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 0, i64 2
br label %24
24: ; preds = %6, %8, %10, %12, %14, %16, %18, %20, %22
%25 = phi i8* [ %23, %22 ], [ %21, %20 ], [ %19, %18 ], [ %17, %16 ], [ %15, %14 ], [ %13, %12 ], [ %11, %10 ], [ %9, %8 ], [ %7, %6 ]
store i8 %5, i8* %25
br label %26
26: ; preds = %24, %3
ret void
}