#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 */
typedef size_t uint32_t;
typedef int int8_t;

/* Variables and functions */
int partition_double(double *pa, uint32_t *pidx, int8_t no_dims,
                     uint32_t start_idx, uint32_t n, double *bbox,
                     int8_t *cut_dim, double *cut_val, uint32_t *n_lo) {
  int8_t dim = 0;
  uint32_t p, q;
  double size = 0, min_val, max_val, split, side_len, cur_val;
  uint32_t end_idx = start_idx + n - 1;
  for (int8_t i = 0; i < no_dims; i++) {
    side_len = bbox[2 * i + 1] - bbox[2 * i];
    if (side_len > size) {
      dim = i;
      size = side_len;
    }
  }
  min_val = bbox[2 * dim];
  max_val = bbox[2 * dim + 1];
  if (min_val >= max_val)
    return 1;
  split = (min_val + max_val) / 2;
  p = start_idx;
  q = end_idx;
  while (p <= q) {
    if ((pa[no_dims * pidx[p] + dim]) < split) {
      p++;
    } else if ((pa[no_dims * pidx[q] + dim]) >= split) {
      if (q > 0) {
        q--;
      } else {
        break;
      }
    } else {
      {
        uint32_t tmp = pidx[p];
        pidx[p] = pidx[q];
        pidx[q] = tmp;
      };
      p++;
      q--;
    }
  }
  if (p == start_idx) {
    uint32_t j = start_idx;
    split = (pa[no_dims * pidx[j] + dim]);
    for (uint32_t i = start_idx + 1; i <= end_idx; i++) {
      cur_val = (pa[no_dims * pidx[i] + dim]);
      if (cur_val < split) {
        j = i;
        split = cur_val;
      }
    }
    {
      uint32_t tmp = pidx[j];
      pidx[j] = pidx[start_idx];
      pidx[start_idx] = tmp;
    };
    p = start_idx + 1;
  } else if (p == end_idx + 1) {
    uint32_t j = end_idx;
    split = (pa[no_dims * pidx[j] + dim]);
    for (uint32_t i = start_idx; i < end_idx; i++) {
      cur_val = (pa[no_dims * pidx[i] + dim]);
      if (cur_val > split) {
        j = i;
        split = cur_val;
      }
    }
    {
      uint32_t tmp = pidx[j];
      pidx[j] = pidx[end_idx];
      pidx[end_idx] = tmp;
    };
    p = end_idx;
  }
  *cut_dim = dim;
  *cut_val = split;
  *n_lo = p - start_idx;
  return 0;
}


