int ganhou(int mat[3][3]) {
  if ((mat[0][0] == mat[0][1] && mat[0][1] == mat[0][2]) ||
      (mat[1][0] == mat[1][1] && mat[1][1] == mat[1][2]) ||
      (mat[2][0] == mat[2][1] && mat[2][1] == mat[2][2]) ||
      (mat[0][0] == mat[1][0] && mat[1][0] == mat[2][0]) ||
      (mat[0][1] == mat[1][1] && mat[1][1] == mat[2][1]) ||
      (mat[0][2] == mat[1][2] && mat[1][2] == mat[2][2]) ||
      (mat[0][0] == mat[1][1] && mat[1][1] == mat[2][2]) ||
      (mat[0][2] == mat[1][1] && mat[1][1] == mat[2][0])) {
    return 1;
  } else {
    return 0;
  }
}


x86 assembly (clang, -O0):
<ganhou>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x4(%rcx),%eax
jne    112f <ganhou+0x2f>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x8(%rcx),%eax
je     1245 <ganhou+0x145>
mov    -0x10(%rbp),%rax
mov    0xc(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x10(%rcx),%eax
jne    1157 <ganhou+0x57>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x14(%rcx),%eax
je     1245 <ganhou+0x145>
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x1c(%rcx),%eax
jne    117f <ganhou+0x7f>
mov    -0x10(%rbp),%rax
mov    0x1c(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x20(%rcx),%eax
je     1245 <ganhou+0x145>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0xc(%rcx),%eax
jne    11a6 <ganhou+0xa6>
mov    -0x10(%rbp),%rax
mov    0xc(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x18(%rcx),%eax
je     1245 <ganhou+0x145>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x10(%rcx),%eax
jne    11ce <ganhou+0xce>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x1c(%rcx),%eax
je     1245 <ganhou+0x145>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x14(%rcx),%eax
jne    11f6 <ganhou+0xf6>
mov    -0x10(%rbp),%rax
mov    0x14(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x20(%rcx),%eax
je     1245 <ganhou+0x145>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x10(%rcx),%eax
jne    121d <ganhou+0x11d>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x20(%rcx),%eax
je     1245 <ganhou+0x145>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x10(%rcx),%eax
jne    1251 <ganhou+0x151>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x18(%rcx),%eax
jne    1251 <ganhou+0x151>
movl   $0x1,-0x4(%rbp)
jmp    1258 <ganhou+0x158>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ganhou>:
mov    (%rdi),%ecx
mov    0x4(%rdi),%edx
cmp    %edx,%ecx
jne    1113 <ganhou+0x13>
mov    $0x1,%eax
cmp    0x8(%rdi),%ecx
je     114f <ganhou+0x4f>
mov    0xc(%rdi),%esi
mov    0x10(%rdi),%r8d
cmp    %r8d,%esi
jne    1129 <ganhou+0x29>
mov    $0x1,%eax
cmp    0x14(%rdi),%esi
je     114f <ganhou+0x4f>
mov    0x18(%rdi),%r9d
mov    0x1c(%rdi),%r10d
cmp    %r10d,%r9d
jne    1141 <ganhou+0x41>
mov    $0x1,%eax
cmp    0x20(%rdi),%r9d
je     114f <ganhou+0x4f>
mov    $0x1,%eax
cmp    %esi,%ecx
jne    1150 <ganhou+0x50>
cmp    %r9d,%esi
jne    1150 <ganhou+0x50>
ret
cmp    %r8d,%edx
jne    115a <ganhou+0x5a>
cmp    %r10d,%r8d
je     114f <ganhou+0x4f>
mov    0x8(%rdi),%edx
cmp    0x14(%rdi),%edx
jne    1167 <ganhou+0x67>
cmp    0x20(%rdi),%edx
je     114f <ganhou+0x4f>
cmp    %r8d,%ecx
jne    1171 <ganhou+0x71>
cmp    0x20(%rdi),%ecx
je     114f <ganhou+0x4f>
xor    %r8d,%edx
xor    %r8d,%r9d
xor    %eax,%eax
or     %edx,%r9d
sete   %al
ret

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

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