#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 max(double, int);
double analyze_hand(int hand[4][16]) {
  int i, j, consecutive = 0, full, same_type;
  double value = 0.0, extra = 0;
  int cards_number[16] = {0};
  for (i = 0; i < 4; i++) {
    same_type = 0;
    for (j = 0; j < 16; j++) {
      if (hand[i][j] == 1) {
        cards_number[j] += 1;
        consecutive = 0;
        while (j < 16 && hand[i][j] == 1) {
          consecutive++;
          j++;
        }
        if (consecutive == 5) {
          if (j - 1 == 13)
            value = max(value, 10 * 100 + 13);
          else
            value = max(value, 9 * 100 + j - 1);
        }
        same_type += consecutive;
        if (same_type == 5) {
          value = max(value, 6 * 100 + j - 1);
        }
        value = max(value, 100 + j);
        extra += (j * 1.0) / 1000;
      }
    }
  }
  full = 0;
  for (i = 0; i < 16; i++) {
    if (cards_number[i] == 2) {
      for (j = 0; j < 16; j++) {
        if (cards_number[j] == 3) {
          if (value < (7 * 100 + j)) {
            value = max(value, (7 * 100 + j));
            full = 1;
          }
        } else if (cards_number[j] == 2 && i != j) {
          value = max(value, (3 * 100 + max(i, j)));
          full = 1;
        }
      }
      if (!full) {
        value = max(value, 3 * 100 + i);
      }
    } else if (cards_number[i] == 3) {
      value = max(value, 4 * 100 + i);
    }
  }
  return value + extra;
}