x86 assembly (clang, -O0):
<partition_double>:
push   %rbp
mov    %rsp,%rbp
sub    $0x48,%rsp
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x28(%rbp),%rax
add    -0x30(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x88(%rbp)
movl   $0x0,-0x8c(%rbp)
mov    -0x8c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11d4 <partition_double+0xd4>
mov    -0x38(%rbp),%rax
mov    -0x8c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x38(%rbp),%rax
mov    -0x8c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
ucomisd -0x58(%rbp),%xmm0
jbe    11bb <partition_double+0xbb>
mov    -0x8c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    11c0 <partition_double+0xc0>
mov    -0x8c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8c(%rbp)
jmp    1157 <partition_double+0x57>
mov    -0x38(%rbp),%rax
mov    -0x3c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x3c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x60(%rbp),%xmm0
ucomisd -0x68(%rbp),%xmm0
jb     1221 <partition_double+0x121>
movl   $0x1,-0x4(%rbp)
jmp    15dc <partition_double+0x4dc>
movsd  -0x60(%rbp),%xmm0
addsd  -0x68(%rbp),%xmm0
movsd  0xdcd(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x88(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x50(%rbp),%rax
ja     1350 <partition_double+0x250>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    -0x18(%rbp),%rdx
mov    -0x48(%rbp),%rsi
imul   (%rdx,%rsi,8),%rcx
movslq -0x3c(%rbp),%rdx
add    %rdx,%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x70(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    129e <partition_double+0x19e>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    134b <partition_double+0x24b>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    -0x18(%rbp),%rdx
mov    -0x50(%rbp),%rsi
imul   (%rdx,%rsi,8),%rcx
movslq -0x3c(%rbp),%rdx
add    %rdx,%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x70(%rbp),%xmm0
jb     12f0 <partition_double+0x1f0>
cmpq   $0x0,-0x50(%rbp)
jbe    12e6 <partition_double+0x1e6>
mov    -0x50(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x50(%rbp)
jmp    12eb <partition_double+0x1eb>
jmp    1350 <partition_double+0x250>
jmp    1346 <partition_double+0x246>
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x98(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x50(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x98(%rbp),%rdx
mov    -0x18(%rbp),%rax
mov    -0x50(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x50(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x50(%rbp)
jmp    134b <partition_double+0x24b>
jmp    124f <partition_double+0x14f>
mov    -0x48(%rbp),%rax
cmp    -0x28(%rbp),%rax
jne    147b <partition_double+0x37b>
mov    -0x28(%rbp),%rax
mov    %rax,-0xa0(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    -0x18(%rbp),%rdx
mov    -0xa0(%rbp),%rsi
imul   (%rdx,%rsi,8),%rcx
movslq -0x3c(%rbp),%rdx
add    %rdx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0xa8(%rbp)
mov    -0xa8(%rbp),%rax
cmp    -0x88(%rbp),%rax
ja     1426 <partition_double+0x326>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    -0x18(%rbp),%rdx
mov    -0xa8(%rbp),%rsi
imul   (%rdx,%rsi,8),%rcx
movslq -0x3c(%rbp),%rdx
add    %rdx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm1
movsd  -0x70(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    140a <partition_double+0x30a>
mov    -0xa8(%rbp),%rax
mov    %rax,-0xa0(%rbp)
movsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
jmp    140f <partition_double+0x30f>
mov    -0xa8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0xa8(%rbp)
jmp    13a1 <partition_double+0x2a1>
mov    -0x18(%rbp),%rax
mov    -0xa0(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0xb0(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x18(%rbp),%rax
mov    -0xa0(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0xb0(%rbp),%rdx
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    15b0 <partition_double+0x4b0>
mov    -0x48(%rbp),%rax
mov    -0x88(%rbp),%rcx
add    $0x1,%rcx
cmp    %rcx,%rax
jne    15ab <partition_double+0x4ab>
mov    -0x88(%rbp),%rax
mov    %rax,-0xb8(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    -0x18(%rbp),%rdx
mov    -0xb8(%rbp),%rsi
imul   (%rdx,%rsi,8),%rcx
movslq -0x3c(%rbp),%rdx
add    %rdx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0xc0(%rbp)
mov    -0xc0(%rbp),%rax
cmp    -0x88(%rbp),%rax
jae    1556 <partition_double+0x456>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    -0x18(%rbp),%rdx
mov    -0xc0(%rbp),%rsi
imul   (%rdx,%rsi,8),%rcx
movslq -0x3c(%rbp),%rdx
add    %rdx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
ucomisd -0x70(%rbp),%xmm0
jbe    153a <partition_double+0x43a>
mov    -0xc0(%rbp),%rax
mov    %rax,-0xb8(%rbp)
movsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
jmp    153f <partition_double+0x43f>
mov    -0xc0(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0xc0(%rbp)
jmp    14d5 <partition_double+0x3d5>
mov    -0x18(%rbp),%rax
mov    -0xb8(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0xc8(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x88(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x18(%rbp),%rax
mov    -0xb8(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0xc8(%rbp),%rdx
mov    -0x18(%rbp),%rax
mov    -0x88(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x88(%rbp),%rax
mov    %rax,-0x48(%rbp)
jmp    15b0 <partition_double+0x4b0>
mov    -0x3c(%rbp),%ecx
mov    0x10(%rbp),%rax
mov    %ecx,(%rax)
movsd  -0x70(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x48(%rbp),%rcx
sub    -0x28(%rbp),%rcx
mov    0x20(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x48,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<partition_double>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %edx,%edx
jle    1121 <partition_double+0x21>
mov    %edx,%r11d
cmp    $0x1,%edx
jne    1126 <partition_double+0x26>
xorpd  %xmm0,%xmm0
xor    %ebx,%ebx
xor    %r10d,%r10d
jmp    117f <partition_double+0x7f>
xor    %r10d,%r10d
jmp    11a1 <partition_double+0xa1>
mov    %r11d,%r14d
and    $0xfffffffe,%r14d
lea    0x18(%r9),%rbp
xorpd  %xmm0,%xmm0
xor    %ebx,%ebx
xor    %r10d,%r10d
nopw   0x0(%rax,%rax,1)
movsd  -0x10(%rbp),%xmm1
subsd  -0x18(%rbp),%xmm1
ucomisd %xmm0,%xmm1
maxsd  %xmm0,%xmm1
movsd  0x0(%rbp),%xmm0
mov    %r10d,%eax
cmova  %ebx,%eax
subsd  -0x8(%rbp),%xmm0
ucomisd %xmm1,%xmm0
lea    0x1(%rbx),%r10d
cmovbe %eax,%r10d
maxsd  %xmm1,%xmm0
add    $0x2,%rbx
add    $0x20,%rbp
cmp    %r14,%rbx
jne    1140 <partition_double+0x40>
test   $0x1,%r11b
je     11a1 <partition_double+0xa1>
mov    %rbx,%rax
shl    $0x4,%rax
movsd  0x8(%r9,%rax,1),%xmm1
subsd  (%r9,%rax,1),%xmm1
ucomisd %xmm0,%xmm1
cmova  %ebx,%r10d
lea    (%r10,%r10,1),%eax
cltq
movsd  (%r9,%rax,8),%xmm0
lea    (%r10,%r10,1),%eax
add    $0x1,%eax
cltq
movsd  (%r9,%rax,8),%xmm1
mov    $0x1,%eax
ucomisd %xmm1,%xmm0
jae    12ee <partition_double+0x1ee>
mov    0x38(%rsp),%r14
lea    (%r8,%rcx,1),%r13
add    $0xffffffffffffffff,%r13
movslq %edx,%r9
movslq %r10d,%r11
cmp    %rcx,%r13
jb     1267 <partition_double+0x167>
lea    (%r8,%rcx,1),%r15
addsd  %xmm1,%xmm0
mulsd  0xe09(%rip),%xmm0
mov    %rcx,%r12
mov    %r13,%rdx
jmp    1209 <partition_double+0x109>
nop
add    $0x1,%r12
cmp    %rdx,%r12
ja     125e <partition_double+0x15e>
mov    (%rsi,%r12,8),%rbx
mov    %rbx,%rax
imul   %r9,%rax
add    %r11,%rax
ucomisd (%rdi,%rax,8),%xmm0
ja     1200 <partition_double+0x100>
mov    (%rsi,%rdx,8),%rbp
mov    %rbp,%rax
imul   %r9,%rax
add    %r11,%rax
movsd  (%rdi,%rax,8),%xmm1
ucomisd %xmm0,%xmm1
jae    1250 <partition_double+0x150>
mov    %rbp,(%rsi,%r12,8)
mov    %rbx,(%rsi,%rdx,8)
add    $0x1,%r12
jmp    1255 <partition_double+0x155>
cs nopw 0x0(%rax,%rax,1)
nop
test   %rdx,%rdx
je     125e <partition_double+0x15e>
add    $0xffffffffffffffff,%rdx
cmp    %rdx,%r12
jbe    1209 <partition_double+0x109>
cmp    %rcx,%r12
jne    12f9 <partition_double+0x1f9>
mov    (%rsi,%rcx,8),%r8
mov    %r8,%rax
imul   %r9,%rax
add    %r11,%rax
movsd  (%rdi,%rax,8),%xmm0
lea    0x1(%rcx),%r12
cmp    %r13,%r12
jbe    128b <partition_double+0x18b>
mov    %r8,%rax
mov    %rcx,%rdx
jmp    12cd <partition_double+0x1cd>
mov    %r12,%rbx
mov    %rcx,%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movapd %xmm0,%xmm1
mov    (%rsi,%rbx,8),%rax
imul   %r9,%rax
add    %r11,%rax
movsd  (%rdi,%rax,8),%xmm0
ucomisd %xmm0,%xmm1
cmova  %rbx,%rdx
minsd  %xmm1,%xmm0
add    $0x1,%rbx
cmp    %r13,%rbx
jbe    12a0 <partition_double+0x1a0>
mov    (%rsi,%rdx,8),%rax
mov    %r8,(%rsi,%rdx,8)
mov    %rax,(%rsi,%rcx,8)
mov    %r10d,(%r14)
mov    0x40(%rsp),%rax
movsd  %xmm0,(%rax)
sub    %rcx,%r12
mov    0x48(%rsp),%rax
mov    %r12,(%rax)
xor    %eax,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
cmp    %r15,%r12
jne    12d5 <partition_double+0x1d5>
mov    -0x8(%rsi,%r15,8),%rbp
mov    %rbp,%rax
imul   %r9,%rax
add    %r11,%rax
movsd  (%rdi,%rax,8),%xmm0
cmp    %rcx,%r13
jbe    1349 <partition_double+0x249>
test   $0x1,%r8b
jne    1351 <partition_double+0x251>
mov    (%rsi,%rcx,8),%rax
imul   %r9,%rax
add    %r11,%rax
movsd  (%rdi,%rax,8),%xmm1
ucomisd %xmm0,%xmm1
maxsd  %xmm0,%xmm1
mov    %r13,%rdx
cmova  %rcx,%rdx
lea    0x1(%rcx),%rbx
movapd %xmm1,%xmm0
mov    %rdx,%r12
jmp    1357 <partition_double+0x257>
mov    %rbp,%rax
mov    %r13,%rdx
jmp    13ad <partition_double+0x2ad>
mov    %rcx,%rbx
mov    %r13,%r12
cmp    $0x2,%r8
je     13a9 <partition_double+0x2a9>
nopl   (%rax)
mov    (%rsi,%rbx,8),%rax
imul   %r9,%rax
add    %r11,%rax
movsd  (%rdi,%rax,8),%xmm1
ucomisd %xmm0,%xmm1
cmova  %rbx,%r12
maxsd  %xmm0,%xmm1
mov    0x8(%rsi,%rbx,8),%rax
imul   %r9,%rax
add    %r11,%rax
movsd  (%rdi,%rax,8),%xmm0
ucomisd %xmm1,%xmm0
lea    0x1(%rbx),%rdx
cmovbe %r12,%rdx
maxsd  %xmm1,%xmm0
add    $0x2,%rbx
mov    %rdx,%r12
cmp    %r13,%rbx
jne    1360 <partition_double+0x260>
mov    (%rsi,%rdx,8),%rax
mov    %rbp,(%rsi,%rdx,8)
mov    %rax,-0x8(%rsi,%r15,8)
mov    %r13,%r12
jmp    12d5 <partition_double+0x1d5>

LLVM IR (-O0):
define i32 @partition_double(double* %0, i64* %1, i32 %2, i64 %3, i64 %4, double* %5, i32* %6, double* %7, i64* %8) {
%10 = alloca i32
%11 = alloca double*
%12 = alloca i64*
%13 = alloca i32
%14 = alloca i64
%15 = alloca i64
%16 = alloca double*
%17 = alloca i32*
%18 = alloca double*
%19 = alloca i64*
%20 = alloca i32
%21 = alloca i64
%22 = alloca i64
%23 = alloca double
%24 = alloca double
%25 = alloca double
%26 = alloca double
%27 = alloca double
%28 = alloca double
%29 = alloca i64
%30 = alloca i32
%31 = alloca i64
%32 = alloca i64
%33 = alloca i64
%34 = alloca i64
%35 = alloca i64
%36 = alloca i64
%37 = alloca i64
store double* %0, double** %11
store i64* %1, i64** %12
store i32 %2, i32* %13
store i64 %3, i64* %14
store i64 %4, i64* %15
store double* %5, double** %16
store i32* %6, i32** %17
store double* %7, double** %18
store i64* %8, i64** %19
store i32 0, i32* %20
store double 0.000000e+00, double* %23
%38 = load i64, i64* %14
%39 = load i64, i64* %15
%40 = add i64 %38, %39
%41 = sub i64 %40, 1
store i64 %41, i64* %29
store i32 0, i32* %30
br label %42
42: ; preds = %68, %9
%43 = load i32, i32* %30
%44 = load i32, i32* %13
%45 = icmp slt i32 %43, %44
br i1 %45, label %46, label %71
46: ; preds = %42
%47 = load double*, double** %16
%48 = load i32, i32* %30
%49 = mul nsw i32 2, %48
%50 = add nsw i32 %49, 1
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds double, double* %47, i64 %51
%53 = load double, double* %52
%54 = load double*, double** %16
%55 = load i32, i32* %30
%56 = mul nsw i32 2, %55
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds double, double* %54, i64 %57
%59 = load double, double* %58
%60 = fsub double %53, %59
store double %60, double* %27
%61 = load double, double* %27
%62 = load double, double* %23
%63 = fcmp ogt double %61, %62
br i1 %63, label %64, label %67
64: ; preds = %46
%65 = load i32, i32* %30
store i32 %65, i32* %20
%66 = load double, double* %27
store double %66, double* %23
br label %67
67: ; preds = %64, %46
br label %68
68: ; preds = %67
%69 = load i32, i32* %30
%70 = add nsw i32 %69, 1
store i32 %70, i32* %30
br label %42
71: ; preds = %42
%72 = load double*, double** %16
%73 = load i32, i32* %20
%74 = mul nsw i32 2, %73
%75 = sext i32 %74 to i64
%76 = getelementptr inbounds double, double* %72, i64 %75
%77 = load double, double* %76
store double %77, double* %24
%78 = load double*, double** %16
%79 = load i32, i32* %20
%80 = mul nsw i32 2, %79
%81 = add nsw i32 %80, 1
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds double, double* %78, i64 %82
%84 = load double, double* %83
store double %84, double* %25
%85 = load double, double* %24
%86 = load double, double* %25
%87 = fcmp oge double %85, %86
br i1 %87, label %88, label %89
88: ; preds = %71
store i32 1, i32* %10
br label %308
89: ; preds = %71
%90 = load double, double* %24
%91 = load double, double* %25
%92 = fadd double %90, %91
%93 = fdiv double %92, 2.000000e+00
store double %93, double* %26
%94 = load i64, i64* %14
store i64 %94, i64* %21
%95 = load i64, i64* %29
store i64 %95, i64* %22
br label %96
96: ; preds = %164, %89
%97 = load i64, i64* %21
%98 = load i64, i64* %22
%99 = icmp ule i64 %97, %98
br i1 %99, label %100, label %165
100: ; preds = %96
%101 = load double*, double** %11
%102 = load i32, i32* %13
%103 = sext i32 %102 to i64
%104 = load i64*, i64** %12
%105 = load i64, i64* %21
%106 = getelementptr inbounds i64, i64* %104, i64 %105
%107 = load i64, i64* %106
%108 = mul i64 %103, %107
%109 = load i32, i32* %20
%110 = sext i32 %109 to i64
%111 = add i64 %108, %110
%112 = getelementptr inbounds double, double* %101, i64 %111
%113 = load double, double* %112
%114 = load double, double* %26
%115 = fcmp olt double %113, %114
br i1 %115, label %116, label %119
116: ; preds = %100
%117 = load i64, i64* %21
%118 = add i64 %117, 1
store i64 %118, i64* %21
br label %164
119: ; preds = %100
%120 = load double*, double** %11
%121 = load i32, i32* %13
%122 = sext i32 %121 to i64
%123 = load i64*, i64** %12
%124 = load i64, i64* %22
%125 = getelementptr inbounds i64, i64* %123, i64 %124
%126 = load i64, i64* %125
%127 = mul i64 %122, %126
%128 = load i32, i32* %20
%129 = sext i32 %128 to i64
%130 = add i64 %127, %129
%131 = getelementptr inbounds double, double* %120, i64 %130
%132 = load double, double* %131
%133 = load double, double* %26
%134 = fcmp oge double %132, %133
br i1 %134, label %135, label %143
135: ; preds = %119
%136 = load i64, i64* %22
%137 = icmp ugt i64 %136, 0
br i1 %137, label %138, label %141
138: ; preds = %135
%139 = load i64, i64* %22
%140 = add i64 %139, -1
store i64 %140, i64* %22
br label %142
141: ; preds = %135
br label %165
142: ; preds = %138
br label %163
143: ; preds = %119
%144 = load i64*, i64** %12
%145 = load i64, i64* %21
%146 = getelementptr inbounds i64, i64* %144, i64 %145
%147 = load i64, i64* %146
store i64 %147, i64* %31
%148 = load i64*, i64** %12
%149 = load i64, i64* %22
%150 = getelementptr inbounds i64, i64* %148, i64 %149
%151 = load i64, i64* %150
%152 = load i64*, i64** %12
%153 = load i64, i64* %21
%154 = getelementptr inbounds i64, i64* %152, i64 %153
store i64 %151, i64* %154
%155 = load i64, i64* %31
%156 = load i64*, i64** %12
%157 = load i64, i64* %22
%158 = getelementptr inbounds i64, i64* %156, i64 %157
store i64 %155, i64* %158
%159 = load i64, i64* %21
%160 = add i64 %159, 1
store i64 %160, i64* %21
%161 = load i64, i64* %22
%162 = add i64 %161, -1
store i64 %162, i64* %22
br label %163
163: ; preds = %143, %142
br label %164
164: ; preds = %163, %116
br label %96
165: ; preds = %141, %96
%166 = load i64, i64* %21
%167 = load i64, i64* %14
%168 = icmp eq i64 %166, %167
br i1 %168, label %169, label %232
169: ; preds = %165
%170 = load i64, i64* %14
store i64 %170, i64* %32
%171 = load double*, double** %11
%172 = load i32, i32* %13
%173 = sext i32 %172 to i64
%174 = load i64*, i64** %12
%175 = load i64, i64* %32
%176 = getelementptr inbounds i64, i64* %174, i64 %175
%177 = load i64, i64* %176
%178 = mul i64 %173, %177
%179 = load i32, i32* %20
%180 = sext i32 %179 to i64
%181 = add i64 %178, %180
%182 = getelementptr inbounds double, double* %171, i64 %181
%183 = load double, double* %182
store double %183, double* %26
%184 = load i64, i64* %14
%185 = add i64 %184, 1
store i64 %185, i64* %33
br label %186
186: ; preds = %211, %169
%187 = load i64, i64* %33
%188 = load i64, i64* %29
%189 = icmp ule i64 %187, %188
br i1 %189, label %190, label %214
190: ; preds = %186
%191 = load double*, double** %11
%192 = load i32, i32* %13
%193 = sext i32 %192 to i64
%194 = load i64*, i64** %12
%195 = load i64, i64* %33
%196 = getelementptr inbounds i64, i64* %194, i64 %195
%197 = load i64, i64* %196
%198 = mul i64 %193, %197
%199 = load i32, i32* %20
%200 = sext i32 %199 to i64
%201 = add i64 %198, %200
%202 = getelementptr inbounds double, double* %191, i64 %201
%203 = load double, double* %202
store double %203, double* %28
%204 = load double, double* %28
%205 = load double, double* %26
%206 = fcmp olt double %204, %205
br i1 %206, label %207, label %210
207: ; preds = %190
%208 = load i64, i64* %33
store i64 %208, i64* %32
%209 = load double, double* %28
store double %209, double* %26
br label %210
210: ; preds = %207, %190
br label %211
211: ; preds = %210
%212 = load i64, i64* %33
%213 = add i64 %212, 1
store i64 %213, i64* %33
br label %186
214: ; preds = %186
%215 = load i64*, i64** %12
%216 = load i64, i64* %32
%217 = getelementptr inbounds i64, i64* %215, i64 %216
%218 = load i64, i64* %217
store i64 %218, i64* %34
%219 = load i64*, i64** %12
%220 = load i64, i64* %14
%221 = getelementptr inbounds i64, i64* %219, i64 %220
%222 = load i64, i64* %221
%223 = load i64*, i64** %12
%224 = load i64, i64* %32
%225 = getelementptr inbounds i64, i64* %223, i64 %224
store i64 %222, i64* %225
%226 = load i64, i64* %34
%227 = load i64*, i64** %12
%228 = load i64, i64* %14
%229 = getelementptr inbounds i64, i64* %227, i64 %228
store i64 %226, i64* %229
%230 = load i64, i64* %14
%231 = add i64 %230, 1
store i64 %231, i64* %21
br label %299
232: ; preds = %165
%233 = load i64, i64* %21
%234 = load i64, i64* %29
%235 = add i64 %234, 1
%236 = icmp eq i64 %233, %235
br i1 %236, label %237, label %298
237: ; preds = %232
%238 = load i64, i64* %29
store i64 %238, i64* %35
%239 = load double*, double** %11
%240 = load i32, i32* %13
%241 = sext i32 %240 to i64
%242 = load i64*, i64** %12
%243 = load i64, i64* %35
%244 = getelementptr inbounds i64, i64* %242, i64 %243
%245 = load i64, i64* %244
%246 = mul i64 %241, %245
%247 = load i32, i32* %20
%248 = sext i32 %247 to i64
%249 = add i64 %246, %248
%250 = getelementptr inbounds double, double* %239, i64 %249
%251 = load double, double* %250
store double %251, double* %26
%252 = load i64, i64* %14
store i64 %252, i64* %36
br label %253
253: ; preds = %278, %237
%254 = load i64, i64* %36
%255 = load i64, i64* %29
%256 = icmp ult i64 %254, %255
br i1 %256, label %257, label %281
257: ; preds = %253
%258 = load double*, double** %11
%259 = load i32, i32* %13
%260 = sext i32 %259 to i64
%261 = load i64*, i64** %12
%262 = load i64, i64* %36
%263 = getelementptr inbounds i64, i64* %261, i64 %262
%264 = load i64, i64* %263
%265 = mul i64 %260, %264
%266 = load i32, i32* %20
%267 = sext i32 %266 to i64
%268 = add i64 %265, %267
%269 = getelementptr inbounds double, double* %258, i64 %268
%270 = load double, double* %269
store double %270, double* %28
%271 = load double, double* %28
%272 = load double, double* %26
%273 = fcmp ogt double %271, %272
br i1 %273, label %274, label %277
274: ; preds = %257
%275 = load i64, i64* %36
store i64 %275, i64* %35
%276 = load double, double* %28
store double %276, double* %26
br label %277
277: ; preds = %274, %257
br label %278
278: ; preds = %277
%279 = load i64, i64* %36
%280 = add i64 %279, 1
store i64 %280, i64* %36
br label %253
281: ; preds = %253
%282 = load i64*, i64** %12
%283 = load i64, i64* %35
%284 = getelementptr inbounds i64, i64* %282, i64 %283
%285 = load i64, i64* %284
store i64 %285, i64* %37
%286 = load i64*, i64** %12
%287 = load i64, i64* %29
%288 = getelementptr inbounds i64, i64* %286, i64 %287
%289 = load i64, i64* %288
%290 = load i64*, i64** %12
%291 = load i64, i64* %35
%292 = getelementptr inbounds i64, i64* %290, i64 %291
store i64 %289, i64* %292
%293 = load i64, i64* %37
%294 = load i64*, i64** %12
%295 = load i64, i64* %29
%296 = getelementptr inbounds i64, i64* %294, i64 %295
store i64 %293, i64* %296
%297 = load i64, i64* %29
store i64 %297, i64* %21
br label %298
298: ; preds = %281, %232
br label %299
299: ; preds = %298, %214
%300 = load i32, i32* %20
%301 = load i32*, i32** %17
store i32 %300, i32* %301
%302 = load double, double* %26
%303 = load double*, double** %18
store double %302, double* %303
%304 = load i64, i64* %21
%305 = load i64, i64* %14
%306 = sub i64 %304, %305
%307 = load i64*, i64** %19
store i64 %306, i64* %307
store i32 0, i32* %10
br label %308
308: ; preds = %299, %88
%309 = load i32, i32* %10
ret i32 %309
}

LLVM IR (-O2):
define i32 @partition_double(double* nocapture %0, i64* nocapture %1, i32 %2, i64 %3, i64 %4, double* nocapture %5, i32* nocapture writeonly %6, double* nocapture writeonly %7, i64* nocapture writeonly %8) {
%10 = add i64 %4, %3
%11 = add i64 %10, -1
%12 = icmp sgt i32 %2, 0
br i1 %12, label %13, label %36
13: ; preds = %9
%14 = zext i32 %2 to i64
%15 = and i64 %14, 1
%16 = icmp eq i32 %2, 1
br i1 %16, label %19, label %17
17: ; preds = %13
%18 = and i64 %14, 4294967294
br label %47
19: ; preds = %47, %13
%20 = phi i32 [ undef, %13 ], [ %74, %47 ]
%21 = phi i64 [ 0, %13 ], [ %75, %47 ]
%22 = phi i32 [ 0, %13 ], [ %74, %47 ]
%23 = phi double [ 0.000000e+00, %13 ], [ %72, %47 ]
%24 = icmp eq i64 %15, 0
br i1 %24, label %36, label %25
25: ; preds = %19
%26 = shl nuw nsw i64 %21, 1
%27 = or i64 %26, 1
%28 = getelementptr inbounds double, double* %5, i64 %27
%29 = load double, double* %28
%30 = getelementptr inbounds double, double* %5, i64 %26
%31 = load double, double* %30
%32 = fsub double %29, %31
%33 = fcmp ogt double %32, %23
%34 = trunc i64 %21 to i32
%35 = select i1 %33, i32 %34, i32 %22
br label %36
36: ; preds = %25, %19, %9
%37 = phi i32 [ 0, %9 ], [ %20, %19 ], [ %35, %25 ]
%38 = shl nsw i32 %37, 1
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds double, double* %5, i64 %39
%41 = load double, double* %40
%42 = or i32 %38, 1
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds double, double* %5, i64 %43
%45 = load double, double* %44
%46 = fcmp ult double %41, %45
br i1 %46, label %78, label %225
47: ; preds = %47, %17
%48 = phi i64 [ 0, %17 ], [ %75, %47 ]
%49 = phi i32 [ 0, %17 ], [ %74, %47 ]
%50 = phi double [ 0.000000e+00, %17 ], [ %72, %47 ]
%51 = phi i64 [ 0, %17 ], [ %76, %47 ]
%52 = shl nuw nsw i64 %48, 1
%53 = or i64 %52, 1
%54 = getelementptr inbounds double, double* %5, i64 %53
%55 = load double, double* %54
%56 = getelementptr inbounds double, double* %5, i64 %52
%57 = load double, double* %56
%58 = fsub double %55, %57
%59 = fcmp ogt double %58, %50
%60 = select i1 %59, double %58, double %50
%61 = trunc i64 %48 to i32
%62 = select i1 %59, i32 %61, i32 %49
%63 = or i64 %48, 1
%64 = shl nuw nsw i64 %63, 1
%65 = or i64 %64, 1
%66 = getelementptr inbounds double, double* %5, i64 %65
%67 = load double, double* %66
%68 = getelementptr inbounds double, double* %5, i64 %64
%69 = load double, double* %68
%70 = fsub double %67, %69
%71 = fcmp ogt double %70, %60
%72 = select i1 %71, double %70, double %60
%73 = trunc i64 %63 to i32
%74 = select i1 %71, i32 %73, i32 %62
%75 = add nuw nsw i64 %48, 2
%76 = add nuw i64 %51, 2
%77 = icmp eq i64 %76, %18
br i1 %77, label %19, label %47
78: ; preds = %36
%79 = fadd double %41, %45
%80 = fmul double %79, 5.000000e-01
%81 = icmp ult i64 %11, %3
br i1 %81, label %119, label %82
82: ; preds = %78
%83 = sext i32 %2 to i64
%84 = sext i32 %37 to i64
br label %85
85: ; preds = %82, %112
%86 = phi i64 [ %3, %82 ], [ %114, %112 ]
%87 = phi i64 [ %11, %82 ], [ %113, %112 ]
%88 = getelementptr inbounds i64, i64* %1, i64 %86
%89 = load i64, i64* %88
%90 = mul i64 %89, %83
%91 = add i64 %90, %84
%92 = getelementptr inbounds double, double* %0, i64 %91
%93 = load double, double* %92
%94 = fcmp olt double %93, %80
br i1 %94, label %95, label %97
95: ; preds = %85
%96 = add i64 %86, 1
br label %112
97: ; preds = %85
%98 = getelementptr inbounds i64, i64* %1, i64 %87
%99 = load i64, i64* %98
%100 = mul i64 %99, %83
%101 = add i64 %100, %84
%102 = getelementptr inbounds double, double* %0, i64 %101
%103 = load double, double* %102
%104 = fcmp ult double %103, %80
br i1 %104, label %109, label %105
105: ; preds = %97
%106 = icmp eq i64 %87, 0
br i1 %106, label %116, label %107
107: ; preds = %105
%108 = add i64 %87, -1
br label %112
109: ; preds = %97
store i64 %99, i64* %88
store i64 %89, i64* %98
%110 = add i64 %86, 1
%111 = add i64 %87, -1
br label %112
112: ; preds = %107, %109, %95
%113 = phi i64 [ %87, %95 ], [ %108, %107 ], [ %111, %109 ]
%114 = phi i64 [ %96, %95 ], [ %86, %107 ], [ %110, %109 ]
%115 = icmp ugt i64 %114, %113
br i1 %115, label %116, label %85
116: ; preds = %112, %105
%117 = phi i64 [ %114, %112 ], [ %86, %105 ]
%118 = icmp eq i64 %117, %3
br i1 %118, label %119, label %153
119: ; preds = %78, %116
%120 = sext i32 %2 to i64
%121 = getelementptr inbounds i64, i64* %1, i64 %3
%122 = load i64, i64* %121
%123 = mul i64 %122, %120
%124 = sext i32 %37 to i64
%125 = add i64 %123, %124
%126 = getelementptr inbounds double, double* %0, i64 %125
%127 = load double, double* %126
%128 = add i64 %3, 1
%129 = icmp ugt i64 %128, %11
br i1 %129, label %133, label %138
130: ; preds = %138
%131 = getelementptr inbounds i64, i64* %1, i64 %150
%132 = load i64, i64* %131
br label %133
133: ; preds = %130, %119
%134 = phi i64 [ %122, %119 ], [ %132, %130 ]
%135 = phi double [ %127, %119 ], [ %149, %130 ]
%136 = phi i64 [ %3, %119 ], [ %150, %130 ]
%137 = getelementptr inbounds i64, i64* %1, i64 %136
store i64 %122, i64* %137
store i64 %134, i64* %121
br label %221
138: ; preds = %119, %138
%139 = phi i64 [ %151, %138 ], [ %128, %119 ]
%140 = phi i64 [ %150, %138 ], [ %3, %119 ]
%141 = phi double [ %149, %138 ], [ %127, %119 ]
%142 = getelementptr inbounds i64, i64* %1, i64 %139
%143 = load i64, i64* %142
%144 = mul i64 %143, %120
%145 = add i64 %144, %124
%146 = getelementptr inbounds double, double* %0, i64 %145
%147 = load double, double* %146
%148 = fcmp olt double %147, %141
%149 = select i1 %148, double %147, double %141
%150 = select i1 %148, i64 %139, i64 %140
%151 = add i64 %139, 1
%152 = icmp ugt i64 %151, %11
br i1 %152, label %130, label %138
153: ; preds = %116
%154 = icmp eq i64 %117, %10
br i1 %154, label %155, label %221
155: ; preds = %153
%156 = sext i32 %2 to i64
%157 = getelementptr inbounds i64, i64* %1, i64 %11
%158 = load i64, i64* %157
%159 = mul i64 %158, %156
%160 = sext i32 %37 to i64
%161 = add i64 %159, %160
%162 = getelementptr inbounds double, double* %0, i64 %161
%163 = load double, double* %162
%164 = icmp ugt i64 %11, %3
br i1 %164, label %165, label %191
165: ; preds = %155
%166 = and i64 %4, 1
%167 = icmp eq i64 %166, 0
br i1 %167, label %168, label %179
168: ; preds = %165
%169 = getelementptr inbounds i64, i64* %1, i64 %3
%170 = load i64, i64* %169
%171 = mul i64 %170, %156
%172 = add i64 %171, %160
%173 = getelementptr inbounds double, double* %0, i64 %172
%174 = load double, double* %173
%175 = fcmp ogt double %174, %163
%176 = select i1 %175, double %174, double %163
%177 = select i1 %175, i64 %3, i64 %11
%178 = add nuw i64 %3, 1
br label %179
179: ; preds = %168, %165
%180 = phi double [ undef, %165 ], [ %176, %168 ]
%181 = phi i64 [ undef, %165 ], [ %177, %168 ]
%182 = phi i64 [ %3, %165 ], [ %178, %168 ]
%183 = phi i64 [ %11, %165 ], [ %177, %168 ]
%184 = phi double [ %163, %165 ], [ %176, %168 ]
%185 = icmp eq i64 %4, 2
br i1 %185, label %186, label %196
186: ; preds = %196, %179
%187 = phi double [ %180, %179 ], [ %217, %196 ]
%188 = phi i64 [ %181, %179 ], [ %218, %196 ]
%189 = getelementptr inbounds i64, i64* %1, i64 %188
%190 = load i64, i64* %189
br label %191
191: ; preds = %186, %155
%192 = phi i64 [ %158, %155 ], [ %190, %186 ]
%193 = phi double [ %163, %155 ], [ %187, %186 ]
%194 = phi i64 [ %11, %155 ], [ %188, %186 ]
%195 = getelementptr inbounds i64, i64* %1, i64 %194
store i64 %158, i64* %195
store i64 %192, i64* %157
br label %221
196: ; preds = %179, %196
%197 = phi i64 [ %219, %196 ], [ %182, %179 ]
%198 = phi i64 [ %218, %196 ], [ %183, %179 ]
%199 = phi double [ %217, %196 ], [ %184, %179 ]
%200 = getelementptr inbounds i64, i64* %1, i64 %197
%201 = load i64, i64* %200
%202 = mul i64 %201, %156
%203 = add i64 %202, %160
%204 = getelementptr inbounds double, double* %0, i64 %203
%205 = load double, double* %204
%206 = fcmp ogt double %205, %199
%207 = select i1 %206, double %205, double %199
%208 = select i1 %206, i64 %197, i64 %198
%209 = add nuw i64 %197, 1
%210 = getelementptr inbounds i64, i64* %1, i64 %209
%211 = load i64, i64* %210
%212 = mul i64 %211, %156
%213 = add i64 %212, %160
%214 = getelementptr inbounds double, double* %0, i64 %213
%215 = load double, double* %214
%216 = fcmp ogt double %215, %207
%217 = select i1 %216, double %215, double %207
%218 = select i1 %216, i64 %209, i64 %208
%219 = add nuw i64 %197, 2
%220 = icmp eq i64 %219, %11
br i1 %220, label %186, label %196
221: ; preds = %153, %191, %133
%222 = phi double [ %135, %133 ], [ %193, %191 ], [ %80, %153 ]
%223 = phi i64 [ %128, %133 ], [ %11, %191 ], [ %117, %153 ]
store i32 %37, i32* %6
store double %222, double* %7
%224 = sub i64 %223, %3
store i64 %224, i64* %8
br label %225
225: ; preds = %36, %221
%226 = phi i32 [ 0, %221 ], [ 1, %36 ]
ret i32 %226
}