int isFinished(int grid[]) {
  int arr[8][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 3, 6},
                   {1, 4, 7}, {2, 5, 8}, {0, 4, 8}, {2, 4, 6}};
  int i;
  for (i = 0; i < 8; ++i)
    if (grid[arr[i][0]] != ' ' && grid[arr[i][0]] == grid[arr[i][1]] &&
        grid[arr[i][1]] == grid[arr[i][2]])
      return 2;
  for (i = 0; i < 12; ++i)
    if (grid[i] == ' ')
      return 0;
  return 1;
}


x86 assembly (clang, -O0):
<isFinished>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %rdi,-0x10(%rbp)
lea    -0x70(%rbp),%rdi
lea    0xed6(%rip),%rsi
mov    $0x60,%edx
call   1030 <memcpy@plt>
movl   $0x0,-0x74(%rbp)
cmpl   $0x8,-0x74(%rbp)
jge    11f7 <isFinished+0xe7>
mov    -0x10(%rbp),%rax
movslq -0x74(%rbp),%rdx
lea    -0x70(%rbp),%rcx
imul   $0xc,%rdx,%rdx
add    %rdx,%rcx
movslq (%rcx),%rcx
cmpl   $0x20,(%rax,%rcx,4)
je     11e4 <isFinished+0xd4>
mov    -0x10(%rbp),%rax
movslq -0x74(%rbp),%rdx
lea    -0x70(%rbp),%rcx
imul   $0xc,%rdx,%rdx
add    %rdx,%rcx
movslq (%rcx),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x10(%rbp),%rcx
movslq -0x74(%rbp),%rsi
lea    -0x70(%rbp),%rdx
imul   $0xc,%rsi,%rsi
add    %rsi,%rdx
movslq 0x4(%rdx),%rdx
cmp    (%rcx,%rdx,4),%eax
jne    11e4 <isFinished+0xd4>
mov    -0x10(%rbp),%rax
movslq -0x74(%rbp),%rdx
lea    -0x70(%rbp),%rcx
imul   $0xc,%rdx,%rdx
add    %rdx,%rcx
movslq 0x4(%rcx),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x10(%rbp),%rcx
movslq -0x74(%rbp),%rsi
lea    -0x70(%rbp),%rdx
imul   $0xc,%rsi,%rsi
add    %rsi,%rdx
movslq 0x8(%rdx),%rdx
cmp    (%rcx,%rdx,4),%eax
jne    11e4 <isFinished+0xd4>
movl   $0x2,-0x4(%rbp)
jmp    1240 <isFinished+0x130>
jmp    11e9 <isFinished+0xd9>
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    113b <isFinished+0x2b>
movl   $0x0,-0x74(%rbp)
cmpl   $0xc,-0x74(%rbp)
jge    1239 <isFinished+0x129>
mov    -0x10(%rbp),%rax
movslq -0x74(%rbp),%rcx
cmpl   $0x20,(%rax,%rcx,4)
jne    1226 <isFinished+0x116>
movl   $0x0,-0x4(%rbp)
jmp    1240 <isFinished+0x130>
jmp    122b <isFinished+0x11b>
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    11fe <isFinished+0xee>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<isFinished>:
mov    (%rdi),%esi
cmp    $0x20,%esi
je     1116 <isFinished+0x16>
cmp    0x4(%rdi),%esi
jne    1116 <isFinished+0x16>
mov    $0x2,%eax
cmp    0x8(%rdi),%esi
je     115b <isFinished+0x5b>
mov    0xc(%rdi),%edx
cmp    $0x20,%edx
je     112d <isFinished+0x2d>
cmp    0x10(%rdi),%edx
jne    112d <isFinished+0x2d>
mov    $0x2,%eax
cmp    0x14(%rdi),%edx
je     115b <isFinished+0x5b>
mov    0x18(%rdi),%r8d
cmp    $0x20,%r8d
je     1148 <isFinished+0x48>
cmp    0x1c(%rdi),%r8d
jne    1148 <isFinished+0x48>
mov    $0x2,%eax
cmp    0x20(%rdi),%r8d
je     115b <isFinished+0x5b>
mov    $0x2,%eax
cmp    $0x20,%esi
je     115c <isFinished+0x5c>
cmp    %edx,%esi
jne    115c <isFinished+0x5c>
cmp    %r8d,%esi
jne    115c <isFinished+0x5c>
ret
mov    0x4(%rdi),%r9d
cmp    $0x20,%r9d
je     1172 <isFinished+0x72>
cmp    0x10(%rdi),%r9d
jne    1172 <isFinished+0x72>
cmp    0x1c(%rdi),%r9d
je     115b <isFinished+0x5b>
mov    0x8(%rdi),%ecx
cmp    $0x20,%ecx
je     1184 <isFinished+0x84>
cmp    0x14(%rdi),%ecx
jne    1184 <isFinished+0x84>
cmp    0x20(%rdi),%ecx
je     115b <isFinished+0x5b>
cmp    $0x20,%esi
je     1193 <isFinished+0x93>
cmp    0x10(%rdi),%esi
jne    1193 <isFinished+0x93>
cmp    0x20(%rdi),%esi
je     115b <isFinished+0x5b>
cmp    $0x20,%ecx
jne    11ac <isFinished+0xac>
xor    %eax,%eax
cmp    $0x20,%esi
je     115b <isFinished+0x5b>
cmp    $0x20,%r9d
je     115b <isFinished+0x5b>
cmp    $0x20,%ecx
jne    11e6 <isFinished+0xe6>
jmp    115b <isFinished+0x5b>
sete   %r10b
cmp    $0x20,%r9d
sete   %r9b
cmp    $0x20,%esi
sete   %al
mov    0x10(%rdi),%esi
xor    %ecx,%esi
xor    %r8d,%ecx
or     %esi,%ecx
sete   %cl
or     %r9b,%al
or     %cl,%al
or     %al,%r10b
and    %cl,%al
and    %r10b,%al
movzbl %al,%eax
add    %eax,%eax
test   %r10b,%r10b
jne    115b <isFinished+0x5b>
cmp    $0x20,%edx
je     115b <isFinished+0x5b>
xor    %eax,%eax
cmpl   $0x20,0x10(%rdi)
je     115b <isFinished+0x5b>
cmpl   $0x20,0x14(%rdi)
je     115b <isFinished+0x5b>
cmp    $0x20,%r8d
je     115b <isFinished+0x5b>
cmpl   $0x20,0x1c(%rdi)
je     115b <isFinished+0x5b>
cmpl   $0x20,0x20(%rdi)
je     115b <isFinished+0x5b>
cmpl   $0x20,0x24(%rdi)
je     115b <isFinished+0x5b>
cmpl   $0x20,0x28(%rdi)
je     115b <isFinished+0x5b>
xor    %eax,%eax
cmpl   $0x20,0x2c(%rdi)
setne  %al
ret

