int leaders(const double *Z, const int *T, int *L, int *M, int kk, int n) {
  int *curNode;
  int ndid, lid, rid, k, nc;
  unsigned char *lvisited, *rvisited;
  const double *Zrow;
  const int bff = (((((double)(n)) / (double)(sizeof(unsigned char) * 8)) ==
                            ((double)(((n)) / ((sizeof(unsigned char) * 8))))
                        ? (((n)) / ((sizeof(unsigned char) * 8)))
                        : (((n)) / ((sizeof(unsigned char) * 8)) + 1)));
  int *fid;
  int lfid = 0, rfid = 0, errid = -1;
  curNode = (int *)malloc(n * sizeof(int));
  lvisited = (unsigned char *)malloc(bff);
  rvisited = (unsigned char *)malloc(bff);
  fid = (int *)malloc((2 * n - 1) * sizeof(int));
  for (k = 0; k < n; k++) {
    fid[k] = T[k];
  }
  for (k = n; k < 2 * n - 1; k++) {
    fid[k] = -1;
  }
  nc = 0;
  k = 0;
  curNode[k] = (n * 2) - 2;
  bzero(lvisited, bff);
  bzero(rvisited, bff);
  while (k >= 0) {
    ndid = curNode[k];
    Zrow = Z + ((ndid - n) * 4);
    lid = (int)Zrow[0];
    rid = (int)Zrow[1];
    ;
    if (lid >= n && !(((lvisited)[(ndid - n) / (sizeof(unsigned char) * 8)] >>
                       (((sizeof(unsigned char) * 8) - 1) -
                        ((ndid - n) % (sizeof(unsigned char) * 8)))) &
                      0x1)) {
      ((lvisited)[(ndid - n) / (sizeof(unsigned char) * 8)] |=
       ((0x1) << (((sizeof(unsigned char) * 8) - 1) -
                  ((ndid - n) % (sizeof(unsigned char) * 8)))));
      curNode[k + 1] = lid;
      k++;
      continue;
    }
    if (rid >= n && !(((rvisited)[(ndid - n) / (sizeof(unsigned char) * 8)] >>
                       (((sizeof(unsigned char) * 8) - 1) -
                        ((ndid - n) % (sizeof(unsigned char) * 8)))) &
                      0x1)) {
      ((rvisited)[(ndid - n) / (sizeof(unsigned char) * 8)] |=
       ((0x1) << (((sizeof(unsigned char) * 8) - 1) -
                  ((ndid - n) % (sizeof(unsigned char) * 8)))));
      curNode[k + 1] = rid;
      k++;
      continue;
    }
    lfid = fid[lid];
    rfid = fid[rid];
    ;
    if (lfid == rfid) {
      fid[ndid] = lfid;
    } else {
      if (lfid != -1) {
        if (nc >= kk) {
          errid = ndid;
          break;
        };
        L[nc] = lid;
        M[nc] = lfid;
        nc++;
      }
      if (rfid != -1) {
        if (nc >= kk) {
          errid = ndid;
          break;
        };
        L[nc] = rid;
        M[nc] = rfid;
        nc++;
      }
      fid[ndid] = -1;
    }
    k--;
  }
  Zrow = Z + ((n - 2) * 4);
  lid = (int)Zrow[0];
  rid = (int)Zrow[1];
  lfid = fid[lid];
  rfid = fid[rid];
  if (lfid == rfid && lfid != -1 && errid == -1) {
    if (nc >= kk) {
      errid = (n * 2) - 2;
      goto leaders_free;
    }
    L[nc] = (n * 2) - 2;
    M[nc] = lfid;
    nc++;
  }
leaders_free:
  free(curNode);
  free(lvisited);
  free(rvisited);
  free(fid);
  return errid;
}