x86 assembly (clang, -O0):
<analyze_hand>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0x14(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
lea    -0x70(%rbp),%rdi
xor    %esi,%esi
mov    $0x40,%edx
call   1040 <memset@plt>
movl   $0x0,-0xc(%rbp)
cmpl   $0x4,-0xc(%rbp)
jge    12f7 <analyze_hand+0x1d7>
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x10(%rbp)
cmpl   $0x10,-0x10(%rbp)
jge    12e4 <analyze_hand+0x1c4>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
shl    $0x6,%rcx
add    %rcx,%rax
movslq -0x10(%rbp),%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    12d1 <analyze_hand+0x1b1>
movslq -0x10(%rbp),%rax
mov    -0x70(%rbp,%rax,4),%ecx
add    $0x1,%ecx
mov    %ecx,-0x70(%rbp,%rax,4)
movl   $0x0,-0x14(%rbp)
xor    %eax,%eax
cmpl   $0x10,-0x10(%rbp)
mov    %al,-0x71(%rbp)
jge    11de <analyze_hand+0xbe>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
shl    $0x6,%rcx
add    %rcx,%rax
movslq -0x10(%rbp),%rcx
cmpl   $0x1,(%rax,%rcx,4)
sete   %al
mov    %al,-0x71(%rbp)
mov    -0x71(%rbp),%al
test   $0x1,%al
jne    11ee <analyze_hand+0xce>
jmp    1205 <analyze_hand+0xe5>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    11b2 <analyze_hand+0x92>
cmpl   $0x5,-0x14(%rbp)
jne    125f <analyze_hand+0x13f>
mov    -0x10(%rbp),%eax
sub    $0x1,%eax
cmp    $0xd,%eax
jne    123b <analyze_hand+0x11b>
movsd  -0x28(%rbp),%xmm0
mov    $0x3f5,%edi
call   1030 <max@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    125a <analyze_hand+0x13a>
movsd  -0x28(%rbp),%xmm0
mov    -0x10(%rbp),%edi
add    $0x384,%edi
sub    $0x1,%edi
call   1030 <max@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    125f <analyze_hand+0x13f>
mov    -0x14(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x5,-0x1c(%rbp)
jne    1291 <analyze_hand+0x171>
movsd  -0x28(%rbp),%xmm0
mov    -0x10(%rbp),%edi
add    $0x258,%edi
sub    $0x1,%edi
call   1030 <max@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
mov    -0x10(%rbp),%edi
add    $0x64,%edi
call   1030 <max@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x28(%rbp)
cvtsi2sdl -0x10(%rbp),%xmm0
movsd  0xd51(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd3d(%rip),%xmm1
divsd  %xmm1,%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    12d6 <analyze_hand+0x1b6>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1175 <analyze_hand+0x55>
jmp    12e9 <analyze_hand+0x1c9>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    115d <analyze_hand+0x3d>
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x10,-0xc(%rbp)
jge    145b <analyze_hand+0x33b>
movslq -0xc(%rbp),%rax
cmpl   $0x2,-0x70(%rbp,%rax,4)
jne    1418 <analyze_hand+0x2f8>
movl   $0x0,-0x10(%rbp)
cmpl   $0x10,-0x10(%rbp)
jge    13ed <analyze_hand+0x2cd>
movslq -0x10(%rbp),%rax
cmpl   $0x3,-0x70(%rbp,%rax,4)
jne    1381 <analyze_hand+0x261>
movsd  -0x28(%rbp),%xmm1
mov    -0x10(%rbp),%eax
add    $0x2bc,%eax
cvtsi2sd %eax,%xmm0
ucomisd %xmm1,%xmm0
jbe    137c <analyze_hand+0x25c>
movsd  -0x28(%rbp),%xmm0
mov    -0x10(%rbp),%edi
add    $0x2bc,%edi
call   1030 <max@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x1,-0x18(%rbp)
jmp    13da <analyze_hand+0x2ba>
movslq -0x10(%rbp),%rax
cmpl   $0x2,-0x70(%rbp,%rax,4)
jne    13d5 <analyze_hand+0x2b5>
mov    -0xc(%rbp),%eax
cmp    -0x10(%rbp),%eax
je     13d5 <analyze_hand+0x2b5>
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
cvtsi2sdl -0xc(%rbp),%xmm0
mov    -0x10(%rbp),%edi
call   1030 <max@plt>
movsd  -0x80(%rbp),%xmm0
mov    %eax,%edi
add    $0x12c,%edi
call   1030 <max@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x1,-0x18(%rbp)
jmp    13da <analyze_hand+0x2ba>
jmp    13df <analyze_hand+0x2bf>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1325 <analyze_hand+0x205>
cmpl   $0x0,-0x18(%rbp)
jne    1413 <analyze_hand+0x2f3>
movsd  -0x28(%rbp),%xmm0
mov    -0xc(%rbp),%edi
add    $0x12c,%edi
call   1030 <max@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    1448 <analyze_hand+0x328>
movslq -0xc(%rbp),%rax
cmpl   $0x3,-0x70(%rbp,%rax,4)
jne    1443 <analyze_hand+0x323>
movsd  -0x28(%rbp),%xmm0
mov    -0xc(%rbp),%edi
add    $0x190,%edi
call   1030 <max@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    1448 <analyze_hand+0x328>
jmp    144d <analyze_hand+0x32d>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1305 <analyze_hand+0x1e5>
movsd  -0x28(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<analyze_hand>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x68,%rsp
mov    %rdi,%r15
xorpd  %xmm0,%xmm0
movapd %xmm0,0x50(%rsp)
movapd %xmm0,0x40(%rsp)
movapd %xmm0,0x30(%rsp)
movapd %xmm0,0x20(%rsp)
lea    0x4(%rdi),%r14
xorpd  %xmm0,%xmm0
movsd  %xmm0,0x8(%rsp)
xor    %r12d,%r12d
xorpd  %xmm2,%xmm2
jmp    1172 <analyze_hand+0x62>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%r12
add    $0x40,%r14
cmp    $0x4,%r12
je     1280 <analyze_hand+0x170>
xor    %r13d,%r13d
xor    %ebx,%ebx
jmp    11bf <analyze_hand+0xaf>
nopl   0x0(%rax)
lea    0x64(%rbx),%edi
movapd %xmm2,%xmm0
call   1030 <max@plt>
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
xorps  %xmm0,%xmm0
cvtsi2sd %ebx,%xmm0
divsd  0xe5e(%rip),%xmm0
movsd  0x8(%rsp),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rsp)
mov    %ebp,%r13d
lea    0x1(%rbx),%eax
cmp    $0xf,%ebx
mov    %eax,%ebx
jge    1160 <analyze_hand+0x50>
movslq %ebx,%rcx
mov    %r12,%rax
shl    $0x6,%rax
add    %r15,%rax
cmpl   $0x1,(%rax,%rcx,4)
jne    11b5 <analyze_hand+0xa5>
addl   $0x1,0x20(%rsp,%rcx,4)
mov    %ecx,%eax
mov    $0x10,%ebp
sub    %ecx,%ebp
lea    (%r14,%rcx,4),%rdx
mov    $0xf,%esi
sub    %rcx,%rsi
xor    %edi,%edi
xchg   %ax,%ax
cmp    %rdi,%rsi
je     1230 <analyze_hand+0x120>
lea    0x1(%rdi),%rcx
cmpl   $0x1,(%rdx,%rdi,4)
mov    %rcx,%rdi
je     11f0 <analyze_hand+0xe0>
lea    (%rax,%rcx,1),%rbx
cmp    $0x5,%ecx
jne    1257 <analyze_hand+0x147>
add    %rcx,%rax
add    $0xfffffffffffffff2,%rax
test   %eax,%eax
jne    123a <analyze_hand+0x12a>
mov    $0xe,%ebx
mov    $0x3f5,%edi
jmp    1240 <analyze_hand+0x130>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    $0x10,%ebx
cmp    $0xb,%eax
jne    1259 <analyze_hand+0x149>
lea    0x383(%rbx),%edi
movapd %xmm2,%xmm0
call   1030 <max@plt>
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
mov    $0x5,%ebp
jmp    1259 <analyze_hand+0x149>
mov    %ecx,%ebp
add    %r13d,%ebp
cmp    $0x5,%ebp
jne    1180 <analyze_hand+0x70>
lea    0x257(%rbx),%edi
movapd %xmm2,%xmm0
call   1030 <max@plt>
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
jmp    1180 <analyze_hand+0x70>
xor    %r14d,%r14d
xor    %ebp,%ebp
jmp    12b7 <analyze_hand+0x1a7>
nopw   0x0(%rax,%rax,1)
mov    $0x190,%eax
lea    (%r14,%rax,1),%edi
movapd %xmm2,%xmm0
call   1030 <max@plt>
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
add    $0x1,%r14
cmp    $0x10,%r14
je     137a <analyze_hand+0x26a>
mov    0x20(%rsp,%r14,4),%eax
cmp    $0x3,%eax
je     1290 <analyze_hand+0x180>
cmp    $0x2,%eax
jne    12a9 <analyze_hand+0x199>
xorps  %xmm0,%xmm0
cvtsi2sd %r14d,%xmm0
movsd  %xmm0,0x10(%rsp)
xor    %ebx,%ebx
jmp    12ff <analyze_hand+0x1ef>
nopl   0x0(%rax,%rax,1)
movapd %xmm2,%xmm0
call   1030 <max@plt>
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
mov    $0x1,%ebp
add    $0x1,%rbx
cmp    $0x10,%rbx
je     1360 <analyze_hand+0x250>
mov    0x20(%rsp,%rbx,4),%eax
cmp    $0x2,%eax
je     1330 <analyze_hand+0x220>
cmp    $0x3,%eax
jne    12f5 <analyze_hand+0x1e5>
lea    0x2bc(%rbx),%rdi
xorps  %xmm0,%xmm0
cvtsi2sd %edi,%xmm0
ucomisd %xmm2,%xmm0
ja     12e0 <analyze_hand+0x1d0>
jmp    12f5 <analyze_hand+0x1e5>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cmp    %rbx,%r14
je     12f5 <analyze_hand+0x1e5>
movsd  0x10(%rsp),%xmm0
mov    %ebx,%edi
movsd  %xmm2,0x18(%rsp)
call   1030 <max@plt>
movsd  0x18(%rsp),%xmm2
mov    %eax,%edi
add    $0x12c,%edi
jmp    12e0 <analyze_hand+0x1d0>
nopl   0x0(%rax,%rax,1)
test   %ebp,%ebp
je     136e <analyze_hand+0x25e>
mov    $0x1,%ebp
jmp    12a9 <analyze_hand+0x199>
xor    %ebp,%ebp
mov    $0x12c,%eax
jmp    1295 <analyze_hand+0x185>
movsd  0x8(%rsp),%xmm0
addsd  %xmm2,%xmm0
add    $0x68,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define double @analyze_hand([16 x i32]* %0) {
%2 = alloca [16 x i32]*
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca double
%9 = alloca double
%10 = alloca [16 x i32]
store [16 x i32]* %0, [16 x i32]** %2
store i32 0, i32* %5
store double 0.000000e+00, double* %8
store double 0.000000e+00, double* %9
%11 = bitcast [16 x i32]* %10 to i8*
store i32 0, i32* %3
br label %12
12: ; preds = %104, %1
%13 = load i32, i32* %3
%14 = icmp slt i32 %13, 4
br i1 %14, label %15, label %107
15: ; preds = %12
store i32 0, i32* %7
store i32 0, i32* %4
br label %16
16: ; preds = %100, %15
%17 = load i32, i32* %4
%18 = icmp slt i32 %17, 16
br i1 %18, label %19, label %103
19: ; preds = %16
%20 = load [16 x i32]*, [16 x i32]** %2
%21 = load i32, i32* %3
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds [16 x i32], [16 x i32]* %20, i64 %22
%24 = load i32, i32* %4
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds [16 x i32], [16 x i32]* %23, i64 0, i64 %25
%27 = load i32, i32* %26
%28 = icmp eq i32 %27, 1
br i1 %28, label %29, label %99
29: ; preds = %19
%30 = load i32, i32* %4
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds [16 x i32], [16 x i32]* %10, i64 0, i64 %31
%33 = load i32, i32* %32
%34 = add nsw i32 %33, 1
store i32 %34, i32* %32
store i32 0, i32* %5
br label %35
35: ; preds = %50, %29
%36 = load i32, i32* %4
%37 = icmp slt i32 %36, 16
br i1 %37, label %38, label %48
38: ; preds = %35
%39 = load [16 x i32]*, [16 x i32]** %2
%40 = load i32, i32* %3
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds [16 x i32], [16 x i32]* %39, i64 %41
%43 = load i32, i32* %4
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds [16 x i32], [16 x i32]* %42, i64 0, i64 %44
%46 = load i32, i32* %45
%47 = icmp eq i32 %46, 1
br label %48
48: ; preds = %38, %35
%49 = phi i1 [ false, %35 ], [ %47, %38 ]
br i1 %49, label %50, label %55
50: ; preds = %48
%51 = load i32, i32* %5
%52 = add nsw i32 %51, 1
store i32 %52, i32* %5
%53 = load i32, i32* %4
%54 = add nsw i32 %53, 1
store i32 %54, i32* %4
br label %35
55: ; preds = %48
%56 = load i32, i32* %5
%57 = icmp eq i32 %56, 5
br i1 %57, label %58, label %74
58: ; preds = %55
%59 = load i32, i32* %4
%60 = sub nsw i32 %59, 1
%61 = icmp eq i32 %60, 13
br i1 %61, label %62, label %66
62: ; preds = %58
%63 = load double, double* %8
%64 = call i32 @max(double %63, i32 1013)
%65 = sitofp i32 %64 to double
store double %65, double* %8
br label %73
66: ; preds = %58
%67 = load double, double* %8
%68 = load i32, i32* %4
%69 = add nsw i32 900, %68
%70 = sub nsw i32 %69, 1
%71 = call i32 @max(double %67, i32 %70)
%72 = sitofp i32 %71 to double
store double %72, double* %8
br label %73
73: ; preds = %66, %62
br label %74
74: ; preds = %73, %55
%75 = load i32, i32* %5
%76 = load i32, i32* %7
%77 = add nsw i32 %76, %75
store i32 %77, i32* %7
%78 = load i32, i32* %7
%79 = icmp eq i32 %78, 5
br i1 %79, label %80, label %87
80: ; preds = %74
%81 = load double, double* %8
%82 = load i32, i32* %4
%83 = add nsw i32 600, %82
%84 = sub nsw i32 %83, 1
%85 = call i32 @max(double %81, i32 %84)
%86 = sitofp i32 %85 to double
store double %86, double* %8
br label %87
87: ; preds = %80, %74
%88 = load double, double* %8
%89 = load i32, i32* %4
%90 = add nsw i32 100, %89
%91 = call i32 @max(double %88, i32 %90)
%92 = sitofp i32 %91 to double
store double %92, double* %8
%93 = load i32, i32* %4
%94 = sitofp i32 %93 to double
%95 = fmul double %94, 1.000000e+00
%96 = fdiv double %95, 1.000000e+03
%97 = load double, double* %9
%98 = fadd double %97, %96
store double %98, double* %9
br label %99
99: ; preds = %87, %19
br label %100
100: ; preds = %99
%101 = load i32, i32* %4
%102 = add nsw i32 %101, 1
store i32 %102, i32* %4
br label %16
103: ; preds = %16
br label %104
104: ; preds = %103
%105 = load i32, i32* %3
%106 = add nsw i32 %105, 1
store i32 %106, i32* %3
br label %12
107: ; preds = %12
store i32 0, i32* %6
store i32 0, i32* %3
br label %108
108: ; preds = %188, %107
%109 = load i32, i32* %3
%110 = icmp slt i32 %109, 16
br i1 %110, label %111, label %191
111: ; preds = %108
%112 = load i32, i32* %3
%113 = sext i32 %112 to i64
%114 = getelementptr inbounds [16 x i32], [16 x i32]* %10, i64 0, i64 %113
%115 = load i32, i32* %114
%116 = icmp eq i32 %115, 2
br i1 %116, label %117, label %174
117: ; preds = %111
store i32 0, i32* %4
br label %118
118: ; preds = %161, %117
%119 = load i32, i32* %4
%120 = icmp slt i32 %119, 16
br i1 %120, label %121, label %164
121: ; preds = %118
%122 = load i32, i32* %4
%123 = sext i32 %122 to i64
%124 = getelementptr inbounds [16 x i32], [16 x i32]* %10, i64 0, i64 %123
%125 = load i32, i32* %124
%126 = icmp eq i32 %125, 3
br i1 %126, label %127, label %140
127: ; preds = %121
%128 = load double, double* %8
%129 = load i32, i32* %4
%130 = add nsw i32 700, %129
%131 = sitofp i32 %130 to double
%132 = fcmp olt double %128, %131
br i1 %132, label %133, label %139
133: ; preds = %127
%134 = load double, double* %8
%135 = load i32, i32* %4
%136 = add nsw i32 700, %135
%137 = call i32 @max(double %134, i32 %136)
%138 = sitofp i32 %137 to double
store double %138, double* %8
store i32 1, i32* %6
br label %139
139: ; preds = %133, %127
br label %160
140: ; preds = %121
%141 = load i32, i32* %4
%142 = sext i32 %141 to i64
%143 = getelementptr inbounds [16 x i32], [16 x i32]* %10, i64 0, i64 %142
%144 = load i32, i32* %143
%145 = icmp eq i32 %144, 2
br i1 %145, label %146, label %159
146: ; preds = %140
%147 = load i32, i32* %3
%148 = load i32, i32* %4
%149 = icmp ne i32 %147, %148
br i1 %149, label %150, label %159
150: ; preds = %146
%151 = load double, double* %8
%152 = load i32, i32* %3
%153 = sitofp i32 %152 to double
%154 = load i32, i32* %4
%155 = call i32 @max(double %153, i32 %154)
%156 = add nsw i32 300, %155
%157 = call i32 @max(double %151, i32 %156)
%158 = sitofp i32 %157 to double
store double %158, double* %8
store i32 1, i32* %6
br label %159
159: ; preds = %150, %146, %140
br label %160
160: ; preds = %159, %139
br label %161
161: ; preds = %160
%162 = load i32, i32* %4
%163 = add nsw i32 %162, 1
store i32 %163, i32* %4
br label %118
164: ; preds = %118
%165 = load i32, i32* %6
%166 = icmp ne i32 %165, 0
br i1 %166, label %173, label %167
167: ; preds = %164
%168 = load double, double* %8
%169 = load i32, i32* %3
%170 = add nsw i32 300, %169
%171 = call i32 @max(double %168, i32 %170)
%172 = sitofp i32 %171 to double
store double %172, double* %8
br label %173
173: ; preds = %167, %164
br label %187
174: ; preds = %111
%175 = load i32, i32* %3
%176 = sext i32 %175 to i64
%177 = getelementptr inbounds [16 x i32], [16 x i32]* %10, i64 0, i64 %176
%178 = load i32, i32* %177
%179 = icmp eq i32 %178, 3
br i1 %179, label %180, label %186
180: ; preds = %174
%181 = load double, double* %8
%182 = load i32, i32* %3
%183 = add nsw i32 400, %182
%184 = call i32 @max(double %181, i32 %183)
%185 = sitofp i32 %184 to double
store double %185, double* %8
br label %186
186: ; preds = %180, %174
br label %187
187: ; preds = %186, %173
br label %188
188: ; preds = %187
%189 = load i32, i32* %3
%190 = add nsw i32 %189, 1
store i32 %190, i32* %3
br label %108
191: ; preds = %108
%192 = load double, double* %8
%193 = load double, double* %9
%194 = fadd double %192, %193
ret double %194
}

LLVM IR (-O2):
define double @analyze_hand([16 x i32]* nocapture %0) {
%2 = alloca [16 x i32]
%3 = bitcast [16 x i32]* %2 to i8*
br label %4
4: ; preds = %1, %72
%5 = phi i64 [ 0, %1 ], [ %73, %72 ]
%6 = phi double [ 0.000000e+00, %1 ], [ %69, %72 ]
%7 = phi double [ 0.000000e+00, %1 ], [ %68, %72 ]
br label %8
8: ; preds = %4, %65
%9 = phi double [ %6, %4 ], [ %69, %65 ]
%10 = phi double [ %7, %4 ], [ %68, %65 ]
%11 = phi i32 [ 0, %4 ], [ %67, %65 ]
%12 = phi i32 [ 0, %4 ], [ %70, %65 ]
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds [16 x i32], [16 x i32]* %0, i64 %5, i64 %13
%15 = load i32, i32* %14
%16 = icmp eq i32 %15, 1
br i1 %16, label %17, label %65
17: ; preds = %8
%18 = getelementptr inbounds [16 x i32], [16 x i32]* %2, i64 0, i64 %13
%19 = load i32, i32* %18
%20 = add nsw i32 %19, 1
store i32 %20, i32* %18
%21 = sub i32 16, %12
br label %22
22: ; preds = %17, %27
%23 = phi i32 [ 0, %17 ], [ %28, %27 ]
%24 = phi i64 [ %13, %17 ], [ %25, %27 ]
%25 = add nsw i64 %24, 1
%26 = icmp eq i64 %25, 16
br i1 %26, label %35, label %27
27: ; preds = %22
%28 = add nuw nsw i32 %23, 1
%29 = getelementptr inbounds [16 x i32], [16 x i32]* %0, i64 %5, i64 %25
%30 = load i32, i32* %29
%31 = icmp eq i32 %30, 1
br i1 %31, label %22, label %32
32: ; preds = %27
%33 = trunc i64 %25 to i32
%34 = icmp eq i32 %28, 5
br i1 %34, label %37, label %47
35: ; preds = %22
%36 = icmp eq i32 %12, 11
br i1 %36, label %39, label %47
37: ; preds = %32
%38 = icmp eq i32 %33, 14
br i1 %38, label %42, label %39
39: ; preds = %35, %37
%40 = phi i32 [ 16, %35 ], [ %33, %37 ]
%41 = add nsw i32 %40, 899
br label %42
42: ; preds = %37, %39
%43 = phi i32 [ %41, %39 ], [ 1013, %37 ]
%44 = phi i32 [ %40, %39 ], [ 14, %37 ]
%45 = tail call i32 @max(double %10, i32 %43)
%46 = sitofp i32 %45 to double
br label %47
47: ; preds = %42, %35, %32
%48 = phi i32 [ %33, %32 ], [ 16, %35 ], [ %44, %42 ]
%49 = phi i32 [ %28, %32 ], [ %21, %35 ], [ 5, %42 ]
%50 = phi double [ %10, %32 ], [ %10, %35 ], [ %46, %42 ]
%51 = add nsw i32 %49, %11
%52 = icmp eq i32 %51, 5
br i1 %52, label %53, label %57
53: ; preds = %47
%54 = add nsw i32 %48, 599
%55 = tail call i32 @max(double %50, i32 %54)
%56 = sitofp i32 %55 to double
br label %57
57: ; preds = %53, %47
%58 = phi double [ %56, %53 ], [ %50, %47 ]
%59 = add nsw i32 %48, 100
%60 = tail call i32 @max(double %58, i32 %59)
%61 = sitofp i32 %60 to double
%62 = sitofp i32 %48 to double
%63 = fdiv double %62, 1.000000e+03
%64 = fadd double %9, %63
br label %65
65: ; preds = %8, %57
%66 = phi i32 [ %48, %57 ], [ %12, %8 ]
%67 = phi i32 [ %51, %57 ], [ %11, %8 ]
%68 = phi double [ %61, %57 ], [ %10, %8 ]
%69 = phi double [ %64, %57 ], [ %9, %8 ]
%70 = add nsw i32 %66, 1
%71 = icmp slt i32 %66, 15
br i1 %71, label %8, label %72
72: ; preds = %65
%73 = add nuw nsw i64 %5, 1
%74 = icmp eq i64 %73, 4
br i1 %74, label %75, label %4
75: ; preds = %72, %120
%76 = phi i64 [ %123, %120 ], [ 0, %72 ]
%77 = phi double [ %122, %120 ], [ %68, %72 ]
%78 = phi i32 [ %121, %120 ], [ 0, %72 ]
%79 = getelementptr inbounds [16 x i32], [16 x i32]* %2, i64 0, i64 %76
%80 = load i32, i32* %79
switch i32 %80, label %120 [
i32 2, label %81
i32 3, label %112
]
81: ; preds = %75
%82 = trunc i64 %76 to i32
%83 = sitofp i32 %82 to double
br label %84
84: ; preds = %81, %105
%85 = phi i64 [ 0, %81 ], [ %108, %105 ]
%86 = phi double [ %77, %81 ], [ %107, %105 ]
%87 = phi i32 [ %78, %81 ], [ %106, %105 ]
%88 = getelementptr inbounds [16 x i32], [16 x i32]* %2, i64 0, i64 %85
%89 = load i32, i32* %88
switch i32 %89, label %105 [
i32 3, label %90
i32 2, label %95
]
90: ; preds = %84
%91 = trunc i64 %85 to i32
%92 = add i32 %91, 700
%93 = sitofp i32 %92 to double
%94 = fcmp olt double %86, %93
br i1 %94, label %101, label %105
95: ; preds = %84
%96 = icmp eq i64 %76, %85
br i1 %96, label %105, label %97
97: ; preds = %95
%98 = trunc i64 %85 to i32
%99 = tail call i32 @max(double %83, i32 %98)
%100 = add nsw i32 %99, 300
br label %101
101: ; preds = %90, %97
%102 = phi i32 [ %100, %97 ], [ %92, %90 ]
%103 = tail call i32 @max(double %86, i32 %102)
%104 = sitofp i32 %103 to double
br label %105
105: ; preds = %101, %84, %90, %95
%106 = phi i32 [ %87, %90 ], [ %87, %95 ], [ %87, %84 ], [ 1, %101 ]
%107 = phi double [ %86, %90 ], [ %86, %95 ], [ %86, %84 ], [ %104, %101 ]
%108 = add nuw nsw i64 %85, 1
%109 = icmp eq i64 %108, 16
br i1 %109, label %110, label %84
110: ; preds = %105
%111 = icmp eq i32 %106, 0
br i1 %111, label %112, label %120
112: ; preds = %75, %110
%113 = phi i32 [ 300, %110 ], [ 400, %75 ]
%114 = phi double [ %107, %110 ], [ %77, %75 ]
%115 = phi i32 [ 0, %110 ], [ %78, %75 ]
%116 = trunc i64 %76 to i32
%117 = add i32 %113, %116
%118 = tail call i32 @max(double %114, i32 %117)
%119 = sitofp i32 %118 to double
br label %120
120: ; preds = %112, %75, %110
%121 = phi i32 [ 1, %110 ], [ %78, %75 ], [ %115, %112 ]
%122 = phi double [ %107, %110 ], [ %77, %75 ], [ %119, %112 ]
%123 = add nuw nsw i64 %76, 1
%124 = icmp eq i64 %123, 16
br i1 %124, label %125, label %75
125: ; preds = %120
%126 = fadd double %69, %122
ret double %126
}