#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__ Hypergeom(int, int, int, int);
float TableProb(int t11, int t12, int t21, int t22) {
  double Sum = 0.0;
  int A, B, r, a, k, a0;
  if (t11 + t12 > t21 + t22) {
    A = t11 + t12;
    B = t21 + t22;
    if (t11 * (t21 + t22) > t21 * (t11 + t12)) {
      a0 = t11;
      r = t11 + t21;
    } else {
      a0 = t12;
      r = t12 + t22;
    }
  } else {
    A = t21 + t22;
    B = t11 + t12;
    if (t21 * (t11 + t12) > t11 * (t21 + t22)) {
      a0 = t21;
      r = t21 + t11;
    } else {
      a0 = t22;
      r = t22 + t12;
    }
  }
  k = ((r) < (A) ? r : A);
  for (a = a0; a <= k; ++a) {
    Sum += Hypergeom(a, r, A, B);
  }
  return Sum;
}


x86 assembly (clang, -O0):
<TableProb>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x4(%rbp),%eax
add    -0x8(%rbp),%eax
mov    -0xc(%rbp),%ecx
add    -0x10(%rbp),%ecx
cmp    %ecx,%eax
jle    119a <TableProb+0x8a>
mov    -0x4(%rbp),%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0xc(%rbp),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x4(%rbp),%eax
mov    -0xc(%rbp),%ecx
add    -0x10(%rbp),%ecx
imul   %ecx,%eax
mov    -0xc(%rbp),%ecx
mov    -0x4(%rbp),%edx
add    -0x8(%rbp),%edx
imul   %edx,%ecx
cmp    %ecx,%eax
jle    1186 <TableProb+0x76>
mov    -0x4(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x4(%rbp),%eax
add    -0xc(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    1195 <TableProb+0x85>
mov    -0x8(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    11f4 <TableProb+0xe4>
mov    -0xc(%rbp),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x4(%rbp),%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0xc(%rbp),%eax
mov    -0x4(%rbp),%ecx
add    -0x8(%rbp),%ecx
imul   %ecx,%eax
mov    -0x4(%rbp),%ecx
mov    -0xc(%rbp),%edx
add    -0x10(%rbp),%edx
imul   %edx,%ecx
cmp    %ecx,%eax
jle    11e0 <TableProb+0xd0>
mov    -0xc(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0xc(%rbp),%eax
add    -0x4(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    11ef <TableProb+0xdf>
mov    -0x10(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x10(%rbp),%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    11f4 <TableProb+0xe4>
mov    -0x24(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    120b <TableProb+0xfb>
mov    -0x24(%rbp),%eax
mov    %eax,-0x34(%rbp)
jmp    1211 <TableProb+0x101>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jg     1257 <TableProb+0x147>
mov    -0x28(%rbp),%edi
mov    -0x24(%rbp),%esi
mov    -0x1c(%rbp),%edx
mov    -0x20(%rbp),%ecx
call   1030 <Hypergeom@plt>
cvtsi2sd %rax,%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    121d <TableProb+0x10d>
movsd  -0x18(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<TableProb>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x10,%rsp
mov    %edi,%ebx
lea    (%rsi,%rbx,1),%ebp
lea    (%rcx,%rdx,1),%r14d
cmp    %r14d,%ebp
jle    1143 <TableProb+0x33>
mov    %r14d,%edi
imul   %ebx,%edi
mov    %ebp,%eax
imul   %edx,%eax
cmp    %eax,%edi
jle    1161 <TableProb+0x51>
add    %ebx,%edx
mov    %ebp,%r15d
mov    %edx,%r12d
jmp    117a <TableProb+0x6a>
mov    %ebp,%eax
imul   %edx,%eax
mov    %r14d,%edi
imul   %ebx,%edi
cmp    %edi,%eax
jle    116d <TableProb+0x5d>
add    %edx,%ebx
mov    %r14d,%r15d
mov    %ebp,%r14d
mov    %ebx,%r12d
mov    %edx,%ebx
jmp    117a <TableProb+0x6a>
add    %esi,%ecx
mov    %ebp,%r15d
mov    %ecx,%r12d
mov    %esi,%ebx
jmp    117a <TableProb+0x6a>
add    %ecx,%esi
mov    %r14d,%r15d
mov    %ebp,%r14d
mov    %esi,%r12d
mov    %ecx,%ebx
cmp    %r15d,%r12d
mov    %r15d,%ebp
cmovl  %r12d,%ebp
xorps  %xmm0,%xmm0
cmp    %ebp,%ebx
jg     11df <TableProb+0xcf>
add    $0x1,%ebp
xorps  %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  %xmm0,0x8(%rsp)
mov    %ebx,%edi
mov    %r12d,%esi
mov    %r15d,%edx
mov    %r14d,%ecx
call   1030 <Hypergeom@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
movsd  0x8(%rsp),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rsp)
movsd  0x8(%rsp),%xmm0
add    $0x1,%ebx
cmp    %ebx,%ebp
jne    11a0 <TableProb+0x90>
cvtsd2ss %xmm0,%xmm0
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define float @TableProb(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca double
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
store i32 %0, i32* %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i32 %3, i32* %8
store double 0.000000e+00, double* %9
%16 = load i32, i32* %5
%17 = load i32, i32* %6
%18 = add nsw i32 %16, %17
%19 = load i32, i32* %7
%20 = load i32, i32* %8
%21 = add nsw i32 %19, %20
%22 = icmp sgt i32 %18, %21
br i1 %22, label %23, label %52
23: ; preds = %4
%24 = load i32, i32* %5
%25 = load i32, i32* %6
%26 = add nsw i32 %24, %25
store i32 %26, i32* %10
%27 = load i32, i32* %7
%28 = load i32, i32* %8
%29 = add nsw i32 %27, %28
store i32 %29, i32* %11
%30 = load i32, i32* %5
%31 = load i32, i32* %7
%32 = load i32, i32* %8
%33 = add nsw i32 %31, %32
%34 = mul nsw i32 %30, %33
%35 = load i32, i32* %7
%36 = load i32, i32* %5
%37 = load i32, i32* %6
%38 = add nsw i32 %36, %37
%39 = mul nsw i32 %35, %38
%40 = icmp sgt i32 %34, %39
br i1 %40, label %41, label %46
41: ; preds = %23
%42 = load i32, i32* %5
store i32 %42, i32* %15
%43 = load i32, i32* %5
%44 = load i32, i32* %7
%45 = add nsw i32 %43, %44
store i32 %45, i32* %12
br label %51
46: ; preds = %23
%47 = load i32, i32* %6
store i32 %47, i32* %15
%48 = load i32, i32* %6
%49 = load i32, i32* %8
%50 = add nsw i32 %48, %49
store i32 %50, i32* %12
br label %51
51: ; preds = %46, %41
br label %81
52: ; preds = %4
%53 = load i32, i32* %7
%54 = load i32, i32* %8
%55 = add nsw i32 %53, %54
store i32 %55, i32* %10
%56 = load i32, i32* %5
%57 = load i32, i32* %6
%58 = add nsw i32 %56, %57
store i32 %58, i32* %11
%59 = load i32, i32* %7
%60 = load i32, i32* %5
%61 = load i32, i32* %6
%62 = add nsw i32 %60, %61
%63 = mul nsw i32 %59, %62
%64 = load i32, i32* %5
%65 = load i32, i32* %7
%66 = load i32, i32* %8
%67 = add nsw i32 %65, %66
%68 = mul nsw i32 %64, %67
%69 = icmp sgt i32 %63, %68
br i1 %69, label %70, label %75
70: ; preds = %52
%71 = load i32, i32* %7
store i32 %71, i32* %15
%72 = load i32, i32* %7
%73 = load i32, i32* %5
%74 = add nsw i32 %72, %73
store i32 %74, i32* %12
br label %80
75: ; preds = %52
%76 = load i32, i32* %8
store i32 %76, i32* %15
%77 = load i32, i32* %8
%78 = load i32, i32* %6
%79 = add nsw i32 %77, %78
store i32 %79, i32* %12
br label %80
80: ; preds = %75, %70
br label %81
81: ; preds = %80, %51
%82 = load i32, i32* %12
%83 = load i32, i32* %10
%84 = icmp slt i32 %82, %83
br i1 %84, label %85, label %87
85: ; preds = %81
%86 = load i32, i32* %12
br label %89
87: ; preds = %81
%88 = load i32, i32* %10
br label %89
89: ; preds = %87, %85
%90 = phi i32 [ %86, %85 ], [ %88, %87 ]
store i32 %90, i32* %14
%91 = load i32, i32* %15
store i32 %91, i32* %13
br label %92
92: ; preds = %105, %89
%93 = load i32, i32* %13
%94 = load i32, i32* %14
%95 = icmp sle i32 %93, %94
br i1 %95, label %96, label %108
96: ; preds = %92
%97 = load i32, i32* %13
%98 = load i32, i32* %12
%99 = load i32, i32* %10
%100 = load i32, i32* %11
%101 = call i64 @Hypergeom(i32 %97, i32 %98, i32 %99, i32 %100)
%102 = sitofp i64 %101 to double
%103 = load double, double* %9
%104 = fadd double %103, %102
store double %104, double* %9
br label %105
105: ; preds = %96
%106 = load i32, i32* %13
%107 = add nsw i32 %106, 1
store i32 %107, i32* %13
br label %92
108: ; preds = %92
%109 = load double, double* %9
%110 = fptrunc double %109 to float
ret float %110
}

LLVM IR (-O2):
define float @TableProb(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = add nsw i32 %1, %0
%6 = add nsw i32 %3, %2
%7 = icmp sgt i32 %5, %6
br i1 %7, label %8, label %16
8: ; preds = %4
%9 = mul nsw i32 %6, %0
%10 = mul nsw i32 %5, %2
%11 = icmp sgt i32 %9, %10
br i1 %11, label %12, label %14
12: ; preds = %8
%13 = add nsw i32 %2, %0
br label %24
14: ; preds = %8
%15 = add nsw i32 %3, %1
br label %24
16: ; preds = %4
%17 = mul nsw i32 %5, %2
%18 = mul nsw i32 %6, %0
%19 = icmp sgt i32 %17, %18
br i1 %19, label %20, label %22
20: ; preds = %16
%21 = add nsw i32 %2, %0
br label %24
22: ; preds = %16
%23 = add nsw i32 %3, %1
br label %24
24: ; preds = %20, %22, %12, %14
%25 = phi i32 [ %5, %12 ], [ %5, %14 ], [ %6, %20 ], [ %6, %22 ]
%26 = phi i32 [ %6, %12 ], [ %6, %14 ], [ %5, %20 ], [ %5, %22 ]
%27 = phi i32 [ %13, %12 ], [ %15, %14 ], [ %21, %20 ], [ %23, %22 ]
%28 = phi i32 [ %0, %12 ], [ %1, %14 ], [ %2, %20 ], [ %3, %22 ]
%29 = icmp slt i32 %27, %25
%30 = select i1 %29, i32 %27, i32 %25
%31 = icmp sgt i32 %28, %30
br i1 %31, label %42, label %32
32: ; preds = %24, %32
%33 = phi double [ %37, %32 ], [ 0.000000e+00, %24 ]
%34 = phi i32 [ %38, %32 ], [ %28, %24 ]
%35 = tail call i64 @Hypergeom(i32 %34, i32 %27, i32 %25, i32 %26)
%36 = sitofp i64 %35 to double
%37 = fadd double %33, %36
%38 = add i32 %34, 1
%39 = icmp eq i32 %34, %30
br i1 %39, label %40, label %32
40: ; preds = %32
%41 = fptrunc double %37 to float
br label %42
42: ; preds = %40, %24
%43 = phi float [ 0.000000e+00, %24 ], [ %41, %40 ]
ret float %43
}