int check_win(int **board, int turn) {
  int i, j, k, free = 0, flag_turn = 0;
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++) {
      if (board[i][j] == turn)
        flag_turn += 1;
      if (flag_turn == 3)
        return 1;
    }
    flag_turn = 0;
  }
  for (j = 0; j < 3; j++) {
    for (i = 0; i < 3; i++) {
      if (board[i][j] == turn)
        flag_turn += 1;
      if (flag_turn == 3)
        return 1;
    }
    flag_turn = 0;
  }
  for (i = 0, j = 0; (i < 3 && j < 3); i++, j++) {
    if (board[i][j] == turn) {
      flag_turn += 1;
    }
    if (flag_turn == 3) {
      return 1;
    }
  }
  flag_turn = 0;
  for (i = 2, j = 0; (i >= 0 && j < 3); i = i - 1, j = j + 1) {
    if (board[i][j] == turn) {
      flag_turn += 1;
    }
    if (flag_turn == 3) {
      return 1;
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<check_win>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x3,-0x18(%rbp)
jge    119e <check_win+0x9e>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x3,-0x1c(%rbp)
jge    1189 <check_win+0x89>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x14(%rbp),%eax
jne    1160 <check_win+0x60>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x3,-0x28(%rbp)
jne    1176 <check_win+0x76>
movl   $0x1,-0x4(%rbp)
jmp    134d <check_win+0x24d>
jmp    117b <check_win+0x7b>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1131 <check_win+0x31>
movl   $0x0,-0x28(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1120 <check_win+0x20>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x3,-0x1c(%rbp)
jge    1223 <check_win+0x123>
movl   $0x0,-0x18(%rbp)
cmpl   $0x3,-0x18(%rbp)
jge    120e <check_win+0x10e>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x14(%rbp),%eax
jne    11e5 <check_win+0xe5>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x3,-0x28(%rbp)
jne    11fb <check_win+0xfb>
movl   $0x1,-0x4(%rbp)
jmp    134d <check_win+0x24d>
jmp    1200 <check_win+0x100>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    11b6 <check_win+0xb6>
movl   $0x0,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11a5 <check_win+0xa5>
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
xor    %eax,%eax
cmpl   $0x3,-0x18(%rbp)
mov    %al,-0x29(%rbp)
jge    124a <check_win+0x14a>
cmpl   $0x3,-0x1c(%rbp)
setl   %al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
test   $0x1,%al
jne    125a <check_win+0x15a>
jmp    12b1 <check_win+0x1b1>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x14(%rbp),%eax
jne    127f <check_win+0x17f>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x3,-0x28(%rbp)
jne    1295 <check_win+0x195>
movl   $0x1,-0x4(%rbp)
jmp    134d <check_win+0x24d>
jmp    129a <check_win+0x19a>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1231 <check_win+0x131>
movl   $0x0,-0x28(%rbp)
movl   $0x2,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x18(%rbp)
mov    %al,-0x2a(%rbp)
jl     12df <check_win+0x1df>
cmpl   $0x3,-0x1c(%rbp)
setl   %al
mov    %al,-0x2a(%rbp)
mov    -0x2a(%rbp),%al
test   $0x1,%al
jne    12ef <check_win+0x1ef>
jmp    1346 <check_win+0x246>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x14(%rbp),%eax
jne    1314 <check_win+0x214>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x3,-0x28(%rbp)
jne    132a <check_win+0x22a>
movl   $0x1,-0x4(%rbp)
jmp    134d <check_win+0x24d>
jmp    132f <check_win+0x22f>
mov    -0x18(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    12c6 <check_win+0x1c6>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<check_win>:
push   %rbp
push   %r14
push   %rbx
mov    (%rdi),%rax
xor    %r8d,%r8d
cmp    %esi,(%rax)
sete   %r8b
xor    %ecx,%ecx
cmp    %esi,0x4(%rax)
sete   %cl
lea    (%r8,%rcx,1),%edx
xor    %r11d,%r11d
cmp    %esi,0x8(%rax)
sete   %r11b
add    %r11d,%edx
mov    $0x1,%eax
cmp    $0x3,%edx
je     11c8 <check_win+0xc8>
mov    0x8(%rdi),%rbx
xor    %edx,%edx
cmp    %esi,(%rbx)
sete   %dl
xor    %r9d,%r9d
cmp    %esi,0x4(%rbx)
sete   %r9b
xor    %r10d,%r10d
cmp    %esi,0x8(%rbx)
lea    (%rdx,%r9,1),%ebx
sete   %r10b
add    %r10d,%ebx
cmp    $0x3,%ebx
je     11c8 <check_win+0xc8>
mov    0x10(%rdi),%rbx
xor    %r14d,%r14d
cmp    %esi,(%rbx)
sete   %r14b
xor    %edi,%edi
cmp    %esi,0x4(%rbx)
sete   %dil
xor    %ebp,%ebp
cmp    %esi,0x8(%rbx)
lea    (%r14,%rdi,1),%esi
sete   %bpl
add    %ebp,%esi
cmp    $0x3,%esi
je     11c8 <check_win+0xc8>
add    %r8d,%edx
add    %r14d,%edx
cmp    $0x3,%edx
je     11c8 <check_win+0xc8>
add    %r9d,%ecx
add    %edi,%ecx
cmp    $0x3,%ecx
je     11c8 <check_win+0xc8>
add    %r11d,%r10d
add    %ebp,%r10d
cmp    $0x3,%r10d
je     11c8 <check_win+0xc8>
add    %r9d,%r8d
add    %ebp,%r8d
cmp    $0x3,%r8d
je     11c8 <check_win+0xc8>
add    %r9d,%r14d
add    %r11d,%r14d
xor    %eax,%eax
cmp    $0x3,%r14d
sete   %al
pop    %rbx
pop    %r14
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @check_win(i32** nocapture %0, i32 %1) {
%3 = load i32*, i32** %0
%4 = load i32, i32* %3
%5 = icmp eq i32 %4, %1
%6 = zext i1 %5 to i32
%7 = getelementptr inbounds i32, i32* %3, i64 1
%8 = load i32, i32* %7
%9 = icmp eq i32 %8, %1
%10 = zext i1 %9 to i32
%11 = add nuw nsw i32 %6, %10
%12 = getelementptr inbounds i32, i32* %3, i64 2
%13 = load i32, i32* %12
%14 = icmp eq i32 %13, %1
%15 = zext i1 %14 to i32
%16 = add nuw nsw i32 %11, %15
%17 = icmp eq i32 %16, 3
br i1 %17, label %73, label %18
18: ; preds = %2
%19 = getelementptr inbounds i32*, i32** %0, i64 1
%20 = load i32*, i32** %19
%21 = load i32, i32* %20
%22 = icmp eq i32 %21, %1
%23 = zext i1 %22 to i32
%24 = getelementptr inbounds i32, i32* %20, i64 1
%25 = load i32, i32* %24
%26 = icmp eq i32 %25, %1
%27 = zext i1 %26 to i32
%28 = add nuw nsw i32 %23, %27
%29 = getelementptr inbounds i32, i32* %20, i64 2
%30 = load i32, i32* %29
%31 = icmp eq i32 %30, %1
%32 = zext i1 %31 to i32
%33 = add nuw nsw i32 %28, %32
%34 = icmp eq i32 %33, 3
br i1 %34, label %73, label %35
35: ; preds = %18
%36 = getelementptr inbounds i32*, i32** %0, i64 2
%37 = load i32*, i32** %36
%38 = load i32, i32* %37
%39 = icmp eq i32 %38, %1
%40 = zext i1 %39 to i32
%41 = getelementptr inbounds i32, i32* %37, i64 1
%42 = load i32, i32* %41
%43 = icmp eq i32 %42, %1
%44 = zext i1 %43 to i32
%45 = add nuw nsw i32 %40, %44
%46 = getelementptr inbounds i32, i32* %37, i64 2
%47 = load i32, i32* %46
%48 = icmp eq i32 %47, %1
%49 = zext i1 %48 to i32
%50 = add nuw nsw i32 %45, %49
%51 = icmp eq i32 %50, 3
br i1 %51, label %73, label %52
52: ; preds = %35
%53 = add nuw nsw i32 %6, %23
%54 = add nuw nsw i32 %53, %40
%55 = icmp eq i32 %54, 3
br i1 %55, label %73, label %56
56: ; preds = %52
%57 = add nuw nsw i32 %10, %27
%58 = add nuw nsw i32 %57, %44
%59 = icmp eq i32 %58, 3
br i1 %59, label %73, label %60
60: ; preds = %56
%61 = add nuw nsw i32 %15, %32
%62 = add nuw nsw i32 %61, %49
%63 = icmp eq i32 %62, 3
br i1 %63, label %73, label %64
64: ; preds = %60
%65 = add nuw nsw i32 %6, %27
%66 = add nuw nsw i32 %65, %49
%67 = icmp eq i32 %66, 3
br i1 %67, label %73, label %68
68: ; preds = %64
%69 = add nuw nsw i32 %40, %27
%70 = add nuw nsw i32 %69, %15
%71 = icmp eq i32 %70, 3
%72 = zext i1 %71 to i32
br label %73
73: ; preds = %68, %2, %18, %35, %52, %56, %60, %64
%74 = phi i32 [ 1, %64 ], [ 1, %60 ], [ 1, %56 ], [ 1, %52 ], [ 1, %35 ], [ 1, %18 ], [ 1, %2 ], [ %72, %68 ]
ret i32 %74
}