#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 rand();
int GeneticSelection(int numranks, float *rankings) {
  float sum;
  int i, index;
  sum = 0;
  for (i = 0; i < numranks; i++) {
    if (rankings[i] < 0)
      continue;
    sum += rankings[i];
  }
  if (sum > 0) {
    for (i = 0; i < numranks; i++) {
      if (rankings[i] < 0)
        continue;
      sum -= rankings[i];
      if (sum <= 0)
        return i;
    }
  }
  index = ((rand() & 0x7fff) / ((float)0x7fff)) * numranks;
  for (i = 0; i < numranks; i++) {
    if (rankings[index] >= 0)
      return index;
    index = (index + 1) % numranks;
  }
  return 0;
}


x86 assembly (clang, -O0):
<GeneticSelection>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1179 <GeneticSelection+0x69>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
xorps  %xmm0,%xmm0
ucomiss (%rax,%rcx,4),%xmm0
jbe    1154 <GeneticSelection+0x44>
jmp    116b <GeneticSelection+0x5b>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    112e <GeneticSelection+0x1e>
movss  -0x14(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    1202 <GeneticSelection+0xf2>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    11fd <GeneticSelection+0xed>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
xorps  %xmm0,%xmm0
ucomiss (%rax,%rcx,4),%xmm0
jbe    11b7 <GeneticSelection+0xa7>
jmp    11ef <GeneticSelection+0xdf>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
movss  -0x14(%rbp),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x14(%rbp),%xmm0
jb     11ea <GeneticSelection+0xda>
mov    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1287 <GeneticSelection+0x177>
jmp    11ef <GeneticSelection+0xdf>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1191 <GeneticSelection+0x81>
jmp    1202 <GeneticSelection+0xf2>
mov    $0x0,%al
call   1030 <rand@plt>
and    $0x7fff,%eax
cvtsi2ss %eax,%xmm0
movss  0xde6(%rip),%xmm1
divss  %xmm1,%xmm0
cvtsi2ssl -0x8(%rbp),%xmm1
mulss  %xmm1,%xmm0
cvttss2si %xmm0,%eax
mov    %eax,-0x1c(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1280 <GeneticSelection+0x170>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     1265 <GeneticSelection+0x155>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1287 <GeneticSelection+0x177>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
cltd
idivl  -0x8(%rbp)
mov    %edx,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1235 <GeneticSelection+0x125>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<GeneticSelection>:
push   %rbp
push   %r14
push   %rbx
test   %edi,%edi
jle    1139 <GeneticSelection+0x29>
mov    %rsi,%rbx
mov    %edi,%r14d
mov    %edi,%eax
lea    -0x1(%rax),%rdx
mov    %eax,%ecx
and    $0x3,%ecx
cmp    $0x3,%rdx
jae    1147 <GeneticSelection+0x37>
xorps  %xmm0,%xmm0
xor    %edx,%edx
jmp    11e0 <GeneticSelection+0xd0>
xor    %ebp,%ebp
xor    %eax,%eax
call   1030 <rand@plt>
jmp    12bf <GeneticSelection+0x1af>
mov    %eax,%esi
and    $0xfffffffc,%esi
xorps  %xmm1,%xmm1
xor    %edx,%edx
movss  0xea7(%rip),%xmm2
xorps  %xmm0,%xmm0
nopl   0x0(%rax)
movss  (%rbx,%rdx,4),%xmm3
movss  0x4(%rbx,%rdx,4),%xmm4
movaps %xmm3,%xmm5
cmpless %xmm1,%xmm5
movaps %xmm5,%xmm6
andnps %xmm3,%xmm6
andps  %xmm2,%xmm5
orps   %xmm6,%xmm5
addss  %xmm0,%xmm5
movaps %xmm4,%xmm0
cmpless %xmm1,%xmm0
movaps %xmm0,%xmm3
andnps %xmm4,%xmm3
andps  %xmm2,%xmm0
orps   %xmm3,%xmm0
addss  %xmm5,%xmm0
movss  0x8(%rbx,%rdx,4),%xmm3
movaps %xmm3,%xmm4
cmpless %xmm1,%xmm4
movaps %xmm4,%xmm5
andnps %xmm3,%xmm5
andps  %xmm2,%xmm4
orps   %xmm5,%xmm4
addss  %xmm0,%xmm4
movss  0xc(%rbx,%rdx,4),%xmm3
movaps %xmm3,%xmm0
cmpless %xmm1,%xmm0
movaps %xmm0,%xmm5
andnps %xmm3,%xmm5
andps  %xmm2,%xmm0
orps   %xmm5,%xmm0
addss  %xmm4,%xmm0
add    $0x4,%rdx
cmp    %rdx,%rsi
jne    1160 <GeneticSelection+0x50>
test   %rcx,%rcx
je     1226 <GeneticSelection+0x116>
lea    (%rbx,%rdx,4),%rdx
xor    %esi,%esi
xorps  %xmm1,%xmm1
movss  0xe0a(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
movss  (%rdx,%rsi,4),%xmm3
movaps %xmm3,%xmm4
cmpless %xmm1,%xmm4
movaps %xmm4,%xmm5
andnps %xmm3,%xmm5
andps  %xmm2,%xmm4
orps   %xmm5,%xmm4
addss  %xmm4,%xmm0
add    $0x1,%rsi
cmp    %rsi,%rcx
jne    1200 <GeneticSelection+0xf0>
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    125e <GeneticSelection+0x14e>
test   %r14d,%r14d
jle    125e <GeneticSelection+0x14e>
xor    %ebp,%ebp
xorps  %xmm1,%xmm1
jmp    1249 <GeneticSelection+0x139>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rbp
cmp    %rbp,%rax
je     125e <GeneticSelection+0x14e>
movss  (%rbx,%rbp,4),%xmm2
ucomiss %xmm2,%xmm1
ja     1240 <GeneticSelection+0x130>
subss  %xmm2,%xmm0
ucomiss %xmm0,%xmm1
jb     1240 <GeneticSelection+0x130>
jmp    12bf <GeneticSelection+0x1af>
xor    %ebp,%ebp
xor    %eax,%eax
call   1030 <rand@plt>
test   %r14d,%r14d
jle    12bf <GeneticSelection+0x1af>
and    $0x7fff,%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
divss  0xd84(%rip),%xmm0
xorps  %xmm1,%xmm1
cvtsi2ss %r14d,%xmm1
mulss  %xmm0,%xmm1
cvttss2si %xmm1,%edx
xorps  %xmm0,%xmm0
mov    %r14d,%ecx
cs nopw 0x0(%rax,%rax,1)
movslq %edx,%rax
movss  (%rbx,%rax,4),%xmm1
ucomiss %xmm0,%xmm1
jae    12bd <GeneticSelection+0x1ad>
add    $0x1,%edx
mov    %edx,%eax
cltd
idiv   %r14d
add    $0xffffffff,%ecx
jne    12a0 <GeneticSelection+0x190>
jmp    12bf <GeneticSelection+0x1af>
mov    %edx,%ebp
mov    %ebp,%eax
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define i32 @GeneticSelection(i32 %0, float* %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca float*
%6 = alloca float
%7 = alloca i32
%8 = alloca i32
store i32 %0, i32* %4
store float* %1, float** %5
store float 0.000000e+00, float* %6
store i32 0, i32* %7
br label %9
9: ; preds = %29, %2
%10 = load i32, i32* %7
%11 = load i32, i32* %4
%12 = icmp slt i32 %10, %11
br i1 %12, label %13, label %32
13: ; preds = %9
%14 = load float*, float** %5
%15 = load i32, i32* %7
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds float, float* %14, i64 %16
%18 = load float, float* %17
%19 = fcmp olt float %18, 0.000000e+00
br i1 %19, label %20, label %21
20: ; preds = %13
br label %29
21: ; preds = %13
%22 = load float*, float** %5
%23 = load i32, i32* %7
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds float, float* %22, i64 %24
%26 = load float, float* %25
%27 = load float, float* %6
%28 = fadd float %27, %26
store float %28, float* %6
br label %29
29: ; preds = %21, %20
%30 = load i32, i32* %7
%31 = add nsw i32 %30, 1
store i32 %31, i32* %7
br label %9
32: ; preds = %9
%33 = load float, float* %6
%34 = fcmp ogt float %33, 0.000000e+00
br i1 %34, label %35, label %65
35: ; preds = %32
store i32 0, i32* %7
br label %36
36: ; preds = %61, %35
%37 = load i32, i32* %7
%38 = load i32, i32* %4
%39 = icmp slt i32 %37, %38
br i1 %39, label %40, label %64
40: ; preds = %36
%41 = load float*, float** %5
%42 = load i32, i32* %7
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds float, float* %41, i64 %43
%45 = load float, float* %44
%46 = fcmp olt float %45, 0.000000e+00
br i1 %46, label %47, label %48
47: ; preds = %40
br label %61
48: ; preds = %40
%49 = load float*, float** %5
%50 = load i32, i32* %7
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds float, float* %49, i64 %51
%53 = load float, float* %52
%54 = load float, float* %6
%55 = fsub float %54, %53
store float %55, float* %6
%56 = load float, float* %6
%57 = fcmp ole float %56, 0.000000e+00
br i1 %57, label %58, label %60
58: ; preds = %48
%59 = load i32, i32* %7
store i32 %59, i32* %3
br label %96
60: ; preds = %48
br label %61
61: ; preds = %60, %47
%62 = load i32, i32* %7
%63 = add nsw i32 %62, 1
store i32 %63, i32* %7
br label %36
64: ; preds = %36
br label %65
65: ; preds = %64, %32
%66 = call i32 (...) @rand()
%67 = and i32 %66, 32767
%68 = sitofp i32 %67 to float
%69 = fdiv float %68, 3.276700e+04
%70 = load i32, i32* %4
%71 = sitofp i32 %70 to float
%72 = fmul float %69, %71
%73 = fptosi float %72 to i32
store i32 %73, i32* %8
store i32 0, i32* %7
br label %74
74: ; preds = %92, %65
%75 = load i32, i32* %7
%76 = load i32, i32* %4
%77 = icmp slt i32 %75, %76
br i1 %77, label %78, label %95
78: ; preds = %74
%79 = load float*, float** %5
%80 = load i32, i32* %8
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds float, float* %79, i64 %81
%83 = load float, float* %82
%84 = fcmp oge float %83, 0.000000e+00
br i1 %84, label %85, label %87
85: ; preds = %78
%86 = load i32, i32* %8
store i32 %86, i32* %3
br label %96
87: ; preds = %78
%88 = load i32, i32* %8
%89 = add nsw i32 %88, 1
%90 = load i32, i32* %4
%91 = srem i32 %89, %90
store i32 %91, i32* %8
br label %92
92: ; preds = %87
%93 = load i32, i32* %7
%94 = add nsw i32 %93, 1
store i32 %94, i32* %7
br label %74
95: ; preds = %74
store i32 0, i32* %3
br label %96
96: ; preds = %95, %85, %58
%97 = load i32, i32* %3
ret i32 %97
}

LLVM IR (-O2):
define i32 @GeneticSelection(i32 %0, float* nocapture %1) {
%3 = icmp sgt i32 %0, 0
br i1 %3, label %6, label %4
4: ; preds = %2
%5 = tail call i32 (...) @rand()
br label %102
6: ; preds = %2
%7 = zext i32 %0 to i64
%8 = add nsw i64 %7, -1
%9 = and i64 %7, 3
%10 = icmp ult i64 %8, 3
br i1 %10, label %43, label %11
11: ; preds = %6
%12 = and i64 %7, 4294967292
br label %13
13: ; preds = %13, %11
%14 = phi i64 [ 0, %11 ], [ %40, %13 ]
%15 = phi float [ 0.000000e+00, %11 ], [ %39, %13 ]
%16 = phi i64 [ 0, %11 ], [ %41, %13 ]
%17 = getelementptr inbounds float, float* %1, i64 %14
%18 = load float, float* %17
%19 = fcmp ole float %18, 0.000000e+00
%20 = select i1 %19, float -0.000000e+00, float %18
%21 = fadd float %15, %20
%22 = or i64 %14, 1
%23 = getelementptr inbounds float, float* %1, i64 %22
%24 = load float, float* %23
%25 = fcmp ole float %24, 0.000000e+00
%26 = select i1 %25, float -0.000000e+00, float %24
%27 = fadd float %21, %26
%28 = or i64 %14, 2
%29 = getelementptr inbounds float, float* %1, i64 %28
%30 = load float, float* %29
%31 = fcmp ole float %30, 0.000000e+00
%32 = select i1 %31, float -0.000000e+00, float %30
%33 = fadd float %27, %32
%34 = or i64 %14, 3
%35 = getelementptr inbounds float, float* %1, i64 %34
%36 = load float, float* %35
%37 = fcmp ole float %36, 0.000000e+00
%38 = select i1 %37, float -0.000000e+00, float %36
%39 = fadd float %33, %38
%40 = add nuw nsw i64 %14, 4
%41 = add i64 %16, 4
%42 = icmp eq i64 %41, %12
br i1 %42, label %43, label %13
43: ; preds = %13, %6
%44 = phi float [ undef, %6 ], [ %39, %13 ]
%45 = phi i64 [ 0, %6 ], [ %40, %13 ]
%46 = phi float [ 0.000000e+00, %6 ], [ %39, %13 ]
%47 = icmp eq i64 %9, 0
br i1 %47, label %60, label %48
48: ; preds = %43, %48
%49 = phi i64 [ %57, %48 ], [ %45, %43 ]
%50 = phi float [ %56, %48 ], [ %46, %43 ]
%51 = phi i64 [ %58, %48 ], [ 0, %43 ]
%52 = getelementptr inbounds float, float* %1, i64 %49
%53 = load float, float* %52
%54 = fcmp ole float %53, 0.000000e+00
%55 = select i1 %54, float -0.000000e+00, float %53
%56 = fadd float %50, %55
%57 = add nuw nsw i64 %49, 1
%58 = add i64 %51, 1
%59 = icmp eq i64 %58, %9
br i1 %59, label %60, label %48
60: ; preds = %48, %43
%61 = phi float [ %44, %43 ], [ %56, %48 ]
%62 = fcmp ogt float %61, 0.000000e+00
%63 = and i1 %62, %3
br i1 %63, label %64, label %79
64: ; preds = %60
%65 = zext i32 %0 to i64
br label %66
66: ; preds = %64, %75
%67 = phi i64 [ 0, %64 ], [ %77, %75 ]
%68 = phi float [ %61, %64 ], [ %76, %75 ]
%69 = getelementptr inbounds float, float* %1, i64 %67
%70 = load float, float* %69
%71 = fcmp olt float %70, 0.000000e+00
br i1 %71, label %75, label %72
72: ; preds = %66
%73 = fsub float %68, %70
%74 = fcmp ugt float %73, 0.000000e+00
br i1 %74, label %75, label %100
75: ; preds = %72, %66
%76 = phi float [ %68, %66 ], [ %73, %72 ]
%77 = add nuw nsw i64 %67, 1
%78 = icmp eq i64 %77, %65
br i1 %78, label %79, label %66
79: ; preds = %75, %60
%80 = tail call i32 (...) @rand()
br i1 %3, label %81, label %102
81: ; preds = %79
%82 = and i32 %80, 32767
%83 = sitofp i32 %82 to float
%84 = fdiv float %83, 3.276700e+04
%85 = sitofp i32 %0 to float
%86 = fmul float %84, %85
%87 = fptosi float %86 to i32
br label %88
88: ; preds = %81, %95
%89 = phi i32 [ %97, %95 ], [ %87, %81 ]
%90 = phi i32 [ %98, %95 ], [ 0, %81 ]
%91 = sext i32 %89 to i64
%92 = getelementptr inbounds float, float* %1, i64 %91
%93 = load float, float* %92
%94 = fcmp ult float %93, 0.000000e+00
br i1 %94, label %95, label %102
95: ; preds = %88
%96 = add nsw i32 %89, 1
%97 = srem i32 %96, %0
%98 = add nuw nsw i32 %90, 1
%99 = icmp eq i32 %98, %0
br i1 %99, label %102, label %88
100: ; preds = %72
%101 = trunc i64 %67 to i32
br label %102
102: ; preds = %88, %95, %4, %100, %79
%103 = phi i32 [ 0, %79 ], [ %101, %100 ], [ 0, %4 ], [ %89, %88 ], [ 0, %95 ]
ret i32 %103
}