int check_diagonal(char board[][3]) {
  int winner = 0;
  if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) {
    if (board[0][0] == '-' && board[1][1] == '-' && board[2][2] == '-') {
    } else {
      if (board[2][2] == 'X') {
        winner = 1;
      } else {
        winner = 2;
      }
    }
  }
  if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) {
    if (board[0][2] == '-' && board[1][1] == '-' && board[2][0] == '-') {
    } else {
      if (board[2][0] == 'X') {
        winner = 1;
      } else {
        winner = 2;
      }
    }
  }
  return winner;
}


x86 assembly (clang, -O0):
<check_diagonal>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
mov    -0x8(%rbp),%rcx
movsbl 0x4(%rcx),%ecx
cmp    %ecx,%eax
jne    11a3 <check_diagonal+0xa3>
mov    -0x8(%rbp),%rax
movsbl 0x4(%rax),%eax
mov    -0x8(%rbp),%rcx
movsbl 0x8(%rcx),%ecx
cmp    %ecx,%eax
jne    11a3 <check_diagonal+0xa3>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1175 <check_diagonal+0x75>
mov    -0x8(%rbp),%rax
movsbl 0x4(%rax),%eax
cmp    $0x2d,%eax
jne    1175 <check_diagonal+0x75>
mov    -0x8(%rbp),%rax
movsbl 0x8(%rax),%eax
cmp    $0x2d,%eax
jne    1175 <check_diagonal+0x75>
jmp    119e <check_diagonal+0x9e>
mov    -0x8(%rbp),%rax
movsbl 0x8(%rax),%eax
cmp    $0x58,%eax
jne    1192 <check_diagonal+0x92>
movl   $0x1,-0xc(%rbp)
jmp    1199 <check_diagonal+0x99>
movl   $0x2,-0xc(%rbp)
jmp    119e <check_diagonal+0x9e>
jmp    11a3 <check_diagonal+0xa3>
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%eax
mov    -0x8(%rbp),%rcx
movsbl 0x4(%rcx),%ecx
cmp    %ecx,%eax
jne    1239 <check_diagonal+0x139>
mov    -0x8(%rbp),%rax
movsbl 0x4(%rax),%eax
mov    -0x8(%rbp),%rcx
movsbl 0x6(%rcx),%ecx
cmp    %ecx,%eax
jne    1239 <check_diagonal+0x139>
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x2d,%eax
jne    120b <check_diagonal+0x10b>
mov    -0x8(%rbp),%rax
movsbl 0x4(%rax),%eax
cmp    $0x2d,%eax
jne    120b <check_diagonal+0x10b>
mov    -0x8(%rbp),%rax
movsbl 0x6(%rax),%eax
cmp    $0x2d,%eax
jne    120b <check_diagonal+0x10b>
jmp    1234 <check_diagonal+0x134>
mov    -0x8(%rbp),%rax
movsbl 0x6(%rax),%eax
cmp    $0x58,%eax
jne    1228 <check_diagonal+0x128>
movl   $0x1,-0xc(%rbp)
jmp    122f <check_diagonal+0x12f>
movl   $0x2,-0xc(%rbp)
jmp    1234 <check_diagonal+0x134>
jmp    1239 <check_diagonal+0x139>
mov    -0xc(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<check_diagonal>:
mov    (%rdi),%dl
mov    0x4(%rdi),%cl
xor    %eax,%eax
cmp    %cl,%dl
jne    1125 <check_diagonal+0x25>
cmp    0x8(%rdi),%dl
jne    1125 <check_diagonal+0x25>
cmp    $0x2d,%dl
je     1125 <check_diagonal+0x25>
xor    %esi,%esi
cmp    $0x58,%dl
sete   %sil
mov    $0x2,%eax
sub    %esi,%eax
cmp    %cl,0x2(%rdi)
jne    1143 <check_diagonal+0x43>
cmp    0x6(%rdi),%cl
jne    1143 <check_diagonal+0x43>
cmp    $0x2d,%cl
je     1143 <check_diagonal+0x43>
xor    %edx,%edx
cmp    $0x58,%cl
sete   %dl
mov    $0x2,%eax
sub    %edx,%eax
ret

LLVM IR (-O0):
define i32 @check_diagonal([3 x i8]* %0) {
%2 = alloca [3 x i8]*
%3 = alloca i32
store [3 x i8]* %0, [3 x i8]** %2
store i32 0, i32* %3
%4 = load [3 x i8]*, [3 x i8]** %2
%5 = getelementptr inbounds [3 x i8], [3 x i8]* %4, i64 0
%6 = getelementptr inbounds [3 x i8], [3 x i8]* %5, i64 0, i64 0
%7 = load i8, i8* %6
%8 = sext i8 %7 to i32
%9 = load [3 x i8]*, [3 x i8]** %2
%10 = getelementptr inbounds [3 x i8], [3 x i8]* %9, i64 1
%11 = getelementptr inbounds [3 x i8], [3 x i8]* %10, i64 0, i64 1
%12 = load i8, i8* %11
%13 = sext i8 %12 to i32
%14 = icmp eq i32 %8, %13
br i1 %14, label %15, label %60
15: ; preds = %1
%16 = load [3 x i8]*, [3 x i8]** %2
%17 = getelementptr inbounds [3 x i8], [3 x i8]* %16, i64 1
%18 = getelementptr inbounds [3 x i8], [3 x i8]* %17, i64 0, i64 1
%19 = load i8, i8* %18
%20 = sext i8 %19 to i32
%21 = load [3 x i8]*, [3 x i8]** %2
%22 = getelementptr inbounds [3 x i8], [3 x i8]* %21, i64 2
%23 = getelementptr inbounds [3 x i8], [3 x i8]* %22, i64 0, i64 2
%24 = load i8, i8* %23
%25 = sext i8 %24 to i32
%26 = icmp eq i32 %20, %25
br i1 %26, label %27, label %60
27: ; preds = %15
%28 = load [3 x i8]*, [3 x i8]** %2
%29 = getelementptr inbounds [3 x i8], [3 x i8]* %28, i64 0
%30 = getelementptr inbounds [3 x i8], [3 x i8]* %29, i64 0, i64 0
%31 = load i8, i8* %30
%32 = sext i8 %31 to i32
%33 = icmp eq i32 %32, 45
br i1 %33, label %34, label %49
34: ; preds = %27
%35 = load [3 x i8]*, [3 x i8]** %2
%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 1
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = icmp eq i32 %39, 45
br i1 %40, label %41, label %49
41: ; preds = %34
%42 = load [3 x i8]*, [3 x i8]** %2
%43 = getelementptr inbounds [3 x i8], [3 x i8]* %42, i64 2
%44 = getelementptr inbounds [3 x i8], [3 x i8]* %43, i64 0, i64 2
%45 = load i8, i8* %44
%46 = sext i8 %45 to i32
%47 = icmp eq i32 %46, 45
br i1 %47, label %48, label %49
48: ; preds = %41
br label %59
49: ; preds = %41, %34, %27
%50 = load [3 x i8]*, [3 x i8]** %2
%51 = getelementptr inbounds [3 x i8], [3 x i8]* %50, i64 2
%52 = getelementptr inbounds [3 x i8], [3 x i8]* %51, i64 0, i64 2
%53 = load i8, i8* %52
%54 = sext i8 %53 to i32
%55 = icmp eq i32 %54, 88
br i1 %55, label %56, label %57
56: ; preds = %49
store i32 1, i32* %3
br label %58
57: ; preds = %49
store i32 2, i32* %3
br label %58
58: ; preds = %57, %56
br label %59
59: ; preds = %58, %48
br label %60
60: ; preds = %59, %15, %1
%61 = load [3 x i8]*, [3 x i8]** %2
%62 = getelementptr inbounds [3 x i8], [3 x i8]* %61, i64 0
%63 = getelementptr inbounds [3 x i8], [3 x i8]* %62, i64 0, i64 2
%64 = load i8, i8* %63
%65 = sext i8 %64 to i32
%66 = load [3 x i8]*, [3 x i8]** %2
%67 = getelementptr inbounds [3 x i8], [3 x i8]* %66, i64 1
%68 = getelementptr inbounds [3 x i8], [3 x i8]* %67, i64 0, i64 1
%69 = load i8, i8* %68
%70 = sext i8 %69 to i32
%71 = icmp eq i32 %65, %70
br i1 %71, label %72, label %117
72: ; preds = %60
%73 = load [3 x i8]*, [3 x i8]** %2
%74 = getelementptr inbounds [3 x i8], [3 x i8]* %73, i64 1
%75 = getelementptr inbounds [3 x i8], [3 x i8]* %74, i64 0, i64 1
%76 = load i8, i8* %75
%77 = sext i8 %76 to i32
%78 = load [3 x i8]*, [3 x i8]** %2
%79 = getelementptr inbounds [3 x i8], [3 x i8]* %78, i64 2
%80 = getelementptr inbounds [3 x i8], [3 x i8]* %79, i64 0, i64 0
%81 = load i8, i8* %80
%82 = sext i8 %81 to i32
%83 = icmp eq i32 %77, %82
br i1 %83, label %84, label %117
84: ; preds = %72
%85 = load [3 x i8]*, [3 x i8]** %2
%86 = getelementptr inbounds [3 x i8], [3 x i8]* %85, i64 0
%87 = getelementptr inbounds [3 x i8], [3 x i8]* %86, i64 0, i64 2
%88 = load i8, i8* %87
%89 = sext i8 %88 to i32
%90 = icmp eq i32 %89, 45
br i1 %90, label %91, label %106
91: ; preds = %84
%92 = load [3 x i8]*, [3 x i8]** %2
%93 = getelementptr inbounds [3 x i8], [3 x i8]* %92, i64 1
%94 = getelementptr inbounds [3 x i8], [3 x i8]* %93, i64 0, i64 1
%95 = load i8, i8* %94
%96 = sext i8 %95 to i32
%97 = icmp eq i32 %96, 45
br i1 %97, label %98, label %106
98: ; preds = %91
%99 = load [3 x i8]*, [3 x i8]** %2
%100 = getelementptr inbounds [3 x i8], [3 x i8]* %99, i64 2
%101 = getelementptr inbounds [3 x i8], [3 x i8]* %100, i64 0, i64 0
%102 = load i8, i8* %101
%103 = sext i8 %102 to i32
%104 = icmp eq i32 %103, 45
br i1 %104, label %105, label %106
105: ; preds = %98
br label %116
106: ; preds = %98, %91, %84
%107 = load [3 x i8]*, [3 x i8]** %2
%108 = getelementptr inbounds [3 x i8], [3 x i8]* %107, i64 2
%109 = getelementptr inbounds [3 x i8], [3 x i8]* %108, i64 0, i64 0
%110 = load i8, i8* %109
%111 = sext i8 %110 to i32
%112 = icmp eq i32 %111, 88
br i1 %112, label %113, label %114
113: ; preds = %106
store i32 1, i32* %3
br label %115
114: ; preds = %106
store i32 2, i32* %3
br label %115
115: ; preds = %114, %113
br label %116
116: ; preds = %115, %105
br label %117
117: ; preds = %116, %72, %60
%118 = load i32, i32* %3
ret i32 %118
}

LLVM IR (-O2):
define i32 @check_diagonal([3 x i8]* nocapture %0) {
%2 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 0, i64 0
%3 = load i8, i8* %2
%4 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 1, i64 1
%5 = load i8, i8* %4
%6 = icmp eq i8 %3, %5
br i1 %6, label %7, label %16
7: ; preds = %1
%8 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 2, i64 2
%9 = load i8, i8* %8
%10 = icmp ne i8 %3, %9
%11 = icmp eq i8 %3, 45
%12 = or i1 %10, %11
br i1 %12, label %16, label %13
13: ; preds = %7
%14 = icmp eq i8 %3, 88
%15 = select i1 %14, i32 1, i32 2
br label %16
16: ; preds = %13, %7, %1
%17 = phi i32 [ 0, %7 ], [ 0, %1 ], [ %15, %13 ]
%18 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 0, i64 2
%19 = load i8, i8* %18
%20 = icmp eq i8 %19, %5
br i1 %20, label %21, label %30
21: ; preds = %16
%22 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i64 2, i64 0
%23 = load i8, i8* %22
%24 = icmp ne i8 %5, %23
%25 = icmp eq i8 %5, 45
%26 = or i1 %24, %25
br i1 %26, label %30, label %27
27: ; preds = %21
%28 = icmp eq i8 %5, 88
%29 = select i1 %28, i32 1, i32 2
br label %30
30: ; preds = %27, %21, %16
%31 = phi i32 [ %17, %21 ], [ %17, %16 ], [ %29, %27 ]
ret i32 %31
}