#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int solidLineMade(char, char, char, char **);
int checkWinner(char board[3][3]) {
  char a = '_';
  char b = '_';
  char c = '_';
  int i = 0;
  int j = 0;
  int retVal;
  for (i = 0; i < 3; i++) {
    a = board[i][0];
    b = board[i][1];
    c = board[i][2];
    retVal = solidLineMade(a, b, c, board);
    if (retVal) {
      return retVal;
    }
  }
  for (j = 0; j < 3; j++) {
    a = board[0][j];
    b = board[1][j];
    c = board[2][j];
    retVal = solidLineMade(a, b, c, board);
    if (retVal) {
      return retVal;
    }
  }
  a = board[0][0];
  b = board[1][1];
  c = board[2][2];
  retVal = solidLineMade(a, b, c, board);
  if (retVal) {
    return retVal;
  }
  a = board[0][2];
  b = board[1][1];
  c = board[2][0];
  retVal = solidLineMade(a, b, c, board);
  if (retVal) {
    return retVal;
  }
  return retVal;
}


x86 assembly (clang, -O0):
<checkWinner>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
movb   $0x5f,-0x11(%rbp)
movb   $0x5f,-0x12(%rbp)
movb   $0x5f,-0x13(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x3,-0x18(%rbp)
jge    11cd <checkWinner+0xbd>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
mov    (%rax),%al
mov    %al,-0x11(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
mov    0x1(%rax),%al
mov    %al,-0x12(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
mov    0x2(%rax),%al
mov    %al,-0x13(%rbp)
mov    -0x11(%rbp),%sil
mov    -0x12(%rbp),%dl
mov    -0x13(%rbp),%al
mov    -0x10(%rbp),%rcx
movsbl %sil,%edi
movsbl %dl,%esi
movsbl %al,%edx
call   1030 <solidLineMade@plt>
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
je     11ba <checkWinner+0xaa>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12fd <checkWinner+0x1ed>
jmp    11bf <checkWinner+0xaf>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    113d <checkWinner+0x2d>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x3,-0x1c(%rbp)
jge    1252 <checkWinner+0x142>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x11(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    0x3(%rax,%rcx,1),%al
mov    %al,-0x12(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    0x6(%rax,%rcx,1),%al
mov    %al,-0x13(%rbp)
mov    -0x11(%rbp),%sil
mov    -0x12(%rbp),%dl
mov    -0x13(%rbp),%al
mov    -0x10(%rbp),%rcx
movsbl %sil,%edi
movsbl %dl,%esi
movsbl %al,%edx
call   1030 <solidLineMade@plt>
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
je     123f <checkWinner+0x12f>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12fd <checkWinner+0x1ed>
jmp    1244 <checkWinner+0x134>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11d4 <checkWinner+0xc4>
mov    -0x10(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x11(%rbp)
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%al
mov    %al,-0x12(%rbp)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%al
mov    %al,-0x13(%rbp)
mov    -0x11(%rbp),%sil
mov    -0x12(%rbp),%dl
mov    -0x13(%rbp),%al
mov    -0x10(%rbp),%rcx
movsbl %sil,%edi
movsbl %dl,%esi
movsbl %al,%edx
call   1030 <solidLineMade@plt>
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
je     12a4 <checkWinner+0x194>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12fd <checkWinner+0x1ed>
mov    -0x10(%rbp),%rax
mov    0x2(%rax),%al
mov    %al,-0x11(%rbp)
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%al
mov    %al,-0x12(%rbp)
mov    -0x10(%rbp),%rax
mov    0x6(%rax),%al
mov    %al,-0x13(%rbp)
mov    -0x11(%rbp),%sil
mov    -0x12(%rbp),%dl
mov    -0x13(%rbp),%al
mov    -0x10(%rbp),%rcx
movsbl %sil,%edi
movsbl %dl,%esi
movsbl %al,%edx
call   1030 <solidLineMade@plt>
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
je     12f7 <checkWinner+0x1e7>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12fd <checkWinner+0x1ed>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<checkWinner>:
push   %rbx
mov    %rdi,%rbx
movsbl (%rdi),%edi
movsbl 0x1(%rbx),%esi
movsbl 0x2(%rbx),%edx
mov    %rbx,%rcx
call   1030 <solidLineMade@plt>
test   %eax,%eax
jne    11bd <checkWinner+0xad>
movsbl 0x3(%rbx),%edi
movsbl 0x4(%rbx),%esi
movsbl 0x5(%rbx),%edx
mov    %rbx,%rcx
call   1030 <solidLineMade@plt>
test   %eax,%eax
jne    11bd <checkWinner+0xad>
movsbl 0x6(%rbx),%edi
movsbl 0x7(%rbx),%esi
movsbl 0x8(%rbx),%edx
mov    %rbx,%rcx
call   1030 <solidLineMade@plt>
test   %eax,%eax
jne    11bd <checkWinner+0xad>
movsbl (%rbx),%edi
movsbl 0x3(%rbx),%esi
movsbl 0x6(%rbx),%edx
mov    %rbx,%rcx
call   1030 <solidLineMade@plt>
test   %eax,%eax
jne    11bd <checkWinner+0xad>
movsbl 0x1(%rbx),%edi
movsbl 0x4(%rbx),%esi
movsbl 0x7(%rbx),%edx
mov    %rbx,%rcx
call   1030 <solidLineMade@plt>
test   %eax,%eax
jne    11bd <checkWinner+0xad>
movsbl 0x2(%rbx),%edi
movsbl 0x5(%rbx),%esi
movsbl 0x8(%rbx),%edx
mov    %rbx,%rcx
call   1030 <solidLineMade@plt>
test   %eax,%eax
jne    11bd <checkWinner+0xad>
movsbl (%rbx),%edi
movsbl 0x4(%rbx),%esi
movsbl 0x8(%rbx),%edx
mov    %rbx,%rcx
call   1030 <solidLineMade@plt>
test   %eax,%eax
je     11bf <checkWinner+0xaf>
pop    %rbx
ret
movsbl 0x2(%rbx),%edi
movsbl 0x4(%rbx),%esi
movsbl 0x6(%rbx),%edx
mov    %rbx,%rcx
pop    %rbx
jmp    1030 <solidLineMade@plt>

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

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