#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 */
int /*<<< orphan*/ printf(char *);
int analyzeHand(int ranksInHand[], int suitsInHand[]) {
  int num_consec = 0;
  int i, rank, suit;
  int straight = 0;
  int flush = 0;
  int four = 0;
  int three = 0;
  int pairs = 0;
  for (suit = 0; suit < 4; suit += 1) {
    if (suitsInHand[suit] == 5) {
      flush = 1;
    }
  }
  rank = 0;
  while (ranksInHand[rank] == 0) {
    rank += 1;
  }
  for (; rank < 13 && ranksInHand[rank]; rank += 1) {
    num_consec += 1;
  }
  if (num_consec == 5) {
    straight = 1;
  }
  for (rank = 0; rank < 13; rank += 1) {
    if (ranksInHand[rank] == 4) {
      four = 1;
    }
    if (ranksInHand[rank] == 3) {
      three = 1;
    }
    if (ranksInHand[rank] == 2) {
      pairs += 1;
    }
  }
  if (straight && flush) {
    printf("Straight flush\n\n");
    return (20);
  } else if (four) {
    printf("Four of a Kind\n\n");
    return (10);
  } else if (three && pairs == 1) {
    printf("Full House\n\n");
    return (8);
  } else if (flush) {
    printf("Flush\n\n");
    return (5);
  } else if (straight) {
    printf("Straight\n\n");
    return (4);
  } else if (three) {
    printf("Three\n\n");
    return (3);
  } else if (pairs == 2) {
    printf("Two Pairs\n\n");
    return (2);
  } else if (pairs == 1) {
    printf("Pairs\n\n");
    return (1);
  } else {
    printf("High Card\n\n");
    return (0);
  }
}


