#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 */
scalar_t__ playerWins(int, int);
int resolveValue(char);
void deal(int player, int dealer, int playerEleven, int dealerEleven, int count,
          int stopped, char cards[], int *canWin) {
  int val;
  int eleven;
  char card = cards[count];
  if (count < 4) {
    if (count % 2 == 0) {
      eleven = playerEleven;
      if (card == 'A') {
        if (player + 11 < 22) {
          eleven = 1;
          val = 11;
        } else
          val = 1;
      } else
        val = resolveValue(card);
      if (player + val > 21 && playerEleven) {
        eleven = 0;
        val -= 10;
      }
      deal(player + val, dealer, eleven, dealerEleven, count + 1, stopped,
           cards, canWin);
    } else {
      eleven = dealerEleven;
      if (card == 'A') {
        if (dealer + 11 < 22) {
          eleven = 1;
          val = 11;
        } else
          val = 1;
      } else
        val = resolveValue(card);
      if (dealer + val > 21 && dealerEleven) {
        eleven = 0;
        val -= 10;
      }
      deal(player, dealer + val, playerEleven, eleven, count + 1, stopped,
           cards, canWin);
    }
  } else if (card == '\0')
    *canWin = *canWin || playerWins(player, dealer);
  else if (stopped) {
    if (dealer > 16)
      *canWin = *canWin || playerWins(player, dealer);
    else {
      eleven = dealerEleven;
      if (card == 'A') {
        if (dealer + 11 < 22) {
          eleven = 1;
          val = 11;
        } else
          val = 1;
      } else
        val = resolveValue(card);
      if (dealer + val > 21 && dealerEleven) {
        eleven = 0;
        val -= 10;
      }
      deal(player, dealer + val, playerEleven, eleven, count + 1, stopped,
           cards, canWin);
    }
  } else if (player <= 21) {
    eleven = playerEleven;
    deal(player, dealer, playerEleven, dealerEleven, count, 1, cards, canWin);
    if (card == 'A') {
      if (player + 11 < 22) {
        eleven = 1;
        val = 11;
      } else
        val = 1;
    } else
      val = resolveValue(card);
    if (player + val > 21 && playerEleven) {
      eleven = 0;
      val -= 10;
    }
    deal(player + val, dealer, eleven, dealerEleven, count + 1, stopped, cards,
         canWin);
  }
}


