char terminal(char a[3][3]) {
  unsigned i, j;
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++)
      if (a[i][j] != a[i][0])
        break;
    if (3 == j && a[i][0] != '.') {
      if (a[i][0] == 'X')
        return 1;
      else
        return 2;
    }
    for (j = 0; j < 3; j++)
      if (a[j][i] != a[0][i])
        break;
    if (3 == j && a[i][0] != '.') {
      if (a[0][i] == 'X')
        return 1;
      else
        return 2;
    }
    if (a[0][0] == a[1][1] && a[1][1] == a[2][2] && a[1][1] != '.')
      if (a[0][0] == 'X')
        return 1;
      else
        return 2;
    if (a[2][0] == a[1][1] && a[1][1] == a[0][2] && a[1][1] != '.')
      if (a[2][0] == 'X')
        return 1;
      else
        return 2;
  }
  for (i = 0; i < 3; i++)
    for (j = 0; j < 3; j++)
      if (a[i][j] == '.')
        return 0;
  return 3;
}


x86 assembly (clang, -O0):
<terminal>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x3,-0x14(%rbp)
jae    133c <terminal+0x23c>
movl   $0x0,-0x18(%rbp)
cmpl   $0x3,-0x18(%rbp)
jae    1170 <terminal+0x70>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x14(%rbp),%edx
imul   $0x3,%rdx,%rdx
add    %rdx,%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
je     115d <terminal+0x5d>
jmp    1170 <terminal+0x70>
jmp    1162 <terminal+0x62>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1120 <terminal+0x20>
mov    $0x3,%eax
cmp    -0x18(%rbp),%eax
jne    11c4 <terminal+0xc4>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
je     11c4 <terminal+0xc4>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
movsbl (%rax),%eax
cmp    $0x58,%eax
jne    11bb <terminal+0xbb>
movb   $0x1,-0x1(%rbp)
jmp    13af <terminal+0x2af>
movb   $0x2,-0x1(%rbp)
jmp    13af <terminal+0x2af>
movl   $0x0,-0x18(%rbp)
cmpl   $0x3,-0x18(%rbp)
jae    1215 <terminal+0x115>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
mov    -0x14(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x14(%rbp),%edx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
je     1202 <terminal+0x102>
jmp    1215 <terminal+0x115>
jmp    1207 <terminal+0x107>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    11cb <terminal+0xcb>
mov    $0x3,%eax
cmp    -0x18(%rbp),%eax
jne    1263 <terminal+0x163>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
je     1263 <terminal+0x163>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x58,%eax
jne    125a <terminal+0x15a>
movb   $0x1,-0x1(%rbp)
jmp    13af <terminal+0x2af>
movb   $0x2,-0x1(%rbp)
jmp    13af <terminal+0x2af>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    -0x10(%rbp),%rcx
movsbl 0x4(%rcx),%ecx
cmp    %ecx,%eax
jne    12c5 <terminal+0x1c5>
mov    -0x10(%rbp),%rax
movsbl 0x4(%rax),%eax
mov    -0x10(%rbp),%rcx
movsbl 0x8(%rcx),%ecx
cmp    %ecx,%eax
jne    12c5 <terminal+0x1c5>
mov    -0x10(%rbp),%rax
movsbl 0x4(%rax),%eax
cmp    $0x2e,%eax
je     12c5 <terminal+0x1c5>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x58,%eax
jne    12bc <terminal+0x1bc>
movb   $0x1,-0x1(%rbp)
jmp    13af <terminal+0x2af>
movb   $0x2,-0x1(%rbp)
jmp    13af <terminal+0x2af>
mov    -0x10(%rbp),%rax
movsbl 0x6(%rax),%eax
mov    -0x10(%rbp),%rcx
movsbl 0x4(%rcx),%ecx
cmp    %ecx,%eax
jne    1329 <terminal+0x229>
mov    -0x10(%rbp),%rax
movsbl 0x4(%rax),%eax
mov    -0x10(%rbp),%rcx
movsbl 0x2(%rcx),%ecx
cmp    %ecx,%eax
jne    1329 <terminal+0x229>
mov    -0x10(%rbp),%rax
movsbl 0x4(%rax),%eax
cmp    $0x2e,%eax
je     1329 <terminal+0x229>
mov    -0x10(%rbp),%rax
movsbl 0x6(%rax),%eax
cmp    $0x58,%eax
jne    1320 <terminal+0x220>
movb   $0x1,-0x1(%rbp)
jmp    13af <terminal+0x2af>
movb   $0x2,-0x1(%rbp)
jmp    13af <terminal+0x2af>
jmp    132e <terminal+0x22e>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    110f <terminal+0xf>
movl   $0x0,-0x14(%rbp)
cmpl   $0x3,-0x14(%rbp)
jae    13ab <terminal+0x2ab>
movl   $0x0,-0x18(%rbp)
cmpl   $0x3,-0x18(%rbp)
jae    1398 <terminal+0x298>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    1385 <terminal+0x285>
movb   $0x0,-0x1(%rbp)
jmp    13af <terminal+0x2af>
jmp    138a <terminal+0x28a>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1354 <terminal+0x254>
jmp    139d <terminal+0x29d>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1343 <terminal+0x243>
movb   $0x3,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<terminal>:
mov    (%rdi),%al
cmp    %al,0x1(%rdi)
jne    111c <terminal+0x1c>
cmp    %al,0x2(%rdi)
jne    111c <terminal+0x1c>
cmp    $0x58,%al
je     11d3 <terminal+0xd3>
cmp    $0x2e,%al
jne    11d0 <terminal+0xd0>
cmp    %al,0x3(%rdi)
jne    112e <terminal+0x2e>
cmp    %al,0x6(%rdi)
jne    112e <terminal+0x2e>
cmp    $0x2e,%al
jne    11e3 <terminal+0xe3>
mov    0x4(%rdi),%cl
cmp    %cl,%al
jne    1142 <terminal+0x42>
cmp    $0x2e,%al
je     1142 <terminal+0x42>
cmp    0x8(%rdi),%al
je     11e3 <terminal+0xe3>
mov    0x6(%rdi),%dl
cmp    %cl,%dl
jne    1157 <terminal+0x57>
cmp    $0x2e,%cl
je     1157 <terminal+0x57>
cmp    0x2(%rdi),%cl
je     11f5 <terminal+0xf5>
mov    0x3(%rdi),%sil
cmp    %sil,%cl
jne    116f <terminal+0x6f>
cmp    %cl,0x5(%rdi)
jne    116f <terminal+0x6f>
cmp    $0x58,%cl
je     11d3 <terminal+0xd3>
cmp    $0x2e,%cl
jne    11d0 <terminal+0xd0>
mov    0x1(%rdi),%r8b
cmp    %r8b,%cl
jne    1187 <terminal+0x87>
cmp    %cl,0x7(%rdi)
jne    1187 <terminal+0x87>
cmp    $0x2e,%sil
je     1187 <terminal+0x87>
mov    %ecx,%eax
jmp    11e3 <terminal+0xe3>
cmp    %cl,%al
jne    1194 <terminal+0x94>
cmp    $0x2e,%al
je     1194 <terminal+0x94>
cmp    0x8(%rdi),%al
je     11e3 <terminal+0xe3>
cmp    %cl,%dl
jne    11a2 <terminal+0xa2>
cmp    $0x2e,%cl
je     11a2 <terminal+0xa2>
cmp    0x2(%rdi),%cl
je     11f5 <terminal+0xf5>
cmp    %dl,0x7(%rdi)
jne    11b6 <terminal+0xb6>
cmp    %dl,0x8(%rdi)
jne    11b6 <terminal+0xb6>
cmp    $0x58,%dl
je     11d3 <terminal+0xd3>
cmp    $0x2e,%dl
jne    11d0 <terminal+0xd0>
mov    0x2(%rdi),%r9b
cmp    %r9b,0x5(%rdi)
jne    11d6 <terminal+0xd6>
cmp    %r9b,0x8(%rdi)
jne    11d6 <terminal+0xd6>
cmp    $0x2e,%dl
je     11d6 <terminal+0xd6>
mov    %r9d,%eax
jmp    11e3 <terminal+0xe3>
mov    $0x2,%al
ret
mov    $0x1,%al
ret
cmp    %cl,%al
jne    11e7 <terminal+0xe7>
cmp    $0x2e,%al
je     11e7 <terminal+0xe7>
cmp    0x8(%rdi),%al
jne    11e7 <terminal+0xe7>
cmp    $0x58,%al
jmp    11f8 <terminal+0xf8>
cmp    %cl,%dl
jne    1200 <terminal+0x100>
cmp    $0x2e,%cl
je     1200 <terminal+0x100>
cmp    %r9b,%cl
jne    1200 <terminal+0x100>
cmp    $0x58,%cl
sete   %cl
mov    $0x2,%al
sub    %cl,%al
ret
cmp    $0x2e,%al
je     1234 <terminal+0x134>
cmp    $0x2e,%r8b
je     1234 <terminal+0x134>
cmp    $0x2e,%r9b
je     1234 <terminal+0x134>
cmp    $0x2e,%sil
je     1234 <terminal+0x134>
cmp    $0x2e,%cl
je     1234 <terminal+0x134>
cmpb   $0x2e,0x5(%rdi)
je     1234 <terminal+0x134>
cmp    $0x2e,%dl
je     1234 <terminal+0x134>
cmpb   $0x2e,0x7(%rdi)
je     1234 <terminal+0x134>
mov    $0x3,%al
cmpb   $0x2e,0x8(%rdi)
jne    11d2 <terminal+0xd2>
xor    %eax,%eax
ret

LLVM IR (-O0):
define signext i8 @terminal([3 x i8]* %0) {
%2 = alloca i8
%3 = alloca [3 x i8]*
%4 = alloca i32
%5 = alloca i32
store [3 x i8]* %0, [3 x i8]** %3
store i32 0, i32* %4
br label %6
6: ; preds = %190, %1
%7 = load i32, i32* %4
%8 = icmp ult i32 %7, 3
br i1 %8, label %9, label %193
9: ; preds = %6
store i32 0, i32* %5
br label %10
10: ; preds = %33, %9
%11 = load i32, i32* %5
%12 = icmp ult i32 %11, 3
br i1 %12, label %13, label %36
13: ; preds = %10
%14 = load [3 x i8]*, [3 x i8]** %3
%15 = load i32, i32* %4
%16 = zext i32 %15 to i64
%17 = getelementptr inbounds [3 x i8], [3 x i8]* %14, i64 %16
%18 = load i32, i32* %5
%19 = zext i32 %18 to i64
%20 = getelementptr inbounds [3 x i8], [3 x i8]* %17, i64 0, i64 %19
%21 = load i8, i8* %20
%22 = sext i8 %21 to i32
%23 = load [3 x i8]*, [3 x i8]** %3
%24 = load i32, i32* %4
%25 = zext i32 %24 to i64
%26 = getelementptr inbounds [3 x i8], [3 x i8]* %23, i64 %25
%27 = getelementptr inbounds [3 x i8], [3 x i8]* %26, i64 0, i64 0
%28 = load i8, i8* %27
%29 = sext i8 %28 to i32
%30 = icmp ne i32 %22, %29
br i1 %30, label %31, label %32
31: ; preds = %13
br label %36
32: ; preds = %13
br label %33
33: ; preds = %32
%34 = load i32, i32* %5
%35 = add i32 %34, 1
store i32 %35, i32* %5
br label %10
36: ; preds = %31, %10
%37 = load i32, i32* %5
%38 = icmp eq i32 3, %37
br i1 %38, label %39, label %59
39: ; preds = %36
%40 = load [3 x i8]*, [3 x i8]** %3
%41 = load i32, i32* %4
%42 = zext i32 %41 to i64
%43 = getelementptr inbounds [3 x i8], [3 x i8]* %40, i64 %42
%44 = getelementptr inbounds [3 x i8], [3 x i8]* %43, i64 0, i64 0
%45 = load i8, i8* %44
%46 = sext i8 %45 to i32
%47 = icmp ne i32 %46, 46
br i1 %47, label %48, label %59
48: ; preds = %39
%49 = load [3 x i8]*, [3 x i8]** %3
%50 = load i32, i32* %4
%51 = zext i32 %50 to i64
%52 = getelementptr inbounds [3 x i8], [3 x i8]* %49, i64 %51
%53 = getelementptr inbounds [3 x i8], [3 x i8]* %52, i64 0, i64 0
%54 = load i8, i8* %53
%55 = sext i8 %54 to i32
%56 = icmp eq i32 %55, 88
br i1 %56, label %57, label %58
57: ; preds = %48
store i8 1, i8* %2
br label %222
58: ; preds = %48
store i8 2, i8* %2
br label %222
59: ; preds = %39, %36
store i32 0, i32* %5
br label %60
60: ; preds = %83, %59
%61 = load i32, i32* %5
%62 = icmp ult i32 %61, 3
br i1 %62, label %63, label %86
63: ; preds = %60
%64 = load [3 x i8]*, [3 x i8]** %3
%65 = load i32, i32* %5
%66 = zext i32 %65 to i64
%67 = getelementptr inbounds [3 x i8], [3 x i8]* %64, i64 %66
%68 = load i32, i32* %4
%69 = zext i32 %68 to i64
%70 = getelementptr inbounds [3 x i8], [3 x i8]* %67, i64 0, i64 %69
%71 = load i8, i8* %70
%72 = sext i8 %71 to i32
%73 = load [3 x i8]*, [3 x i8]** %3
%74 = getelementptr inbounds [3 x i8], [3 x i8]* %73, i64 0
%75 = load i32, i32* %4
%76 = zext i32 %75 to i64
%77 = getelementptr inbounds [3 x i8], [3 x i8]* %74, i64 0, i64 %76
%78 = load i8, i8* %77
%79 = sext i8 %78 to i32
%80 = icmp ne i32 %72, %79
br i1 %80, label %81, label %82
81: ; preds = %63
br label %86
82: ; preds = %63
br label %83
83: ; preds = %82
%84 = load i32, i32* %5
%85 = add i32 %84, 1
store i32 %85, i32* %5
br label %60
86: ; preds = %81, %60
%87 = load i32, i32* %5
%88 = icmp eq i32 3, %87
br i1 %88, label %89, label %109
89: ; preds = %86
%90 = load [3 x i8]*, [3 x i8]** %3
%91 = load i32, i32* %4
%92 = zext i32 %91 to i64
%93 = getelementptr inbounds [3 x i8], [3 x i8]* %90, i64 %92
%94 = getelementptr inbounds [3 x i8], [3 x i8]* %93, i64 0, i64 0
%95 = load i8, i8* %94
%96 = sext i8 %95 to i32
%97 = icmp ne i32 %96, 46
br i1 %97, label %98, label %109
98: ; preds = %89
%99 = load [3 x i8]*, [3 x i8]** %3
%100 = getelementptr inbounds [3 x i8], [3 x i8]* %99, i64 0
%101 = load i32, i32* %4
%102 = zext i32 %101 to i64
%103 = getelementptr inbounds [3 x i8], [3 x i8]* %100, i64 0, i64 %102
%104 = load i8, i8* %103
%105 = sext i8 %104 to i32
%106 = icmp eq i32 %105, 88
br i1 %106, label %107, label %108
107: ; preds = %98
store i8 1, i8* %2
br label %222
108: ; preds = %98
store i8 2, i8* %2
br label %222
109: ; preds = %89, %86
%110 = load [3 x i8]*, [3 x i8]** %3
%111 = getelementptr inbounds [3 x i8], [3 x i8]* %110, i64 0
%112 = getelementptr inbounds [3 x i8], [3 x i8]* %111, i64 0, i64 0
%113 = load i8, i8* %112
%114 = sext i8 %113 to i32
%115 = load [3 x i8]*, [3 x i8]** %3
%116 = getelementptr inbounds [3 x i8], [3 x i8]* %115, i64 1
%117 = getelementptr inbounds [3 x i8], [3 x i8]* %116, i64 0, i64 1
%118 = load i8, i8* %117
%119 = sext i8 %118 to i32
%120 = icmp eq i32 %114, %119
br i1 %120, label %121, label %149
121: ; preds = %109
%122 = load [3 x i8]*, [3 x i8]** %3
%123 = getelementptr inbounds [3 x i8], [3 x i8]* %122, i64 1
%124 = getelementptr inbounds [3 x i8], [3 x i8]* %123, i64 0, i64 1
%125 = load i8, i8* %124
%126 = sext i8 %125 to i32
%127 = load [3 x i8]*, [3 x i8]** %3
%128 = getelementptr inbounds [3 x i8], [3 x i8]* %127, i64 2
%129 = getelementptr inbounds [3 x i8], [3 x i8]* %128, i64 0, i64 2
%130 = load i8, i8* %129
%131 = sext i8 %130 to i32
%132 = icmp eq i32 %126, %131
br i1 %132, label %133, label %149
133: ; preds = %121
%134 = load [3 x i8]*, [3 x i8]** %3
%135 = getelementptr inbounds [3 x i8], [3 x i8]* %134, i64 1
%136 = getelementptr inbounds [3 x i8], [3 x i8]* %135, i64 0, i64 1
%137 = load i8, i8* %136
%138 = sext i8 %137 to i32
%139 = icmp ne i32 %138, 46
br i1 %139, label %140, label %149
140: ; preds = %133
%141 = load [3 x i8]*, [3 x i8]** %3
%142 = getelementptr inbounds [3 x i8], [3 x i8]* %141, i64 0
%143 = getelementptr inbounds [3 x i8], [3 x i8]* %142, i64 0, i64 0
%144 = load i8, i8* %143
%145 = sext i8 %144 to i32
%146 = icmp eq i32 %145, 88
br i1 %146, label %147, label %148
147: ; preds = %140
store i8 1, i8* %2
br label %222
148: ; preds = %140
store i8 2, i8* %2
br label %222
149: ; preds = %133, %121, %109
%150 = load [3 x i8]*, [3 x i8]** %3
%151 = getelementptr inbounds [3 x i8], [3 x i8]* %150, i64 2
%152 = getelementptr inbounds [3 x i8], [3 x i8]* %151, i64 0, i64 0
%153 = load i8, i8* %152
%154 = sext i8 %153 to i32
%155 = load [3 x i8]*, [3 x i8]** %3
%156 = getelementptr inbounds [3 x i8], [3 x i8]* %155, i64 1
%157 = getelementptr inbounds [3 x i8], [3 x i8]* %156, i64 0, i64 1
%158 = load i8, i8* %157
%159 = sext i8 %158 to i32
%160 = icmp eq i32 %154, %159
br i1 %160, label %161, label %189
161: ; preds = %149
%162 = load [3 x i8]*, [3 x i8]** %3
%163 = getelementptr inbounds [3 x i8], [3 x i8]* %162, i64 1
%164 = getelementptr inbounds [3 x i8], [3 x i8]* %163, i64 0, i64 1
%165 = load i8, i8* %164
%166 = sext i8 %165 to i32
%167 = load [3 x i8]*, [3 x i8]** %3
%168 = getelementptr inbounds [3 x i8], [3 x i8]* %167, i64 0
%169 = getelementptr inbounds [3 x i8], [3 x i8]* %168, i64 0, i64 2
%170 = load i8, i8* %169
%171 = sext i8 %170 to i32
%172 = icmp eq i32 %166, %171
br i1 %172, label %173, label %189
173: ; preds = %161
%174 = load [3 x i8]*, [3 x i8]** %3
%175 = getelementptr inbounds [3 x i8], [3 x i8]* %174, i64 1
%176 = getelementptr inbounds [3 x i8], [3 x i8]* %175, i64 0, i64 1
%177 = load i8, i8* %176
%178 = sext i8 %177 to i32
%179 = icmp ne i32 %178, 46
br i1 %179, label %180, label %189
180: ; preds = %173
%181 = load [3 x i8]*, [3 x i8]** %3
%182 = getelementptr inbounds [3 x i8], [3 x i8]* %181, i64 2
%183 = getelementptr inbounds [3 x i8], [3 x i8]* %182, i64 0, i64 0
%184 = load i8, i8* %183
%185 = sext i8 %184 to i32
%186 = icmp eq i32 %185, 88
br i1 %186, label %187, label %188
187: ; preds = %180
store i8 1, i8* %2
br label %222
188: ; preds = %180
store i8 2, i8* %2
br label %222
189: ; preds = %173, %161, %149
br label %190
190: ; preds = %189
%191 = load i32, i32* %4
%192 = add i32 %191, 1
store i32 %192, i32* %4
br label %6
193: ; preds = %6
store i32 0, i32* %4
br label %194
194: ; preds = %218, %193
%195 = load i32, i32* %4
%196 = icmp ult i32 %195, 3
br i1 %196, label %197, label %221
197: ; preds = %194
store i32 0, i32* %5
br label %198
198: ; preds = %214, %197
%199 = load i32, i32* %5
%200 = icmp ult i32 %199, 3
br i1 %200, label %201, label %217
201: ; preds = %198
%202 = load [3 x i8]*, [3 x i8]** %3
%203 = load i32, i32* %4
%204 = zext i32 %203 to i64
%205 = getelementptr inbounds [3 x i8], [3 x i8]* %202, i64 %204
%206 = load i32, i32* %5
%207 = zext i32 %206 to i64
%208 = getelementptr inbounds [3 x i8], [3 x i8]* %205, i64 0, i64 %207
%209 = load i8, i8* %208
%210 = sext i8 %209 to i32
%211 = icmp eq i32 %210, 46
br i1 %211, label %212, label %213
212: ; preds = %201
store i8 0, i8* %2
br label %222
213: ; preds = %201
br label %214
214: ; preds = %213
%215 = load i32, i32* %5
%216 = add i32 %215, 1
store i32 %216, i32* %5
br label %198
217: ; preds = %198
br label %218
218: ; preds = %217
%219 = load i32, i32* %4
%220 = add i32 %219, 1
store i32 %220, i32* %4
br label %194
221: ; preds = %194
store i8 3, i8* %2
br label %222
222: ; preds = %221, %212, %188, %187, %148, %147, %108, %107, %58, %57
%223 = load i8, i8* %2
ret i8 %223
}

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