x86 assembly (clang, -O0):
<leaders>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
mov    %r9d,-0x28(%rbp)
movslq -0x28(%rbp),%rax
mov    %eax,%ecx
cvtsi2sd %ecx,%xmm0
movsd  0xe9b(%rip),%xmm1
divsd  %xmm1,%xmm0
shr    $0x3,%rax
cvtsi2sd %rax,%xmm1
ucomisd %xmm1,%xmm0
jne    1196 <leaders+0x66>
jp     1196 <leaders+0x66>
movslq -0x28(%rbp),%rax
shr    $0x3,%rax
mov    %rax,-0x88(%rbp)
jmp    11a9 <leaders+0x79>
movslq -0x28(%rbp),%rax
shr    $0x3,%rax
add    $0x1,%rax
mov    %rax,-0x88(%rbp)
mov    -0x88(%rbp),%rax
mov    %eax,-0x64(%rbp)
movl   $0x0,-0x74(%rbp)
movl   $0x0,-0x78(%rbp)
movl   $0xffffffff,-0x7c(%rbp)
movslq -0x28(%rbp),%rdi
shl    $0x2,%rdi
call   1050 <malloc@plt>
mov    %rax,-0x30(%rbp)
movslq -0x64(%rbp),%rdi
call   1050 <malloc@plt>
mov    %rax,-0x50(%rbp)
movslq -0x64(%rbp),%rdi
call   1050 <malloc@plt>
mov    %rax,-0x58(%rbp)
mov    -0x28(%rbp),%eax
shl    $0x1,%eax
sub    $0x1,%eax
movslq %eax,%rdi
shl    $0x2,%rdi
call   1050 <malloc@plt>
mov    %rax,-0x70(%rbp)
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    1243 <leaders+0x113>
mov    -0x10(%rbp),%rax
movslq -0x40(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x70(%rbp),%rax
movslq -0x40(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1213 <leaders+0xe3>
mov    -0x28(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
mov    -0x28(%rbp),%ecx
shl    $0x1,%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    127a <leaders+0x14a>
mov    -0x70(%rbp),%rax
movslq -0x40(%rbp),%rcx
movl   $0xffffffff,(%rax,%rcx,4)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1249 <leaders+0x119>
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x40(%rbp)
mov    -0x28(%rbp),%edx
shl    $0x1,%edx
sub    $0x2,%edx
mov    -0x30(%rbp),%rax
movslq -0x40(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x50(%rbp),%rdi
movslq -0x64(%rbp),%rdx
xor    %esi,%esi
call   1040 <memset@plt>
mov    -0x58(%rbp),%rdi
movslq -0x64(%rbp),%rdx
xor    %esi,%esi
call   1040 <memset@plt>
cmpl   $0x0,-0x40(%rbp)
jl     1522 <leaders+0x3f2>
mov    -0x30(%rbp),%rax
movslq -0x40(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x34(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    -0x28(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x60(%rbp),%rax
cvttsd2si (%rax),%eax
mov    %eax,-0x38(%rbp)
mov    -0x60(%rbp),%rax
cvttsd2si 0x8(%rax),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x28(%rbp),%eax
jl     13a1 <leaders+0x271>
mov    -0x50(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    -0x28(%rbp),%ecx
movslq %ecx,%rcx
shr    $0x3,%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x34(%rbp),%ecx
sub    -0x28(%rbp),%ecx
movslq %ecx,%rdx
and    $0x7,%rdx
mov    $0x7,%ecx
sub    %rdx,%rcx
sar    %cl,%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    13a1 <leaders+0x271>
mov    -0x34(%rbp),%eax
sub    -0x28(%rbp),%eax
movslq %eax,%rcx
and    $0x7,%rcx
mov    $0x7,%eax
sub    %rcx,%rax
mov    %eax,%ecx
mov    $0x1,%esi
shl    %cl,%esi
mov    -0x50(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    -0x28(%rbp),%ecx
movslq %ecx,%rcx
shr    $0x3,%rcx
movzbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x38(%rbp),%edx
mov    -0x30(%rbp),%rax
mov    -0x40(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    12ba <leaders+0x18a>
mov    -0x3c(%rbp),%eax
cmp    -0x28(%rbp),%eax
jl     143e <leaders+0x30e>
mov    -0x58(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    -0x28(%rbp),%ecx
movslq %ecx,%rcx
shr    $0x3,%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x34(%rbp),%ecx
sub    -0x28(%rbp),%ecx
movslq %ecx,%rdx
and    $0x7,%rdx
mov    $0x7,%ecx
sub    %rdx,%rcx
sar    %cl,%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    143e <leaders+0x30e>
mov    -0x34(%rbp),%eax
sub    -0x28(%rbp),%eax
movslq %eax,%rcx
and    $0x7,%rcx
mov    $0x7,%eax
sub    %rcx,%rax
mov    %eax,%ecx
mov    $0x1,%esi
shl    %cl,%esi
mov    -0x58(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    -0x28(%rbp),%ecx
movslq %ecx,%rcx
shr    $0x3,%rcx
movzbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x3c(%rbp),%edx
mov    -0x30(%rbp),%rax
mov    -0x40(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    12ba <leaders+0x18a>
mov    -0x70(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x74(%rbp)
mov    -0x70(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x78(%rbp)
mov    -0x74(%rbp),%eax
cmp    -0x78(%rbp),%eax
jne    1479 <leaders+0x349>
mov    -0x74(%rbp),%edx
mov    -0x70(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1514 <leaders+0x3e4>
cmpl   $0xffffffff,-0x74(%rbp)
je     14bf <leaders+0x38f>
mov    -0x44(%rbp),%eax
cmp    -0x24(%rbp),%eax
jl     149a <leaders+0x36a>
mov    -0x34(%rbp),%eax
mov    %eax,-0x7c(%rbp)
jmp    1522 <leaders+0x3f2>
mov    -0x38(%rbp),%edx
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x74(%rbp),%edx
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
cmpl   $0xffffffff,-0x78(%rbp)
je     1505 <leaders+0x3d5>
mov    -0x44(%rbp),%eax
cmp    -0x24(%rbp),%eax
jl     14e0 <leaders+0x3b0>
mov    -0x34(%rbp),%eax
mov    %eax,-0x7c(%rbp)
jmp    1522 <leaders+0x3f2>
mov    -0x3c(%rbp),%edx
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x78(%rbp),%edx
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x70(%rbp),%rax
movslq -0x34(%rbp),%rcx
movl   $0xffffffff,(%rax,%rcx,4)
mov    -0x40(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x40(%rbp)
jmp    12ba <leaders+0x18a>
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%ecx
sub    $0x2,%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x60(%rbp),%rax
cvttsd2si (%rax),%eax
mov    %eax,-0x38(%rbp)
mov    -0x60(%rbp),%rax
cvttsd2si 0x8(%rax),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x70(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x74(%rbp)
mov    -0x70(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x78(%rbp)
mov    -0x74(%rbp),%eax
cmp    -0x78(%rbp),%eax
jne    15d8 <leaders+0x4a8>
cmpl   $0xffffffff,-0x74(%rbp)
je     15d8 <leaders+0x4a8>
cmpl   $0xffffffff,-0x7c(%rbp)
jne    15d8 <leaders+0x4a8>
mov    -0x44(%rbp),%eax
cmp    -0x24(%rbp),%eax
jl     15ad <leaders+0x47d>
mov    -0x28(%rbp),%eax
shl    $0x1,%eax
sub    $0x2,%eax
mov    %eax,-0x7c(%rbp)
jmp    15dd <leaders+0x4ad>
mov    -0x28(%rbp),%edx
shl    $0x1,%edx
sub    $0x2,%edx
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x74(%rbp),%edx
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    15dd <leaders+0x4ad>
mov    -0x30(%rbp),%rdi
call   1030 <free@plt>
mov    -0x50(%rbp),%rdi
call   1030 <free@plt>
mov    -0x58(%rbp),%rdi
call   1030 <free@plt>
mov    -0x70(%rbp),%rdi
call   1030 <free@plt>
mov    -0x7c(%rbp),%eax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<leaders>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %r9d,%r15d
mov    %r8d,0x4(%rsp)
mov    %rcx,0x20(%rsp)
mov    %rdx,0x18(%rsp)
mov    %rsi,0x30(%rsp)
mov    %rdi,%r12
cvtsi2sd %r9d,%xmm0
mulsd  0xe8b(%rip),%xmm0
movslq %r9d,%rbp
mov    %rbp,%rbx
shr    $0x3,%rbx
cvtsi2sd %rbx,%xmm1
cmpneqsd %xmm0,%xmm1
movq   %xmm1,%rax
sub    %eax,%ebx
lea    0x0(,%rbp,4),%rdi
mov    %rdi,0x28(%rsp)
call   1060 <malloc@plt>
mov    %rax,%r13
movslq %ebx,%r14
mov    %r14,%rdi
call   1060 <malloc@plt>
mov    %rax,0x8(%rsp)
mov    %r14,%rdi
call   1060 <malloc@plt>
mov    %rax,0x10(%rsp)
lea    0x0(%rbp,%rbp,1),%eax
lea    -0x1(%rbp,%rbp,1),%ebx
mov    %eax,(%rsp)
cltq
lea    -0x4(,%rax,4),%rdi
ff
call   1060 <malloc@plt>
test   %ebp,%ebp
mov    %rax,%rbp
jle    11f7 <leaders+0xb7>
mov    %r15d,%edx
shl    $0x2,%rdx
mov    %rbp,%rdi
mov    0x30(%rsp),%rsi
call   1050 <memcpy@plt>
cmp    %r15d,%ebx
jle    121a <leaders+0xda>
mov    %rbp,%rdi
add    0x28(%rsp),%rdi
lea    -0x2(%r15),%eax
lea    0x4(,%rax,4),%rdx
mov    $0xff,%esi
call   1040 <memset@plt>
mov    (%rsp),%eax
add    $0xfffffffe,%eax
mov    %eax,(%rsp)
mov    %eax,0x0(%r13)
xor    %ebx,%ebx
mov    0x8(%rsp),%rdi
xor    %esi,%esi
mov    %r14,%rdx
call   1040 <memset@plt>
mov    0x10(%rsp),%rdi
xor    %esi,%esi
mov    %r14,%rdx
call   1040 <memset@plt>
xor    %r8d,%r8d
mov    0x10(%rsp),%r10
jmp    128b <leaders+0x14b>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movslq %r8d,%rdx
mov    0x18(%rsp),%rsi
mov    %edi,(%rsi,%rdx,4)
mov    0x20(%rsp),%rsi
mov    %ecx,(%rsi,%rdx,4)
add    $0x1,%r8d
movslq %r14d,%rcx
mov    %eax,0x0(%rbp,%rcx,4)
lea    -0x1(%r9),%ebx
test   %r9d,%r9d
jle    1397 <leaders+0x257>
mov    %rbp,%r11
mov    %ebx,%r9d
jmp    12b1 <leaders+0x171>
add    0x8(%rsp),%rax
nopl   0x0(%rax,%rax,1)
or     %sil,%bl
mov    %bl,(%rax)
add    $0x1,%r9
mov    %r9d,%eax
mov    %edx,0x0(%r13,%rax,4)
mov    0x0(%r13,%r9,4),%r14d
mov    %r14d,%eax
sub    %r15d,%eax
lea    0x0(,%rax,4),%ecx
movslq %ecx,%rdi
cvttsd2si (%r12,%rdi,8),%edx
movslq %eax,%rbp
cmp    %r15d,%edx
jl     12fa <leaders+0x1ba>
mov    %rbp,%rax
mov    %ebp,%ecx
not    %cl
and    $0x7,%cl
mov    $0x1,%ebx
shl    %cl,%ebx
shr    $0x3,%rax
mov    0x8(%rsp),%rsi
movzbl (%rsi,%rax,1),%esi
movzbl %cl,%ecx
bt     %ecx,%esi
jae    1293 <leaders+0x153>
cvttsd2si 0x8(%r12,%rdi,8),%edi
cmp    %r15d,%edi
jl     1340 <leaders+0x200>
mov    %rbp,%rax
not    %bpl
and    $0x7,%bpl
mov    $0x1,%ebx
mov    %ebp,%ecx
shl    %cl,%ebx
shr    $0x3,%rax
movzbl (%r10,%rax,1),%esi
movzbl %bpl,%ecx
bt     %ecx,%esi
jb     1340 <leaders+0x200>
add    %r10,%rax
mov    %edi,%edx
jmp    12a0 <leaders+0x160>
cs nopw 0x0(%rax,%rax,1)
nop
movslq %edx,%rax
mov    %r11,%rbp
mov    (%r11,%rax,4),%eax
movslq %edi,%rcx
mov    (%r11,%rcx,4),%ecx
cmp    %ecx,%eax
je     1277 <leaders+0x137>
cmp    $0xffffffff,%eax
je     137c <leaders+0x23c>
cmp    0x4(%rsp),%r8d
jge    139d <leaders+0x25d>
movslq %r8d,%rsi
mov    0x18(%rsp),%rbx
mov    %edx,(%rbx,%rsi,4)
mov    0x20(%rsp),%rdx
mov    %eax,(%rdx,%rsi,4)
add    $0x1,%r8d
mov    $0xffffffff,%eax
cmp    $0xffffffff,%ecx
je     1277 <leaders+0x137>
cmp    0x4(%rsp),%r8d
jl     1260 <leaders+0x120>
jmp    139d <leaders+0x25d>
mov    $0xffffffff,%r14d
lea    -0x8(,%r15,4),%eax
ff
cltq
movupd (%r12,%rax,8),%xmm0
cvttpd2dq %xmm0,%xmm0
movd   %xmm0,%eax
cltq
mov    0x0(%rbp,%rax,4),%eax
cmp    $0xffffffff,%eax
je     1408 <leaders+0x2c8>
pshufd $0x55,%xmm0,%xmm0
movd   %xmm0,%ecx
movslq %ecx,%rcx
cmp    0x0(%rbp,%rcx,4),%eax
mov    0x10(%rsp),%rbx
jne    140d <leaders+0x2cd>
cmp    $0xffffffff,%r14d
jne    140d <leaders+0x2cd>
cmp    0x4(%rsp),%r8d
jge    1402 <leaders+0x2c2>
movslq %r8d,%rcx
mov    (%rsp),%edx
mov    0x18(%rsp),%rsi
mov    %edx,(%rsi,%rcx,4)
mov    0x20(%rsp),%rdx
mov    %eax,(%rdx,%rcx,4)
mov    $0xffffffff,%r14d
jmp    140d <leaders+0x2cd>
mov    (%rsp),%r14d
jmp    140d <leaders+0x2cd>
mov    0x10(%rsp),%rbx
mov    %r13,%rdi
call   1030 <free@plt>
mov    0x8(%rsp),%rdi
call   1030 <free@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    %rbp,%rdi
call   1030 <free@plt>
mov    %r14d,%eax
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @leaders(double* %0, i32* %1, i32* %2, i32* %3, i32 %4, i32 %5) {
%7 = alloca double*
%8 = alloca i32*
%9 = alloca i32*
%10 = alloca i32*
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32*
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i8*
%20 = alloca i8*
%21 = alloca double*
%22 = alloca i32
%23 = alloca i32*
%24 = alloca i32
%25 = alloca i32
%26 = alloca i32
store double* %0, double** %7
store i32* %1, i32** %8
store i32* %2, i32** %9
store i32* %3, i32** %10
store i32 %4, i32* %11
store i32 %5, i32* %12
%27 = load i32, i32* %12
%28 = sitofp i32 %27 to double
%29 = fdiv double %28, 8.000000e+00
%30 = load i32, i32* %12
%31 = sext i32 %30 to i64
%32 = udiv i64 %31, 8
%33 = uitofp i64 %32 to double
%34 = fcmp oeq double %29, %33
br i1 %34, label %35, label %39
35: ; preds = %6
%36 = load i32, i32* %12
%37 = sext i32 %36 to i64
%38 = udiv i64 %37, 8
br label %44
39: ; preds = %6
%40 = load i32, i32* %12
%41 = sext i32 %40 to i64
%42 = udiv i64 %41, 8
%43 = add i64 %42, 1
br label %44
44: ; preds = %39, %35
%45 = phi i64 [ %38, %35 ], [ %43, %39 ]
%46 = trunc i64 %45 to i32
store i32 %46, i32* %22
store i32 0, i32* %24
store i32 0, i32* %25
store i32 -1, i32* %26
%47 = load i32, i32* %12
%48 = sext i32 %47 to i64
%49 = mul i64 %48, 4
%50 = call i8* @malloc(i64 %49)
%51 = bitcast i8* %50 to i32*
store i32* %51, i32** %13
%52 = load i32, i32* %22
%53 = sext i32 %52 to i64
%54 = call i8* @malloc(i64 %53)
store i8* %54, i8** %19
%55 = load i32, i32* %22
%56 = sext i32 %55 to i64
%57 = call i8* @malloc(i64 %56)
store i8* %57, i8** %20
%58 = load i32, i32* %12
%59 = mul nsw i32 2, %58
%60 = sub nsw i32 %59, 1
%61 = sext i32 %60 to i64
%62 = mul i64 %61, 4
%63 = call i8* @malloc(i64 %62)
%64 = bitcast i8* %63 to i32*
store i32* %64, i32** %23
store i32 0, i32* %17
br label %65
65: ; preds = %79, %44
%66 = load i32, i32* %17
%67 = load i32, i32* %12
%68 = icmp slt i32 %66, %67
br i1 %68, label %69, label %82
69: ; preds = %65
%70 = load i32*, i32** %8
%71 = load i32, i32* %17
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds i32, i32* %70, i64 %72
%74 = load i32, i32* %73
%75 = load i32*, i32** %23
%76 = load i32, i32* %17
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds i32, i32* %75, i64 %77
store i32 %74, i32* %78
br label %79
79: ; preds = %69
%80 = load i32, i32* %17
%81 = add nsw i32 %80, 1
store i32 %81, i32* %17
br label %65
82: ; preds = %65
%83 = load i32, i32* %12
store i32 %83, i32* %17
br label %84
84: ; preds = %95, %82
%85 = load i32, i32* %17
%86 = load i32, i32* %12
%87 = mul nsw i32 2, %86
%88 = sub nsw i32 %87, 1
%89 = icmp slt i32 %85, %88
br i1 %89, label %90, label %98
90: ; preds = %84
%91 = load i32*, i32** %23
%92 = load i32, i32* %17
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i32, i32* %91, i64 %93
store i32 -1, i32* %94
br label %95
95: ; preds = %90
%96 = load i32, i32* %17
%97 = add nsw i32 %96, 1
store i32 %97, i32* %17
br label %84
98: ; preds = %84
store i32 0, i32* %18
store i32 0, i32* %17
%99 = load i32, i32* %12
%100 = mul nsw i32 %99, 2
%101 = sub nsw i32 %100, 2
%102 = load i32*, i32** %13
%103 = load i32, i32* %17
%104 = sext i32 %103 to i64
%105 = getelementptr inbounds i32, i32* %102, i64 %104
store i32 %101, i32* %105
%106 = load i8*, i8** %19
%107 = load i32, i32* %22
%108 = sext i32 %107 to i64
%109 = load i8*, i8** %20
%110 = load i32, i32* %22
%111 = sext i32 %110 to i64
br label %112
112: ; preds = %308, %211, %159, %98
%113 = load i32, i32* %17
%114 = icmp sge i32 %113, 0
br i1 %114, label %115, label %311
115: ; preds = %112
%116 = load i32*, i32** %13
%117 = load i32, i32* %17
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds i32, i32* %116, i64 %118
%120 = load i32, i32* %119
store i32 %120, i32* %14
%121 = load double*, double** %7
%122 = load i32, i32* %14
%123 = load i32, i32* %12
%124 = sub nsw i32 %122, %123
%125 = mul nsw i32 %124, 4
%126 = sext i32 %125 to i64
%127 = getelementptr inbounds double, double* %121, i64 %126
store double* %127, double** %21
%128 = load double*, double** %21
%129 = getelementptr inbounds double, double* %128, i64 0
%130 = load double, double* %129
%131 = fptosi double %130 to i32
store i32 %131, i32* %15
%132 = load double*, double** %21
%133 = getelementptr inbounds double, double* %132, i64 1
%134 = load double, double* %133
%135 = fptosi double %134 to i32
store i32 %135, i32* %16
%136 = load i32, i32* %15
%137 = load i32, i32* %12
%138 = icmp sge i32 %136, %137
br i1 %138, label %139, label %187
139: ; preds = %115
%140 = load i8*, i8** %19
%141 = load i32, i32* %14
%142 = load i32, i32* %12
%143 = sub nsw i32 %141, %142
%144 = sext i32 %143 to i64
%145 = udiv i64 %144, 8
%146 = getelementptr inbounds i8, i8* %140, i64 %145
%147 = load i8, i8* %146
%148 = zext i8 %147 to i32
%149 = load i32, i32* %14
%150 = load i32, i32* %12
%151 = sub nsw i32 %149, %150
%152 = sext i32 %151 to i64
%153 = urem i64 %152, 8
%154 = sub i64 7, %153
%155 = trunc i64 %154 to i32
%156 = ashr i32 %148, %155
%157 = and i32 %156, 1
%158 = icmp ne i32 %157, 0
br i1 %158, label %187, label %159
159: ; preds = %139
%160 = load i32, i32* %14
%161 = load i32, i32* %12
%162 = sub nsw i32 %160, %161
%163 = sext i32 %162 to i64
%164 = urem i64 %163, 8
%165 = sub i64 7, %164
%166 = trunc i64 %165 to i32
%167 = shl i32 1, %166
%168 = load i8*, i8** %19
%169 = load i32, i32* %14
%170 = load i32, i32* %12
%171 = sub nsw i32 %169, %170
%172 = sext i32 %171 to i64
%173 = udiv i64 %172, 8
%174 = getelementptr inbounds i8, i8* %168, i64 %173
%175 = load i8, i8* %174
%176 = zext i8 %175 to i32
%177 = or i32 %176, %167
%178 = trunc i32 %177 to i8
store i8 %178, i8* %174
%179 = load i32, i32* %15
%180 = load i32*, i32** %13
%181 = load i32, i32* %17
%182 = add nsw i32 %181, 1
%183 = sext i32 %182 to i64
%184 = getelementptr inbounds i32, i32* %180, i64 %183
store i32 %179, i32* %184
%185 = load i32, i32* %17
%186 = add nsw i32 %185, 1
store i32 %186, i32* %17
br label %112
187: ; preds = %139, %115
%188 = load i32, i32* %16
%189 = load i32, i32* %12
%190 = icmp sge i32 %188, %189
br i1 %190, label %191, label %239
191: ; preds = %187
%192 = load i8*, i8** %20
%193 = load i32, i32* %14
%194 = load i32, i32* %12
%195 = sub nsw i32 %193, %194
%196 = sext i32 %195 to i64
%197 = udiv i64 %196, 8
%198 = getelementptr inbounds i8, i8* %192, i64 %197
%199 = load i8, i8* %198
%200 = zext i8 %199 to i32
%201 = load i32, i32* %14
%202 = load i32, i32* %12
%203 = sub nsw i32 %201, %202
%204 = sext i32 %203 to i64
%205 = urem i64 %204, 8
%206 = sub i64 7, %205
%207 = trunc i64 %206 to i32
%208 = ashr i32 %200, %207
%209 = and i32 %208, 1
%210 = icmp ne i32 %209, 0
br i1 %210, label %239, label %211
211: ; preds = %191
%212 = load i32, i32* %14
%213 = load i32, i32* %12
%214 = sub nsw i32 %212, %213
%215 = sext i32 %214 to i64
%216 = urem i64 %215, 8
%217 = sub i64 7, %216
%218 = trunc i64 %217 to i32
%219 = shl i32 1, %218
%220 = load i8*, i8** %20
%221 = load i32, i32* %14
%222 = load i32, i32* %12
%223 = sub nsw i32 %221, %222
%224 = sext i32 %223 to i64
%225 = udiv i64 %224, 8
%226 = getelementptr inbounds i8, i8* %220, i64 %225
%227 = load i8, i8* %226
%228 = zext i8 %227 to i32
%229 = or i32 %228, %219
%230 = trunc i32 %229 to i8
store i8 %230, i8* %226
%231 = load i32, i32* %16
%232 = load i32*, i32** %13
%233 = load i32, i32* %17
%234 = add nsw i32 %233, 1
%235 = sext i32 %234 to i64
%236 = getelementptr inbounds i32, i32* %232, i64 %235
store i32 %231, i32* %236
%237 = load i32, i32* %17
%238 = add nsw i32 %237, 1
store i32 %238, i32* %17
br label %112
239: ; preds = %191, %187
%240 = load i32*, i32** %23
%241 = load i32, i32* %15
%242 = sext i32 %241 to i64
%243 = getelementptr inbounds i32, i32* %240, i64 %242
%244 = load i32, i32* %243
store i32 %244, i32* %24
%245 = load i32*, i32** %23
%246 = load i32, i32* %16
%247 = sext i32 %246 to i64
%248 = getelementptr inbounds i32, i32* %245, i64 %247
%249 = load i32, i32* %248
store i32 %249, i32* %25
%250 = load i32, i32* %24
%251 = load i32, i32* %25
%252 = icmp eq i32 %250, %251
br i1 %252, label %253, label %259
253: ; preds = %239
%254 = load i32, i32* %24
%255 = load i32*, i32** %23
%256 = load i32, i32* %14
%257 = sext i32 %256 to i64
%258 = getelementptr inbounds i32, i32* %255, i64 %257
store i32 %254, i32* %258
br label %308
259: ; preds = %239
%260 = load i32, i32* %24
%261 = icmp ne i32 %260, -1
br i1 %261, label %262, label %281
262: ; preds = %259
%263 = load i32, i32* %18
%264 = load i32, i32* %11
%265 = icmp sge i32 %263, %264
br i1 %265, label %266, label %268
266: ; preds = %262
%267 = load i32, i32* %14
store i32 %267, i32* %26
br label %311
268: ; preds = %262
%269 = load i32, i32* %15
%270 = load i32*, i32** %9
%271 = load i32, i32* %18
%272 = sext i32 %271 to i64
%273 = getelementptr inbounds i32, i32* %270, i64 %272
store i32 %269, i32* %273
%274 = load i32, i32* %24
%275 = load i32*, i32** %10
%276 = load i32, i32* %18
%277 = sext i32 %276 to i64
%278 = getelementptr inbounds i32, i32* %275, i64 %277
store i32 %274, i32* %278
%279 = load i32, i32* %18
%280 = add nsw i32 %279, 1
store i32 %280, i32* %18
br label %281
281: ; preds = %268, %259
%282 = load i32, i32* %25
%283 = icmp ne i32 %282, -1
br i1 %283, label %284, label %303
284: ; preds = %281
%285 = load i32, i32* %18
%286 = load i32, i32* %11
%287 = icmp sge i32 %285, %286
br i1 %287, label %288, label %290
288: ; preds = %284
%289 = load i32, i32* %14
store i32 %289, i32* %26
br label %311
290: ; preds = %284
%291 = load i32, i32* %16
%292 = load i32*, i32** %9
%293 = load i32, i32* %18
%294 = sext i32 %293 to i64
%295 = getelementptr inbounds i32, i32* %292, i64 %294
store i32 %291, i32* %295
%296 = load i32, i32* %25
%297 = load i32*, i32** %10
%298 = load i32, i32* %18
%299 = sext i32 %298 to i64
%300 = getelementptr inbounds i32, i32* %297, i64 %299
store i32 %296, i32* %300
%301 = load i32, i32* %18
%302 = add nsw i32 %301, 1
store i32 %302, i32* %18
br label %303
303: ; preds = %290, %281
%304 = load i32*, i32** %23
%305 = load i32, i32* %14
%306 = sext i32 %305 to i64
%307 = getelementptr inbounds i32, i32* %304, i64 %306
store i32 -1, i32* %307
br label %308
308: ; preds = %303, %253
%309 = load i32, i32* %17
%310 = add nsw i32 %309, -1
store i32 %310, i32* %17
br label %112
311: ; preds = %288, %266, %112
%312 = load double*, double** %7
%313 = load i32, i32* %12
%314 = sub nsw i32 %313, 2
%315 = mul nsw i32 %314, 4
%316 = sext i32 %315 to i64
%317 = getelementptr inbounds double, double* %312, i64 %316
store double* %317, double** %21
%318 = load double*, double** %21
%319 = getelementptr inbounds double, double* %318, i64 0
%320 = load double, double* %319
%321 = fptosi double %320 to i32
store i32 %321, i32* %15
%322 = load double*, double** %21
%323 = getelementptr inbounds double, double* %322, i64 1
%324 = load double, double* %323
%325 = fptosi double %324 to i32
store i32 %325, i32* %16
%326 = load i32*, i32** %23
%327 = load i32, i32* %15
%328 = sext i32 %327 to i64
%329 = getelementptr inbounds i32, i32* %326, i64 %328
%330 = load i32, i32* %329
store i32 %330, i32* %24
%331 = load i32*, i32** %23
%332 = load i32, i32* %16
%333 = sext i32 %332 to i64
%334 = getelementptr inbounds i32, i32* %331, i64 %333
%335 = load i32, i32* %334
store i32 %335, i32* %25
%336 = load i32, i32* %24
%337 = load i32, i32* %25
%338 = icmp eq i32 %336, %337
br i1 %338, label %339, label %368
339: ; preds = %311
%340 = load i32, i32* %24
%341 = icmp ne i32 %340, -1
br i1 %341, label %342, label %368
342: ; preds = %339
%343 = load i32, i32* %26
%344 = icmp eq i32 %343, -1
br i1 %344, label %345, label %368
345: ; preds = %342
%346 = load i32, i32* %18
%347 = load i32, i32* %11
%348 = icmp sge i32 %346, %347
br i1 %348, label %349, label %353
349: ; preds = %345
%350 = load i32, i32* %12
%351 = mul nsw i32 %350, 2
%352 = sub nsw i32 %351, 2
store i32 %352, i32* %26
br label %369
353: ; preds = %345
%354 = load i32, i32* %12
%355 = mul nsw i32 %354, 2
%356 = sub nsw i32 %355, 2
%357 = load i32*, i32** %9
%358 = load i32, i32* %18
%359 = sext i32 %358 to i64
%360 = getelementptr inbounds i32, i32* %357, i64 %359
store i32 %356, i32* %360
%361 = load i32, i32* %24
%362 = load i32*, i32** %10
%363 = load i32, i32* %18
%364 = sext i32 %363 to i64
%365 = getelementptr inbounds i32, i32* %362, i64 %364
store i32 %361, i32* %365
%366 = load i32, i32* %18
%367 = add nsw i32 %366, 1
store i32 %367, i32* %18
br label %368
368: ; preds = %353, %342, %339, %311
br label %369
369: ; preds = %368, %349
%370 = load i32*, i32** %13
%371 = bitcast i32* %370 to i8*
%372 = load i8*, i8** %19
%373 = load i8*, i8** %20
%374 = load i32*, i32** %23
%375 = bitcast i32* %374 to i8*
%376 = load i32, i32* %26
ret i32 %376
}

LLVM IR (-O2):
define i32 @leaders(double* nocapture %0, i32* nocapture %1, i32* nocapture writeonly %2, i32* nocapture writeonly %3, i32 %4, i32 %5) {
%7 = sitofp i32 %5 to double
%8 = fmul double %7, 1.250000e-01
%9 = sext i32 %5 to i64
%10 = lshr i64 %9, 3
%11 = uitofp i64 %10 to double
%12 = fcmp une double %8, %11
%13 = zext i1 %12 to i64
%14 = add nuw nsw i64 %10, %13
%15 = shl nsw i64 %9, 2
%16 = tail call i8* @malloc(i64 %15)
%17 = bitcast i8* %16 to i32*
%18 = shl i64 %14, 32
%19 = ashr exact i64 %18, 32
%20 = tail call i8* @malloc(i64 %19)
%21 = tail call i8* @malloc(i64 %19)
%22 = shl nsw i32 %5, 1
%23 = add nsw i32 %22, -1
%24 = sext i32 %23 to i64
%25 = shl nsw i64 %24, 2
%26 = tail call i8* @malloc(i64 %25)
%27 = bitcast i8* %26 to i32*
%28 = icmp sgt i32 %5, 0
br i1 %28, label %29, label %33
29: ; preds = %6
%30 = bitcast i32* %1 to i8*
%31 = zext i32 %5 to i64
%32 = shl nuw nsw i64 %31, 2
br label %33
33: ; preds = %29, %6
%34 = icmp sgt i32 %23, %5
br i1 %34, label %35, label %41
35: ; preds = %33
%36 = getelementptr i8, i8* %26, i64 %15
%37 = add i32 %5, -2
%38 = zext i32 %37 to i64
%39 = shl nuw nsw i64 %38, 2
%40 = add nuw nsw i64 %39, 4
br label %41
41: ; preds = %35, %33
%42 = add nsw i32 %22, -2
store i32 %42, i32* %17
tail call void @llvm.memset.p0i8.i64(i8* align 1 %20, i8 0, i64 %19, i1 false)
tail call void @llvm.memset.p0i8.i64(i8* align 1 %21, i8 0, i64 %19, i1 false)
br label %43
43: ; preds = %41, %122
%44 = phi i32 [ 0, %41 ], [ %127, %122 ]
%45 = phi i32 [ 0, %41 ], [ %124, %122 ]
br label %46
46: ; preds = %72, %43
%47 = phi i32 [ %44, %43 ], [ %79, %72 ]
%48 = zext i32 %47 to i64
%49 = getelementptr inbounds i32, i32* %17, i64 %48
%50 = load i32, i32* %49
%51 = sub nsw i32 %50, %5
%52 = shl nsw i32 %51, 2
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds double, double* %0, i64 %53
%55 = load double, double* %54
%56 = fptosi double %55 to i32
%57 = getelementptr inbounds double, double* %54, i64 1
%58 = load double, double* %57
%59 = fptosi double %58 to i32
%60 = icmp slt i32 %56, %5
br i1 %60, label %82, label %61
61: ; preds = %46
%62 = sext i32 %51 to i64
%63 = lshr i64 %62, 3
%64 = getelementptr inbounds i8, i8* %20, i64 %63
%65 = load i8, i8* %64
%66 = zext i8 %65 to i32
%67 = and i32 %51, 7
%68 = xor i32 %67, 7
%69 = shl nuw i32 1, %68
%70 = and i32 %69, %66
%71 = icmp eq i32 %70, 0
br i1 %71, label %72, label %82
72: ; preds = %61, %84
%73 = phi i32 [ %92, %84 ], [ %69, %61 ]
%74 = phi i8 [ %88, %84 ], [ %65, %61 ]
%75 = phi i8* [ %87, %84 ], [ %64, %61 ]
%76 = phi i32 [ %59, %84 ], [ %56, %61 ]
%77 = trunc i32 %73 to i8
%78 = or i8 %74, %77
store i8 %78, i8* %75
%79 = add nuw nsw i32 %47, 1
%80 = zext i32 %79 to i64
%81 = getelementptr inbounds i32, i32* %17, i64 %80
store i32 %76, i32* %81
br label %46
82: ; preds = %61, %46
%83 = icmp slt i32 %59, %5
br i1 %83, label %95, label %84
84: ; preds = %82
%85 = sext i32 %51 to i64
%86 = lshr i64 %85, 3
%87 = getelementptr inbounds i8, i8* %21, i64 %86
%88 = load i8, i8* %87
%89 = zext i8 %88 to i32
%90 = and i32 %51, 7
%91 = xor i32 %90, 7
%92 = shl nuw i32 1, %91
%93 = and i32 %92, %89
%94 = icmp eq i32 %93, 0
br i1 %94, label %72, label %95
95: ; preds = %84, %82
%96 = sext i32 %56 to i64
%97 = getelementptr inbounds i32, i32* %27, i64 %96
%98 = load i32, i32* %97
%99 = sext i32 %59 to i64
%100 = getelementptr inbounds i32, i32* %27, i64 %99
%101 = load i32, i32* %100
%102 = icmp eq i32 %98, %101
br i1 %102, label %122, label %103
103: ; preds = %95
%104 = icmp eq i32 %98, -1
br i1 %104, label %112, label %105
105: ; preds = %103
%106 = icmp slt i32 %45, %4
br i1 %106, label %107, label %129
107: ; preds = %105
%108 = sext i32 %45 to i64
%109 = getelementptr inbounds i32, i32* %2, i64 %108
store i32 %56, i32* %109
%110 = getelementptr inbounds i32, i32* %3, i64 %108
store i32 %98, i32* %110
%111 = add nsw i32 %45, 1
br label %112
112: ; preds = %107, %103
%113 = phi i32 [ %111, %107 ], [ %45, %103 ]
%114 = icmp eq i32 %101, -1
br i1 %114, label %122, label %115
115: ; preds = %112
%116 = icmp slt i32 %113, %4
br i1 %116, label %117, label %129
117: ; preds = %115
%118 = sext i32 %113 to i64
%119 = getelementptr inbounds i32, i32* %2, i64 %118
store i32 %59, i32* %119
%120 = getelementptr inbounds i32, i32* %3, i64 %118
store i32 %101, i32* %120
%121 = add nsw i32 %113, 1
br label %122
122: ; preds = %112, %117, %95
%123 = phi i32 [ %98, %95 ], [ -1, %117 ], [ -1, %112 ]
%124 = phi i32 [ %45, %95 ], [ %121, %117 ], [ %113, %112 ]
%125 = sext i32 %50 to i64
%126 = getelementptr inbounds i32, i32* %27, i64 %125
store i32 %123, i32* %126
%127 = add nsw i32 %47, -1
%128 = icmp sgt i32 %47, 0
br i1 %128, label %43, label %129
129: ; preds = %115, %105, %122
%130 = phi i32 [ %45, %105 ], [ %113, %115 ], [ %124, %122 ]
%131 = phi i32 [ %50, %105 ], [ %50, %115 ], [ -1, %122 ]
%132 = shl i32 %5, 2
%133 = add i32 %132, -8
%134 = sext i32 %133 to i64
%135 = getelementptr inbounds double, double* %0, i64 %134
%136 = bitcast double* %135 to <2 x double>*
%137 = load <2 x double>, <2 x double>* %136
%138 = fptosi <2 x double> %137 to <2 x i32>
%139 = extractelement <2 x i32> %138, i64 0
%140 = sext i32 %139 to i64
%141 = getelementptr inbounds i32, i32* %27, i64 %140
%142 = load i32, i32* %141
%143 = extractelement <2 x i32> %138, i64 1
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds i32, i32* %27, i64 %144
%146 = load i32, i32* %145
%147 = icmp eq i32 %142, %146
%148 = icmp ne i32 %142, -1
%149 = and i1 %148, %147
%150 = icmp eq i32 %131, -1
%151 = select i1 %149, i1 %150, i1 false
br i1 %151, label %152, label %158
152: ; preds = %129
%153 = icmp slt i32 %130, %4
br i1 %153, label %154, label %158
154: ; preds = %152
%155 = sext i32 %130 to i64
%156 = getelementptr inbounds i32, i32* %2, i64 %155
store i32 %42, i32* %156
%157 = getelementptr inbounds i32, i32* %3, i64 %155
store i32 %142, i32* %157
br label %158
158: ; preds = %152, %129, %154
%159 = phi i32 [ -1, %154 ], [ %131, %129 ], [ %42, %152 ]
tail call void @free(i8* %16)
tail call void @free(i8* %20)
tail call void @free(i8* %21)
tail call void @free(i8* %26)
ret i32 %159
}