x86 assembly (clang, -O0):
<deal>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    %r9d,-0x18(%rbp)
mov    0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x21(%rbp)
cmpl   $0x4,-0x14(%rbp)
jge    12d8 <deal+0x1a8>
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    122c <deal+0xfc>
mov    -0xc(%rbp),%eax
mov    %eax,-0x20(%rbp)
movsbl -0x21(%rbp),%eax
cmp    $0x41,%eax
jne    11c1 <deal+0x91>
mov    -0x4(%rbp),%eax
add    $0xb,%eax
cmp    $0x16,%eax
jge    11b5 <deal+0x85>
movl   $0x1,-0x20(%rbp)
movl   $0xb,-0x1c(%rbp)
jmp    11bc <deal+0x8c>
movl   $0x1,-0x1c(%rbp)
jmp    11cd <deal+0x9d>
movsbl -0x21(%rbp),%edi
call   1030 <resolveValue@plt>
mov    %eax,-0x1c(%rbp)
mov    -0x4(%rbp),%eax
add    -0x1c(%rbp),%eax
cmp    $0x15,%eax
jle    11f6 <deal+0xc6>
cmpl   $0x0,-0xc(%rbp)
je     11f6 <deal+0xc6>
movl   $0x0,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
sub    $0xa,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x4(%rbp),%edi
add    -0x1c(%rbp),%edi
mov    -0x8(%rbp),%esi
mov    -0x20(%rbp),%edx
mov    -0x10(%rbp),%ecx
mov    -0x14(%rbp),%r8d
add    $0x1,%r8d
mov    -0x18(%rbp),%r9d
mov    0x10(%rbp),%r10
mov    0x18(%rbp),%rax
mov    %r10,(%rsp)
mov    %rax,0x8(%rsp)
call   1040 <deal@plt>
jmp    12d3 <deal+0x1a3>
mov    -0x10(%rbp),%eax
mov    %eax,-0x20(%rbp)
movsbl -0x21(%rbp),%eax
cmp    $0x41,%eax
jne    126d <deal+0x13d>
mov    -0x8(%rbp),%eax
add    $0xb,%eax
cmp    $0x16,%eax
jge    1261 <deal+0x131>
movl   $0x1,-0x20(%rbp)
movl   $0xb,-0x1c(%rbp)
jmp    1268 <deal+0x138>
movl   $0x1,-0x1c(%rbp)
jmp    1279 <deal+0x149>
movsbl -0x21(%rbp),%edi
call   1030 <resolveValue@plt>
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%eax
add    -0x1c(%rbp),%eax
cmp    $0x15,%eax
jle    12a2 <deal+0x172>
cmpl   $0x0,-0x10(%rbp)
je     12a2 <deal+0x172>
movl   $0x0,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
sub    $0xa,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x4(%rbp),%edi
mov    -0x8(%rbp),%esi
add    -0x1c(%rbp),%esi
mov    -0xc(%rbp),%edx
mov    -0x20(%rbp),%ecx
mov    -0x14(%rbp),%r8d
add    $0x1,%r8d
mov    -0x18(%rbp),%r9d
mov    0x10(%rbp),%r10
mov    0x18(%rbp),%rax
mov    %r10,(%rsp)
mov    %rax,0x8(%rsp)
call   1040 <deal@plt>
jmp    1505 <deal+0x3d5>
movsbl -0x21(%rbp),%eax
cmp    $0x0,%eax
jne    131f <deal+0x1ef>
mov    0x18(%rbp),%rcx
mov    $0x1,%al
cmpl   $0x0,(%rcx)
mov    %al,-0x22(%rbp)
jne    130c <deal+0x1dc>
mov    -0x4(%rbp),%edi
mov    -0x8(%rbp),%esi
call   1050 <playerWins@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x22(%rbp)
mov    -0x22(%rbp),%al
and    $0x1,%al
movzbl %al,%ecx
mov    0x18(%rbp),%rax
mov    %ecx,(%rax)
jmp    1500 <deal+0x3d0>
cmpl   $0x0,-0x18(%rbp)
je     1419 <deal+0x2e9>
cmpl   $0x10,-0x8(%rbp)
jle    136d <deal+0x23d>
mov    0x18(%rbp),%rcx
mov    $0x1,%al
cmpl   $0x0,(%rcx)
mov    %al,-0x23(%rbp)
jne    135a <deal+0x22a>
mov    -0x4(%rbp),%edi
mov    -0x8(%rbp),%esi
call   1050 <playerWins@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x23(%rbp)
mov    -0x23(%rbp),%al
and    $0x1,%al
movzbl %al,%ecx
mov    0x18(%rbp),%rax
mov    %ecx,(%rax)
jmp    1414 <deal+0x2e4>
mov    -0x10(%rbp),%eax
mov    %eax,-0x20(%rbp)
movsbl -0x21(%rbp),%eax
cmp    $0x41,%eax
jne    13ae <deal+0x27e>
mov    -0x8(%rbp),%eax
add    $0xb,%eax
cmp    $0x16,%eax
jge    13a2 <deal+0x272>
movl   $0x1,-0x20(%rbp)
movl   $0xb,-0x1c(%rbp)
jmp    13a9 <deal+0x279>
movl   $0x1,-0x1c(%rbp)
jmp    13ba <deal+0x28a>
movsbl -0x21(%rbp),%edi
call   1030 <resolveValue@plt>
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%eax
add    -0x1c(%rbp),%eax
cmp    $0x15,%eax
jle    13e3 <deal+0x2b3>
cmpl   $0x0,-0x10(%rbp)
je     13e3 <deal+0x2b3>
movl   $0x0,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
sub    $0xa,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x4(%rbp),%edi
mov    -0x8(%rbp),%esi
add    -0x1c(%rbp),%esi
mov    -0xc(%rbp),%edx
mov    -0x20(%rbp),%ecx
mov    -0x14(%rbp),%r8d
add    $0x1,%r8d
mov    -0x18(%rbp),%r9d
mov    0x10(%rbp),%r10
mov    0x18(%rbp),%rax
mov    %r10,(%rsp)
mov    %rax,0x8(%rsp)
call   1040 <deal@plt>
jmp    14fb <deal+0x3cb>
cmpl   $0x15,-0x4(%rbp)
jg     14f6 <deal+0x3c6>
mov    -0xc(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x4(%rbp),%edi
mov    -0x8(%rbp),%esi
mov    -0xc(%rbp),%edx
mov    -0x10(%rbp),%ecx
mov    -0x14(%rbp),%r8d
mov    0x10(%rbp),%r10
mov    0x18(%rbp),%rax
mov    $0x1,%r9d
mov    %r10,(%rsp)
mov    %rax,0x8(%rsp)
call   1040 <deal@plt>
movsbl -0x21(%rbp),%eax
cmp    $0x41,%eax
jne    1490 <deal+0x360>
mov    -0x4(%rbp),%eax
add    $0xb,%eax
cmp    $0x16,%eax
jge    1484 <deal+0x354>
movl   $0x1,-0x20(%rbp)
movl   $0xb,-0x1c(%rbp)
jmp    148b <deal+0x35b>
movl   $0x1,-0x1c(%rbp)
jmp    149c <deal+0x36c>
movsbl -0x21(%rbp),%edi
call   1030 <resolveValue@plt>
mov    %eax,-0x1c(%rbp)
mov    -0x4(%rbp),%eax
add    -0x1c(%rbp),%eax
cmp    $0x15,%eax
jle    14c5 <deal+0x395>
cmpl   $0x0,-0xc(%rbp)
je     14c5 <deal+0x395>
movl   $0x0,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
sub    $0xa,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x4(%rbp),%edi
add    -0x1c(%rbp),%edi
mov    -0x8(%rbp),%esi
mov    -0x20(%rbp),%edx
mov    -0x10(%rbp),%ecx
mov    -0x14(%rbp),%r8d
add    $0x1,%r8d
mov    -0x18(%rbp),%r9d
mov    0x10(%rbp),%r10
mov    0x18(%rbp),%rax
mov    %r10,(%rsp)
mov    %rax,0x8(%rsp)
call   1040 <deal@plt>
jmp    14fb <deal+0x3cb>
jmp    1500 <deal+0x3d0>
jmp    1505 <deal+0x3d5>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<deal>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %ecx,%r12d
mov    %esi,%r13d
mov    %rdi,0x10(%rsp)
mov    0x50(%rsp),%r10
test   %r9d,%r9d
sete   %r14b
xor    %edi,%edi
mov    %edx,0xc(%rsp)
movslq %r8d,%rbp
jmp    119d <deal+0x6d>
movsbl %r15b,%edi
call   1030 <resolveValue@plt>
xor    %edi,%edi
mov    0x50(%rsp),%r10
mov    %r12d,%ecx
lea    (%rax,%r13,1),%edx
cmp    $0x16,%edx
setge  %sil
test   %r12d,%r12d
setne  %bl
lea    -0xa(%rax),%edx
test   %sil,%bl
cmovne %edi,%ecx
cmove  %eax,%edx
add    $0x1,%rbp
add    %r13d,%edx
mov    %edx,%r13d
mov    %ecx,%r12d
movzbl (%r10,%rbp,1),%r15d
cmp    $0x3,%rbp
jg     11b0 <deal+0x80>
test   $0x1,%bpl
jne    11cd <deal+0x9d>
jmp    1200 <deal+0xd0>
test   %r15b,%r15b
je     131f <deal+0x1ef>
test   $0x1,%r14b
jne    1280 <deal+0x150>
cmp    $0x11,%r13d
jge    131f <deal+0x1ef>
cmp    $0x41,%r15b
jne    1160 <deal+0x30>
cmp    $0xb,%r13d
mov    %r12d,%ecx
mov    $0x1,%eax
cmovl  %eax,%ecx
mov    $0x1,%eax
mov    $0xb,%edx
cmovl  %edx,%eax
jmp    1173 <deal+0x43>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
cmp    $0x41,%r15b
jne    122c <deal+0xfc>
mov    0x10(%rsp),%r8
cmp    $0xb,%r8d
mov    0xc(%rsp),%ebx
mov    %ebx,%ecx
mov    $0x1,%eax
cmovl  %eax,%ecx
mov    $0x1,%eax
mov    $0xb,%edx
cmovl  %edx,%eax
jmp    1247 <deal+0x117>
movsbl %r15b,%edi
call   1030 <resolveValue@plt>
xor    %edi,%edi
mov    0x50(%rsp),%r10
mov    0xc(%rsp),%ebx
mov    %ebx,%ecx
mov    0x10(%rsp),%r8
lea    (%rax,%r8,1),%edx
cmp    $0x16,%edx
setge  %sil
test   %ebx,%ebx
setne  %dl
lea    -0xa(%rax),%ebx
test   %sil,%dl
cmovne %edi,%ecx
cmove  %eax,%ebx
add    %r8d,%ebx
lea    0x1(%rbp),%r8d
mov    %ebx,%eax
mov    %rax,0x10(%rsp)
mov    %ecx,0xc(%rsp)
jmp    115b <deal+0x2b>
nopw   0x0(%rax,%rax,1)
mov    0x10(%rsp),%rbx
cmp    $0x15,%ebx
jg     1345 <deal+0x215>
mov    %ebx,%edi
mov    %r13d,%esi
mov    0xc(%rsp),%r14d
mov    %r14d,%edx
mov    %r12d,%ecx
mov    %ebp,%r8d
mov    $0x1,%r9d
push   0x58(%rsp)
push   %r10
call   1040 <deal@plt>
add    $0x10,%rsp
cmp    $0x41,%r15b
jne    12d9 <deal+0x1a9>
cmp    $0xb,%ebx
mov    %r14d,%ecx
mov    $0x1,%eax
cmovl  %eax,%ecx
mov    $0x1,%eax
mov    $0xb,%edx
cmovl  %edx,%eax
jmp    12e5 <deal+0x1b5>
movsbl %r15b,%edi
call   1030 <resolveValue@plt>
mov    %r14d,%ecx
xor    %edi,%edi
lea    (%rax,%rbx,1),%edx
cmp    $0x16,%edx
setge  %r8b
test   %r14d,%r14d
setne  %dl
lea    -0xa(%rax),%esi
test   %r8b,%dl
cmovne %edi,%ecx
cmove  %eax,%esi
add    %ebx,%esi
lea    0x1(%rbp),%r8d
mov    $0x1,%r14b
mov    %esi,%eax
mov    %rax,0x10(%rsp)
mov    %ecx,%edx
mov    0x50(%rsp),%r10
jmp    1157 <deal+0x27>
mov    $0x1,%ecx
mov    0x58(%rsp),%rbx
cmpl   $0x0,(%rbx)
jne    1343 <deal+0x213>
mov    0x10(%rsp),%rdi
mov    %r13d,%esi
call   1050 <playerWins@plt>
xor    %ecx,%ecx
test   %rax,%rax
setne  %cl
mov    %ecx,(%rbx)
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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