LLVM IR (-O0):
@__const.isFinished.arr = [8 x [3 x i32]] [[3 x i32] [i32 0, i32 1, i32 2], [3 x i32] [i32 3, i32 4, i32 5], [3 x i32] [i32 6, i32 7, i32 8], [3 x i32] [i32 0, i32 3, i32 6], [3 x i32] [i32 1, i32 4, i32 7], [3 x i32] [i32 2, i32 5, i32 8], [3 x i32] [i32 0, i32 4, i32 8], [3 x i32] [i32 2, i32 4, i32 6]]
define i32 @isFinished(i32* %0) {
%2 = alloca i32
%3 = alloca i32*
%4 = alloca [8 x [3 x i32]]
%5 = alloca i32
store i32* %0, i32** %3
%6 = bitcast [8 x [3 x i32]]* %4 to i8*
store i32 0, i32* %5
br label %7
7: ; preds = %63, %1
%8 = load i32, i32* %5
%9 = icmp slt i32 %8, 8
br i1 %9, label %10, label %66
10: ; preds = %7
%11 = load i32*, i32** %3
%12 = load i32, i32* %5
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds [8 x [3 x i32]], [8 x [3 x i32]]* %4, i64 0, i64 %13
%15 = getelementptr inbounds [3 x i32], [3 x i32]* %14, i64 0, i64 0
%16 = load i32, i32* %15
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds i32, i32* %11, i64 %17
%19 = load i32, i32* %18
%20 = icmp ne i32 %19, 32
br i1 %20, label %21, label %62
21: ; preds = %10
%22 = load i32*, i32** %3
%23 = load i32, i32* %5
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds [8 x [3 x i32]], [8 x [3 x i32]]* %4, i64 0, i64 %24
%26 = getelementptr inbounds [3 x i32], [3 x i32]* %25, i64 0, i64 0
%27 = load i32, i32* %26
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds i32, i32* %22, i64 %28
%30 = load i32, i32* %29
%31 = load i32*, i32** %3
%32 = load i32, i32* %5
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds [8 x [3 x i32]], [8 x [3 x i32]]* %4, i64 0, i64 %33
%35 = getelementptr inbounds [3 x i32], [3 x i32]* %34, i64 0, i64 1
%36 = load i32, i32* %35
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds i32, i32* %31, i64 %37
%39 = load i32, i32* %38
%40 = icmp eq i32 %30, %39
br i1 %40, label %41, label %62
41: ; preds = %21
%42 = load i32*, i32** %3
%43 = load i32, i32* %5
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds [8 x [3 x i32]], [8 x [3 x i32]]* %4, i64 0, i64 %44
%46 = getelementptr inbounds [3 x i32], [3 x i32]* %45, i64 0, i64 1
%47 = load i32, i32* %46
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i32, i32* %42, i64 %48
%50 = load i32, i32* %49
%51 = load i32*, i32** %3
%52 = load i32, i32* %5
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds [8 x [3 x i32]], [8 x [3 x i32]]* %4, i64 0, i64 %53
%55 = getelementptr inbounds [3 x i32], [3 x i32]* %54, i64 0, i64 2
%56 = load i32, i32* %55
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds i32, i32* %51, i64 %57
%59 = load i32, i32* %58
%60 = icmp eq i32 %50, %59
br i1 %60, label %61, label %62
61: ; preds = %41
store i32 2, i32* %2
br label %83
62: ; preds = %41, %21, %10
br label %63
63: ; preds = %62
%64 = load i32, i32* %5
%65 = add nsw i32 %64, 1
store i32 %65, i32* %5
br label %7
66: ; preds = %7
store i32 0, i32* %5
br label %67
67: ; preds = %79, %66
%68 = load i32, i32* %5
%69 = icmp slt i32 %68, 12
br i1 %69, label %70, label %82
70: ; preds = %67
%71 = load i32*, i32** %3
%72 = load i32, i32* %5
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds i32, i32* %71, i64 %73
%75 = load i32, i32* %74
%76 = icmp eq i32 %75, 32
br i1 %76, label %77, label %78
77: ; preds = %70
store i32 0, i32* %2
br label %83
78: ; preds = %70
br label %79
79: ; preds = %78
%80 = load i32, i32* %5
%81 = add nsw i32 %80, 1
store i32 %81, i32* %5
br label %67
82: ; preds = %67
store i32 1, i32* %2
br label %83
83: ; preds = %82, %77, %61
%84 = load i32, i32* %2
ret i32 %84
}

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