char game_winner(char *br, char player1, char player2) {
  char p[] = {player1, player2};
  for (int i = 0; i < 2; ++i) {
    if (((*br == p[i]) && (*(br + 1) == p[i]) && (*(br + 2) == p[i])) ||
        ((*(br + 3) == p[i]) && (*(br + 4) == p[i]) && (*(br + 5) == p[i])) ||
        ((*(br + 6) == p[i]) && (*(br + 7) == p[i]) && (*(br + 8) == p[i]))) {
      return p[i];
    } else if (((*br == p[i]) && (*(br + 3) == p[i]) && (*(br + 6) == p[i])) ||
               ((*(br + 1) == p[i]) && (*(br + 4) == p[i]) &&
                (*(br + 7) == p[i])) ||
               ((*(br + 2) == p[i]) && (*(br + 5) == p[i]) &&
                (*(br + 8) == p[i]))) {
      return p[i];
    } else if ((*br == p[i]) && (*(br + 4) == p[i]) && (*(br + 8) == p[i])) {
      return p[i];
    } else if ((*(br + 2) == p[i]) && (*(br + 4) == p[i]) &&
               (*(br + 6) == p[i])) {
      return p[i];
    }
  }
  return ' ';
}


x86 assembly (clang, -O0):
<game_winner>:
push   %rbp
mov    %rsp,%rbp
mov    %dl,%al
mov    %sil,%cl
mov    %rdi,-0x10(%rbp)
mov    %cl,-0x11(%rbp)
mov    %al,-0x12(%rbp)
mov    -0x11(%rbp),%al
mov    %al,-0x14(%rbp)
mov    -0x12(%rbp),%al
mov    %al,-0x13(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x2,-0x18(%rbp)
jge    13e7 <game_winner+0x2e7>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    117a <game_winner+0x7a>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    117a <game_winner+0x7a>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
je     1210 <game_winner+0x110>
mov    -0x10(%rbp),%rax
movsbl 0x3(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    11c5 <game_winner+0xc5>
mov    -0x10(%rbp),%rax
movsbl 0x4(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    11c5 <game_winner+0xc5>
mov    -0x10(%rbp),%rax
movsbl 0x5(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
je     1210 <game_winner+0x110>
mov    -0x10(%rbp),%rax
movsbl 0x6(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    1220 <game_winner+0x120>
mov    -0x10(%rbp),%rax
movsbl 0x7(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    1220 <game_winner+0x120>
mov    -0x10(%rbp),%rax
movsbl 0x8(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    1220 <game_winner+0x120>
movslq -0x18(%rbp),%rax
mov    -0x14(%rbp,%rax,1),%al
mov    %al,-0x1(%rbp)
jmp    13eb <game_winner+0x2eb>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    126a <game_winner+0x16a>
mov    -0x10(%rbp),%rax
movsbl 0x3(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    126a <game_winner+0x16a>
mov    -0x10(%rbp),%rax
movsbl 0x6(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
je     1300 <game_winner+0x200>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    12b5 <game_winner+0x1b5>
mov    -0x10(%rbp),%rax
movsbl 0x4(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    12b5 <game_winner+0x1b5>
mov    -0x10(%rbp),%rax
movsbl 0x7(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
je     1300 <game_winner+0x200>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    1310 <game_winner+0x210>
mov    -0x10(%rbp),%rax
movsbl 0x5(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    1310 <game_winner+0x210>
mov    -0x10(%rbp),%rax
movsbl 0x8(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    1310 <game_winner+0x210>
movslq -0x18(%rbp),%rax
mov    -0x14(%rbp,%rax,1),%al
mov    %al,-0x1(%rbp)
jmp    13eb <game_winner+0x2eb>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    136a <game_winner+0x26a>
mov    -0x10(%rbp),%rax
movsbl 0x4(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    136a <game_winner+0x26a>
mov    -0x10(%rbp),%rax
movsbl 0x8(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    136a <game_winner+0x26a>
movslq -0x18(%rbp),%rax
mov    -0x14(%rbp,%rax,1),%al
mov    %al,-0x1(%rbp)
jmp    13eb <game_winner+0x2eb>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    13c5 <game_winner+0x2c5>
mov    -0x10(%rbp),%rax
movsbl 0x4(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    13c5 <game_winner+0x2c5>
mov    -0x10(%rbp),%rax
movsbl 0x6(%rax),%eax
movslq -0x18(%rbp),%rcx
movsbl -0x14(%rbp,%rcx,1),%ecx
cmp    %ecx,%eax
jne    13c5 <game_winner+0x2c5>
movslq -0x18(%rbp),%rax
mov    -0x14(%rbp,%rax,1),%al
mov    %al,-0x1(%rbp)
jmp    13eb <game_winner+0x2eb>
jmp    13ca <game_winner+0x2ca>
jmp    13cf <game_winner+0x2cf>
jmp    13d4 <game_winner+0x2d4>
jmp    13d9 <game_winner+0x2d9>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1126 <game_winner+0x26>
movb   $0x20,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<game_winner>:
mov    %esi,%eax
mov    (%rdi),%cl
cmp    %al,%cl
jne    1112 <game_winner+0x12>
cmp    %al,0x1(%rdi)
jne    1112 <game_winner+0x12>
cmp    %al,0x2(%rdi)
je     1189 <game_winner+0x89>
mov    0x3(%rdi),%r8b
cmp    %al,%r8b
jne    1125 <game_winner+0x25>
cmp    %al,0x4(%rdi)
jne    1125 <game_winner+0x25>
cmp    %al,0x5(%rdi)
je     1189 <game_winner+0x89>
mov    0x6(%rdi),%sil
cmp    %al,%sil
jne    1146 <game_winner+0x46>
cmp    %al,0x7(%rdi)
jne    1138 <game_winner+0x38>
cmp    %al,0x8(%rdi)
je     1189 <game_winner+0x89>
cmp    %al,%cl
jne    1146 <game_winner+0x46>
cmp    %al,%r8b
jne    1146 <game_winner+0x46>
cmp    %al,%sil
je     1189 <game_winner+0x89>
mov    0x1(%rdi),%r10b
cmp    %al,%r10b
jne    1159 <game_winner+0x59>
cmp    %al,0x4(%rdi)
jne    1159 <game_winner+0x59>
cmp    %al,0x7(%rdi)
je     1189 <game_winner+0x89>
mov    0x2(%rdi),%r9b
cmp    %al,%r9b
jne    116c <game_winner+0x6c>
cmp    %al,0x5(%rdi)
jne    116c <game_winner+0x6c>
cmp    %al,0x8(%rdi)
je     1189 <game_winner+0x89>
cmp    %al,%cl
jne    117a <game_winner+0x7a>
cmp    %al,0x4(%rdi)
jne    117a <game_winner+0x7a>
cmp    %al,0x8(%rdi)
je     1189 <game_winner+0x89>
cmp    %al,%r9b
jne    118a <game_winner+0x8a>
cmp    %al,0x4(%rdi)
jne    118a <game_winner+0x8a>
cmp    %al,%sil
jne    118a <game_winner+0x8a>
ret
cmp    %dl,%cl
jne    119b <game_winner+0x9b>
cmp    %dl,%r10b
jne    119b <game_winner+0x9b>
cmp    %dl,%r9b
jne    119b <game_winner+0x9b>
mov    %edx,%eax
ret
cmp    %dl,%r8b
jne    11aa <game_winner+0xaa>
cmp    %dl,0x4(%rdi)
jne    11aa <game_winner+0xaa>
cmp    %dl,0x5(%rdi)
je     1198 <game_winner+0x98>
cmp    %dl,%sil
jne    11c7 <game_winner+0xc7>
cmp    %dl,0x7(%rdi)
jne    11b9 <game_winner+0xb9>
cmp    %dl,0x8(%rdi)
je     1198 <game_winner+0x98>
cmp    %dl,%cl
jne    11c7 <game_winner+0xc7>
cmp    %dl,%r8b
jne    11c7 <game_winner+0xc7>
cmp    %dl,%sil
je     1198 <game_winner+0x98>
cmp    %dl,%r10b
jne    11d6 <game_winner+0xd6>
cmp    %dl,0x4(%rdi)
jne    11d6 <game_winner+0xd6>
cmp    %dl,0x7(%rdi)
je     1198 <game_winner+0x98>
cmp    %dl,%r9b
jne    11e5 <game_winner+0xe5>
cmp    %dl,0x5(%rdi)
jne    11e5 <game_winner+0xe5>
cmp    %dl,0x8(%rdi)
je     1198 <game_winner+0x98>
cmp    %dl,%cl
jne    11f3 <game_winner+0xf3>
cmp    %dl,0x4(%rdi)
jne    11f3 <game_winner+0xf3>
cmp    %dl,0x8(%rdi)
je     1198 <game_winner+0x98>
cmp    %dl,%r9b
jne    1204 <game_winner+0x104>
cmp    %dl,0x4(%rdi)
jne    1204 <game_winner+0x104>
mov    %edx,%eax
cmp    %dl,%sil
je     1189 <game_winner+0x89>
mov    $0x20,%al
ret

LLVM IR (-O0):
define signext i8 @game_winner(i8* %0, i8 signext %1, i8 signext %2) {
%4 = alloca i8
%5 = alloca i8*
%6 = alloca i8
%7 = alloca i8
%8 = alloca [2 x i8]
%9 = alloca i32
store i8* %0, i8** %5
store i8 %1, i8* %6
store i8 %2, i8* %7
%10 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 0
%11 = load i8, i8* %6
store i8 %11, i8* %10
%12 = getelementptr inbounds i8, i8* %10, i64 1
%13 = load i8, i8* %7
store i8 %13, i8* %12
store i32 0, i32* %9
br label %14
14: ; preds = %302, %3
%15 = load i32, i32* %9
%16 = icmp slt i32 %15, 2
br i1 %16, label %17, label %305
17: ; preds = %14
%18 = load i8*, i8** %5
%19 = load i8, i8* %18
%20 = sext i8 %19 to i32
%21 = load i32, i32* %9
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %22
%24 = load i8, i8* %23
%25 = sext i8 %24 to i32
%26 = icmp eq i32 %20, %25
br i1 %26, label %27, label %49
27: ; preds = %17
%28 = load i8*, i8** %5
%29 = getelementptr inbounds i8, i8* %28, i64 1
%30 = load i8, i8* %29
%31 = sext i8 %30 to i32
%32 = load i32, i32* %9
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %33
%35 = load i8, i8* %34
%36 = sext i8 %35 to i32
%37 = icmp eq i32 %31, %36
br i1 %37, label %38, label %49
38: ; preds = %27
%39 = load i8*, i8** %5
%40 = getelementptr inbounds i8, i8* %39, i64 2
%41 = load i8, i8* %40
%42 = sext i8 %41 to i32
%43 = load i32, i32* %9
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %44
%46 = load i8, i8* %45
%47 = sext i8 %46 to i32
%48 = icmp eq i32 %42, %47
br i1 %48, label %115, label %49
49: ; preds = %38, %27, %17
%50 = load i8*, i8** %5
%51 = getelementptr inbounds i8, i8* %50, i64 3
%52 = load i8, i8* %51
%53 = sext i8 %52 to i32
%54 = load i32, i32* %9
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %55
%57 = load i8, i8* %56
%58 = sext i8 %57 to i32
%59 = icmp eq i32 %53, %58
br i1 %59, label %60, label %82
60: ; preds = %49
%61 = load i8*, i8** %5
%62 = getelementptr inbounds i8, i8* %61, i64 4
%63 = load i8, i8* %62
%64 = sext i8 %63 to i32
%65 = load i32, i32* %9
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %66
%68 = load i8, i8* %67
%69 = sext i8 %68 to i32
%70 = icmp eq i32 %64, %69
br i1 %70, label %71, label %82
71: ; preds = %60
%72 = load i8*, i8** %5
%73 = getelementptr inbounds i8, i8* %72, i64 5
%74 = load i8, i8* %73
%75 = sext i8 %74 to i32
%76 = load i32, i32* %9
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %77
%79 = load i8, i8* %78
%80 = sext i8 %79 to i32
%81 = icmp eq i32 %75, %80
br i1 %81, label %115, label %82
82: ; preds = %71, %60, %49
%83 = load i8*, i8** %5
%84 = getelementptr inbounds i8, i8* %83, i64 6
%85 = load i8, i8* %84
%86 = sext i8 %85 to i32
%87 = load i32, i32* %9
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %88
%90 = load i8, i8* %89
%91 = sext i8 %90 to i32
%92 = icmp eq i32 %86, %91
br i1 %92, label %93, label %120
93: ; preds = %82
%94 = load i8*, i8** %5
%95 = getelementptr inbounds i8, i8* %94, i64 7
%96 = load i8, i8* %95
%97 = sext i8 %96 to i32
%98 = load i32, i32* %9
%99 = sext i32 %98 to i64
%100 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %99
%101 = load i8, i8* %100
%102 = sext i8 %101 to i32
%103 = icmp eq i32 %97, %102
br i1 %103, label %104, label %120
104: ; preds = %93
%105 = load i8*, i8** %5
%106 = getelementptr inbounds i8, i8* %105, i64 8
%107 = load i8, i8* %106
%108 = sext i8 %107 to i32
%109 = load i32, i32* %9
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %110
%112 = load i8, i8* %111
%113 = sext i8 %112 to i32
%114 = icmp eq i32 %108, %113
br i1 %114, label %115, label %120
115: ; preds = %104, %71, %38
%116 = load i32, i32* %9
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %117
%119 = load i8, i8* %118
store i8 %119, i8* %4
br label %306
120: ; preds = %104, %93, %82
%121 = load i8*, i8** %5
%122 = load i8, i8* %121
%123 = sext i8 %122 to i32
%124 = load i32, i32* %9
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %125
%127 = load i8, i8* %126
%128 = sext i8 %127 to i32
%129 = icmp eq i32 %123, %128
br i1 %129, label %130, label %152
130: ; preds = %120
%131 = load i8*, i8** %5
%132 = getelementptr inbounds i8, i8* %131, i64 3
%133 = load i8, i8* %132
%134 = sext i8 %133 to i32
%135 = load i32, i32* %9
%136 = sext i32 %135 to i64
%137 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %136
%138 = load i8, i8* %137
%139 = sext i8 %138 to i32
%140 = icmp eq i32 %134, %139
br i1 %140, label %141, label %152
141: ; preds = %130
%142 = load i8*, i8** %5
%143 = getelementptr inbounds i8, i8* %142, i64 6
%144 = load i8, i8* %143
%145 = sext i8 %144 to i32
%146 = load i32, i32* %9
%147 = sext i32 %146 to i64
%148 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %147
%149 = load i8, i8* %148
%150 = sext i8 %149 to i32
%151 = icmp eq i32 %145, %150
br i1 %151, label %218, label %152
152: ; preds = %141, %130, %120
%153 = load i8*, i8** %5
%154 = getelementptr inbounds i8, i8* %153, i64 1
%155 = load i8, i8* %154
%156 = sext i8 %155 to i32
%157 = load i32, i32* %9
%158 = sext i32 %157 to i64
%159 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %158
%160 = load i8, i8* %159
%161 = sext i8 %160 to i32
%162 = icmp eq i32 %156, %161
br i1 %162, label %163, label %185
163: ; preds = %152
%164 = load i8*, i8** %5
%165 = getelementptr inbounds i8, i8* %164, i64 4
%166 = load i8, i8* %165
%167 = sext i8 %166 to i32
%168 = load i32, i32* %9
%169 = sext i32 %168 to i64
%170 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %169
%171 = load i8, i8* %170
%172 = sext i8 %171 to i32
%173 = icmp eq i32 %167, %172
br i1 %173, label %174, label %185
174: ; preds = %163
%175 = load i8*, i8** %5
%176 = getelementptr inbounds i8, i8* %175, i64 7
%177 = load i8, i8* %176
%178 = sext i8 %177 to i32
%179 = load i32, i32* %9
%180 = sext i32 %179 to i64
%181 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %180
%182 = load i8, i8* %181
%183 = sext i8 %182 to i32
%184 = icmp eq i32 %178, %183
br i1 %184, label %218, label %185
185: ; preds = %174, %163, %152
%186 = load i8*, i8** %5
%187 = getelementptr inbounds i8, i8* %186, i64 2
%188 = load i8, i8* %187
%189 = sext i8 %188 to i32
%190 = load i32, i32* %9
%191 = sext i32 %190 to i64
%192 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %191
%193 = load i8, i8* %192
%194 = sext i8 %193 to i32
%195 = icmp eq i32 %189, %194
br i1 %195, label %196, label %223
196: ; preds = %185
%197 = load i8*, i8** %5
%198 = getelementptr inbounds i8, i8* %197, i64 5
%199 = load i8, i8* %198
%200 = sext i8 %199 to i32
%201 = load i32, i32* %9
%202 = sext i32 %201 to i64
%203 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %202
%204 = load i8, i8* %203
%205 = sext i8 %204 to i32
%206 = icmp eq i32 %200, %205
br i1 %206, label %207, label %223
207: ; preds = %196
%208 = load i8*, i8** %5
%209 = getelementptr inbounds i8, i8* %208, i64 8
%210 = load i8, i8* %209
%211 = sext i8 %210 to i32
%212 = load i32, i32* %9
%213 = sext i32 %212 to i64
%214 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %213
%215 = load i8, i8* %214
%216 = sext i8 %215 to i32
%217 = icmp eq i32 %211, %216
br i1 %217, label %218, label %223
218: ; preds = %207, %174, %141
%219 = load i32, i32* %9
%220 = sext i32 %219 to i64
%221 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %220
%222 = load i8, i8* %221
store i8 %222, i8* %4
br label %306
223: ; preds = %207, %196, %185
%224 = load i8*, i8** %5
%225 = load i8, i8* %224
%226 = sext i8 %225 to i32
%227 = load i32, i32* %9
%228 = sext i32 %227 to i64
%229 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %228
%230 = load i8, i8* %229
%231 = sext i8 %230 to i32
%232 = icmp eq i32 %226, %231
br i1 %232, label %233, label %260
233: ; preds = %223
%234 = load i8*, i8** %5
%235 = getelementptr inbounds i8, i8* %234, i64 4
%236 = load i8, i8* %235
%237 = sext i8 %236 to i32
%238 = load i32, i32* %9
%239 = sext i32 %238 to i64
%240 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %239
%241 = load i8, i8* %240
%242 = sext i8 %241 to i32
%243 = icmp eq i32 %237, %242
br i1 %243, label %244, label %260
244: ; preds = %233
%245 = load i8*, i8** %5
%246 = getelementptr inbounds i8, i8* %245, i64 8
%247 = load i8, i8* %246
%248 = sext i8 %247 to i32
%249 = load i32, i32* %9
%250 = sext i32 %249 to i64
%251 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %250
%252 = load i8, i8* %251
%253 = sext i8 %252 to i32
%254 = icmp eq i32 %248, %253
br i1 %254, label %255, label %260
255: ; preds = %244
%256 = load i32, i32* %9
%257 = sext i32 %256 to i64
%258 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %257
%259 = load i8, i8* %258
store i8 %259, i8* %4
br label %306
260: ; preds = %244, %233, %223
%261 = load i8*, i8** %5
%262 = getelementptr inbounds i8, i8* %261, i64 2
%263 = load i8, i8* %262
%264 = sext i8 %263 to i32
%265 = load i32, i32* %9
%266 = sext i32 %265 to i64
%267 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %266
%268 = load i8, i8* %267
%269 = sext i8 %268 to i32
%270 = icmp eq i32 %264, %269
br i1 %270, label %271, label %298
271: ; preds = %260
%272 = load i8*, i8** %5
%273 = getelementptr inbounds i8, i8* %272, i64 4
%274 = load i8, i8* %273
%275 = sext i8 %274 to i32
%276 = load i32, i32* %9
%277 = sext i32 %276 to i64
%278 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %277
%279 = load i8, i8* %278
%280 = sext i8 %279 to i32
%281 = icmp eq i32 %275, %280
br i1 %281, label %282, label %298
282: ; preds = %271
%283 = load i8*, i8** %5
%284 = getelementptr inbounds i8, i8* %283, i64 6
%285 = load i8, i8* %284
%286 = sext i8 %285 to i32
%287 = load i32, i32* %9
%288 = sext i32 %287 to i64
%289 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %288
%290 = load i8, i8* %289
%291 = sext i8 %290 to i32
%292 = icmp eq i32 %286, %291
br i1 %292, label %293, label %298
293: ; preds = %282
%294 = load i32, i32* %9
%295 = sext i32 %294 to i64
%296 = getelementptr inbounds [2 x i8], [2 x i8]* %8, i64 0, i64 %295
%297 = load i8, i8* %296
store i8 %297, i8* %4
br label %306
298: ; preds = %282, %271, %260
br label %299
299: ; preds = %298
br label %300
300: ; preds = %299
br label %301
301: ; preds = %300
br label %302
302: ; preds = %301
%303 = load i32, i32* %9
%304 = add nsw i32 %303, 1
store i32 %304, i32* %9
br label %14
305: ; preds = %14
store i8 32, i8* %4
br label %306
306: ; preds = %305, %293, %255, %218, %115
%307 = load i8, i8* %4
ret i8 %307
}

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