x86 assembly (clang, -O0):
<analyzeHand>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x28(%rbp)
cmpl   $0x4,-0x28(%rbp)
jge    1187 <analyzeHand+0x77>
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
cmpl   $0x5,(%rax,%rcx,4)
jne    1174 <analyzeHand+0x64>
movl   $0x1,-0x30(%rbp)
jmp    1179 <analyzeHand+0x69>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1151 <analyzeHand+0x41>
movl   $0x0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jne    11ae <analyzeHand+0x9e>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    118e <analyzeHand+0x7e>
jmp    11b3 <analyzeHand+0xa3>
xor    %eax,%eax
cmpl   $0xd,-0x24(%rbp)
mov    %al,-0x3d(%rbp)
jge    11d4 <analyzeHand+0xc4>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
setne  %al
mov    %al,-0x3d(%rbp)
mov    -0x3d(%rbp),%al
test   $0x1,%al
jne    11e4 <analyzeHand+0xd4>
jmp    11fb <analyzeHand+0xeb>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11b3 <analyzeHand+0xa3>
cmpl   $0x5,-0x1c(%rbp)
jne    120c <analyzeHand+0xfc>
movl   $0x1,-0x2c(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0xd,-0x24(%rbp)
jge    127d <analyzeHand+0x16d>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
cmpl   $0x4,(%rax,%rcx,4)
jne    1236 <analyzeHand+0x126>
movl   $0x1,-0x34(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
cmpl   $0x3,(%rax,%rcx,4)
jne    124f <analyzeHand+0x13f>
movl   $0x1,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
cmpl   $0x2,(%rax,%rcx,4)
jne    126a <analyzeHand+0x15a>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    126f <analyzeHand+0x15f>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1213 <analyzeHand+0x103>
cmpl   $0x0,-0x2c(%rbp)
je     12a9 <analyzeHand+0x199>
cmpl   $0x0,-0x30(%rbp)
je     12a9 <analyzeHand+0x199>
lea    0xd68(%rip),%rdi
call   1030 <printf@plt>
movl   $0x14,-0x4(%rbp)
jmp    13b4 <analyzeHand+0x2a4>
cmpl   $0x0,-0x34(%rbp)
je     12cb <analyzeHand+0x1bb>
lea    0xd57(%rip),%rdi
call   1030 <printf@plt>
movl   $0xa,-0x4(%rbp)
jmp    13b4 <analyzeHand+0x2a4>
cmpl   $0x0,-0x38(%rbp)
je     12f7 <analyzeHand+0x1e7>
cmpl   $0x1,-0x3c(%rbp)
jne    12f7 <analyzeHand+0x1e7>
lea    0xd3c(%rip),%rdi
call   1030 <printf@plt>
movl   $0x8,-0x4(%rbp)
jmp    13b4 <analyzeHand+0x2a4>
cmpl   $0x0,-0x30(%rbp)
je     1319 <analyzeHand+0x209>
lea    0xd27(%rip),%rdi
call   1030 <printf@plt>
movl   $0x5,-0x4(%rbp)
jmp    13b4 <analyzeHand+0x2a4>
cmpl   $0x0,-0x2c(%rbp)
je     133b <analyzeHand+0x22b>
lea    0xd0d(%rip),%rdi
call   1030 <printf@plt>
movl   $0x4,-0x4(%rbp)
jmp    13b4 <analyzeHand+0x2a4>
cmpl   $0x0,-0x38(%rbp)
je     135d <analyzeHand+0x24d>
lea    0xcf6(%rip),%rdi
call   1030 <printf@plt>
movl   $0x3,-0x4(%rbp)
jmp    13b4 <analyzeHand+0x2a4>
cmpl   $0x2,-0x3c(%rbp)
jne    137f <analyzeHand+0x26f>
lea    0xcdc(%rip),%rdi
call   1030 <printf@plt>
movl   $0x2,-0x4(%rbp)
jmp    13b4 <analyzeHand+0x2a4>
cmpl   $0x1,-0x3c(%rbp)
jne    13a1 <analyzeHand+0x291>
lea    0xcbe(%rip),%rdi
call   1030 <printf@plt>
movl   $0x1,-0x4(%rbp)
jmp    13b4 <analyzeHand+0x2a4>
lea    0xcae(%rip),%rdi
call   1030 <printf@plt>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<analyzeHand>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    (%rsi),%r8d
mov    0x4(%rsi),%edx
mov    0x8(%rsi),%ebp
mov    0xc(%rsi),%esi
xor    %ecx,%ecx
nopl   0x0(%rax)
cmpl   $0x0,(%rdi,%rcx,4)
lea    0x1(%rcx),%rcx
je     1130 <analyzeHand+0x20>
cmp    $0x5,%esi
sete   %bl
cmp    $0x5,%ebp
sete   %al
cmp    $0x5,%edx
sete   %dl
cmp    $0x5,%r8d
sete   %r12b
or     %bl,%al
or     %dl,%r12b
or     %al,%r12b
lea    -0x1(%rcx),%rdx
xor    %ebp,%ebp
cmp    $0xc,%edx
ja     1198 <analyzeHand+0x88>
mov    $0xe,%ebp
sub    %rcx,%rbp
mov    %edx,%eax
lea    (%rdi,%rax,4),%rsi
xor    %edx,%edx
nopw   0x0(%rax,%rax,1)
cmpl   $0x0,(%rsi,%rdx,4)
je     1196 <analyzeHand+0x86>
lea    0x1(%rdx),%rax
add    %ecx,%edx
cmp    $0xd,%edx
mov    %rax,%rdx
jne    1180 <analyzeHand+0x70>
jmp    1198 <analyzeHand+0x88>
mov    %edx,%ebp
mov    (%rdi),%r10d
mov    0x4(%rdi),%r8d
cmp    $0x3,%r10d
sete   0x17(%rsp)
cmp    $0x2,%r10d
sete   0x13(%rsp)
cmp    $0x3,%r8d
sete   0x16(%rsp)
cmp    $0x2,%r8d
sete   0x12(%rsp)
mov    0x8(%rdi),%r14d
cmp    $0x3,%r14d
sete   0x15(%rsp)
xor    %esi,%esi
cmp    $0x2,%r14d
sete   0x11(%rsp)
mov    0xc(%rdi),%r9d
cmp    $0x3,%r9d
sete   0x14(%rsp)
xor    %ecx,%ecx
cmp    $0x2,%r9d
sete   0x10(%rsp)
mov    0x10(%rdi),%r15d
cmp    $0x3,%r15d
sete   %r11b
movdqu 0x14(%rdi),%xmm0
movdqu 0x24(%rdi),%xmm1
cmp    $0x2,%r15d
sete   %dl
pshufd $0xaf,%xmm1,%xmm2
pshufd $0x5,%xmm1,%xmm3
pshufd $0xaf,%xmm0,%xmm4
pshufd $0x5,%xmm0,%xmm5
movdqa 0xdd4(%rip),%xmm6
pcmpeqd %xmm6,%xmm5
pcmpeqd %xmm6,%xmm4
packssdw %xmm5,%xmm4
pcmpeqd %xmm6,%xmm3
pcmpeqd %xmm6,%xmm2
packssdw %xmm3,%xmm2
packsswb %xmm4,%xmm2
pmovmskb %xmm2,%r13d
test   $0xaaaa,%r13d
setne  %al
cmp    $0x5,%ebp
sete   %bl
test   %r12b,%bl
je     1273 <analyzeHand+0x163>
mov    $0x14,%ebx
lea    0xdfc(%rip),%rdi
jmp    140e <analyzeHand+0x2fe>
mov    %dl,0xe(%rsp)
mov    %al,0xf(%rsp)
movdqa 0xd8d(%rip),%xmm2
pcmpeqd %xmm2,%xmm0
pcmpeqd %xmm2,%xmm1
packssdw %xmm1,%xmm0
pmovmskb %xmm0,%eax
mov    $0xa,%ebx
lea    0xdbb(%rip),%rdi
test   %eax,%eax
jne    140e <analyzeHand+0x2fe>
cmp    $0x4,%r15d
je     140e <analyzeHand+0x2fe>
cmp    $0x4,%r9d
je     140e <analyzeHand+0x2fe>
cmp    $0x4,%r14d
je     140e <analyzeHand+0x2fe>
cmp    $0x4,%r8d
je     140e <analyzeHand+0x2fe>
cmp    $0x4,%r10d
je     140e <analyzeHand+0x2fe>
xor    %eax,%eax
mov    0x13(%rsp),%bl
mov    %bl,%al
mov    0x12(%rsp),%bl
xor    %edx,%edx
mov    %bl,%dl
add    %eax,%edx
mov    0x11(%rsp),%al
mov    %al,%sil
add    %edx,%esi
mov    0x10(%rsp),%al
mov    %al,%cl
add    %esi,%ecx
xor    %ebx,%ebx
mov    0xe(%rsp),%al
mov    %al,%bl
add    %ecx,%ebx
mov    %r13d,%r9d
and    $0x4,%r9d
shr    $0x2,%r9d
mov    %r13d,%edi
and    $0x10,%edi
shr    $0x4,%edi
mov    %r13d,%eax
and    $0x40,%eax
shr    $0x6,%eax
mov    %r13d,%esi
shr    $0x8,%esi
and    $0x1,%esi
mov    %rbp,%r8
mov    %r13d,%ebp
shr    $0xa,%ebp
and    $0x1,%ebp
mov    %r13d,%ecx
shr    $0xc,%ecx
and    $0x1,%ecx
mov    %r13d,%edx
shr    $0xe,%edx
and    $0x1,%edx
add    %ebx,%edx
add    %ecx,%edx
add    %ebp,%edx
add    %esi,%edx
add    %eax,%edx
add    %edi,%edx
add    %r9d,%edx
or     0x14(%rsp),%r11b
or     0x15(%rsp),%r11b
or     0x16(%rsp),%r11b
or     0x17(%rsp),%r11b
mov    0xf(%rsp),%al
or     %r11b,%al
and    $0x1,%r13d
add    %edx,%r13d
cmp    $0x5,%r8d
sete   %bl
cmp    $0x1,%r13d
sete   %cl
and    %al,%cl
or     %cl,%r12b
lea    0xcb9(%rip),%rdx
lea    0xcab(%rip),%rsi
test   %cl,%cl
cmovne %rdx,%rsi
movzbl %cl,%ecx
lea    (%rcx,%rcx,2),%ecx
add    $0x5,%ecx
or     %r12b,%bl
lea    0xc88(%rip),%rdx
test   %r12b,%r12b
cmovne %rsi,%rdx
mov    $0x4,%esi
cmovne %ecx,%esi
or     %bl,%al
lea    0xc69(%rip),%rdi
test   %bl,%bl
cmovne %rdx,%rdi
mov    $0x3,%ebx
cmovne %esi,%ebx
test   %al,%al
jne    140e <analyzeHand+0x2fe>
cmp    $0x2,%r13d
jne    13f3 <analyzeHand+0x2e3>
mov    $0x2,%ebx
lea    0xc3a(%rip),%rdi
jmp    140e <analyzeHand+0x2fe>
xor    %ebx,%ebx
cmp    $0x1,%r13d
sete   %bl
lea    0xc2c(%rip),%rax
lea    0xc16(%rip),%rdi
cmove  %rax,%rdi
call   1030 <puts@plt>
mov    %ebx,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@str = [11 x i8] c"High Card\0A\00"
@str.9 = [7 x i8] c"Pairs\0A\00"
@str.10 = [11 x i8] c"Two Pairs\0A\00"
@str.11 = [7 x i8] c"Three\0A\00"
@str.12 = [10 x i8] c"Straight\0A\00"
@str.13 = [7 x i8] c"Flush\0A\00"
@str.14 = [12 x i8] c"Full House\0A\00"
@str.15 = [16 x i8] c"Four of a Kind\0A\00"
@str.16 = [16 x i8] c"Straight flush\0A\00"
define i32 @analyzeHand(i32* nocapture %0, i32* nocapture %1) {
%3 = load i32, i32* %1
%4 = icmp eq i32 %3, 5
%5 = getelementptr inbounds i32, i32* %1, i64 1
%6 = load i32, i32* %5
%7 = icmp eq i32 %6, 5
%8 = getelementptr inbounds i32, i32* %1, i64 2
%9 = load i32, i32* %8
%10 = icmp eq i32 %9, 5
%11 = getelementptr inbounds i32, i32* %1, i64 3
%12 = load i32, i32* %11
%13 = icmp eq i32 %12, 5
br label %14
14: ; preds = %14, %2
%15 = phi i64 [ %19, %14 ], [ 0, %2 ]
%16 = getelementptr inbounds i32, i32* %0, i64 %15
%17 = load i32, i32* %16
%18 = icmp eq i32 %17, 0
%19 = add nuw i64 %15, 1
br i1 %18, label %14, label %20
20: ; preds = %14
%21 = select i1 %13, i1 true, i1 %10
%22 = select i1 %21, i1 true, i1 %7
%23 = select i1 %22, i1 true, i1 %4
%24 = trunc i64 %15 to i32
%25 = icmp ult i32 %24, 13
br i1 %25, label %26, label %39
26: ; preds = %20
%27 = and i64 %15, 4294967295
%28 = sub nuw nsw i32 13, %24
br label %29
29: ; preds = %26, %35
%30 = phi i64 [ %27, %26 ], [ %37, %35 ]
%31 = phi i32 [ 0, %26 ], [ %36, %35 ]
%32 = getelementptr inbounds i32, i32* %0, i64 %30
%33 = load i32, i32* %32
%34 = icmp eq i32 %33, 0
br i1 %34, label %39, label %35
35: ; preds = %29
%36 = add nuw nsw i32 %31, 1
%37 = add nuw nsw i64 %30, 1
%38 = icmp eq i32 %36, %28
br i1 %38, label %39, label %29
39: ; preds = %29, %35, %20
%40 = phi i32 [ 0, %20 ], [ %28, %35 ], [ %31, %29 ]
%41 = load i32, i32* %0
%42 = icmp eq i32 %41, 3
%43 = icmp eq i32 %41, 2
%44 = zext i1 %43 to i32
%45 = getelementptr inbounds i32, i32* %0, i64 1
%46 = load i32, i32* %45
%47 = icmp eq i32 %46, 3
%48 = icmp eq i32 %46, 2
%49 = zext i1 %48 to i32
%50 = add nuw nsw i32 %44, %49
%51 = getelementptr inbounds i32, i32* %0, i64 2
%52 = load i32, i32* %51
%53 = icmp eq i32 %52, 3
%54 = icmp eq i32 %52, 2
%55 = zext i1 %54 to i32
%56 = add nuw nsw i32 %50, %55
%57 = getelementptr inbounds i32, i32* %0, i64 3
%58 = load i32, i32* %57
%59 = icmp eq i32 %58, 3
%60 = icmp eq i32 %58, 2
%61 = zext i1 %60 to i32
%62 = add nuw nsw i32 %56, %61
%63 = getelementptr inbounds i32, i32* %0, i64 4
%64 = load i32, i32* %63
%65 = icmp eq i32 %64, 3
%66 = icmp eq i32 %64, 2
%67 = zext i1 %66 to i32
%68 = add nuw nsw i32 %62, %67
%69 = getelementptr inbounds i32, i32* %0, i64 5
%70 = bitcast i32* %69 to <8 x i32>*
%71 = load <8 x i32>, <8 x i32>* %70
%72 = shufflevector <8 x i32> %71, <8 x i32> undef, <16 x i32> <i32 7, i32 7, i32 6, i32 6, i32 5, i32 5, i32 4, i32 4, i32 3, i32 3, i32 2, i32 2, i32 1, i32 1, i32 0, i32 0>
%73 = icmp eq <16 x i32> %72, <i32 2, i32 3, i32 2, i32 3, i32 2, i32 3, i32 2, i32 3, i32 2, i32 3, i32 2, i32 3, i32 2, i32 3, i32 2, i32 3>
%74 = extractelement <16 x i1> %73, i64 14
%75 = zext i1 %74 to i32
%76 = add nuw nsw i32 %68, %75
%77 = extractelement <16 x i1> %73, i64 12
%78 = zext i1 %77 to i32
%79 = add nuw nsw i32 %76, %78
%80 = extractelement <16 x i1> %73, i64 10
%81 = zext i1 %80 to i32
%82 = add nuw nsw i32 %79, %81
%83 = extractelement <16 x i1> %73, i64 8
%84 = zext i1 %83 to i32
%85 = add nuw nsw i32 %82, %84
%86 = extractelement <16 x i1> %73, i64 6
%87 = zext i1 %86 to i32
%88 = add nuw nsw i32 %85, %87
%89 = extractelement <16 x i1> %73, i64 4
%90 = zext i1 %89 to i32
%91 = add nuw nsw i32 %88, %90
%92 = extractelement <16 x i1> %73, i64 2
%93 = zext i1 %92 to i32
%94 = add nuw nsw i32 %91, %93
%95 = extractelement <16 x i1> %73, i64 1
%96 = extractelement <16 x i1> %73, i64 3
%97 = select i1 %95, i1 true, i1 %96
%98 = extractelement <16 x i1> %73, i64 5
%99 = select i1 %97, i1 true, i1 %98
%100 = extractelement <16 x i1> %73, i64 7
%101 = select i1 %99, i1 true, i1 %100
%102 = extractelement <16 x i1> %73, i64 9
%103 = select i1 %101, i1 true, i1 %102
%104 = extractelement <16 x i1> %73, i64 11
%105 = select i1 %103, i1 true, i1 %104
%106 = extractelement <16 x i1> %73, i64 13
%107 = select i1 %105, i1 true, i1 %106
%108 = extractelement <16 x i1> %73, i64 15
%109 = select i1 %107, i1 true, i1 %108
%110 = select i1 %109, i1 true, i1 %65
%111 = select i1 %110, i1 true, i1 %59
%112 = select i1 %111, i1 true, i1 %53
%113 = select i1 %112, i1 true, i1 %47
%114 = select i1 %113, i1 true, i1 %42
%115 = extractelement <16 x i1> %73, i64 0
%116 = zext i1 %115 to i32
%117 = add nuw nsw i32 %94, %116
%118 = icmp eq i32 %40, 5
%119 = select i1 %118, i1 %23, i1 false
br i1 %119, label %152, label %120
120: ; preds = %39
%121 = icmp ne i32 %41, 4
%122 = icmp ne i32 %46, 4
%123 = icmp ne i32 %52, 4
%124 = icmp ne i32 %58, 4
%125 = icmp ne i32 %64, 4
%126 = freeze <8 x i32> %71
%127 = icmp eq <8 x i32> %126, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
%128 = bitcast <8 x i1> %127 to i8
%129 = icmp eq i8 %128, 0
%130 = select i1 %129, i1 %125, i1 false
%131 = select i1 %130, i1 %124, i1 false
%132 = select i1 %131, i1 %123, i1 false
%133 = select i1 %132, i1 %122, i1 false
%134 = select i1 %133, i1 %121, i1 false
br i1 %134, label %135, label %152
135: ; preds = %120
%136 = icmp eq i32 %117, 1
%137 = select i1 %114, i1 %136, i1 false
%138 = select i1 %137, i1 true, i1 %23
%139 = select i1 %137, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @str.14, i64 0, i64 0), i8* getelementptr inbounds ([7 x i8], [7 x i8]* @str.13, i64 0, i64 0)
%140 = select i1 %137, i32 8, i32 5
%141 = select i1 %138, i1 true, i1 %118
%142 = select i1 %138, i8* %139, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @str.12, i64 0, i64 0)
%143 = select i1 %138, i32 %140, i32 4
%144 = select i1 %141, i1 true, i1 %114
%145 = select i1 %141, i8* %142, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @str.11, i64 0, i64 0)
%146 = select i1 %141, i32 %143, i32 3
br i1 %144, label %152, label %147
147: ; preds = %135
%148 = icmp eq i32 %117, 2
br i1 %148, label %152, label %149
149: ; preds = %147
%150 = select i1 %136, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @str.9, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @str, i64 0, i64 0)
%151 = zext i1 %136 to i32
br label %152
152: ; preds = %135, %149, %147, %120, %39
%153 = phi i8* [ getelementptr inbounds ([16 x i8], [16 x i8]* @str.16, i64 0, i64 0), %39 ], [ getelementptr inbounds ([16 x i8], [16 x i8]* @str.15, i64 0, i64 0), %120 ], [ %145, %135 ], [ getelementptr inbounds ([11 x i8], [11 x i8]* @str.10, i64 0, i64 0), %147 ], [ %150, %149 ]
%154 = phi i32 [ 20, %39 ], [ 10, %120 ], [ %146, %135 ], [ 2, %147 ], [ %151, %149 ]
%155 = tail call i32 @puts(i8* dereferenceable(1) %153)
ret i32 %154
}