#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, i;
  uint32_t p, q, i2;
  double size = 0, min_val, max_val, split, side_len, cur_val;
  uint32_t end_idx = start_idx + n - 1;
  for (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 (i2 = start_idx + 1; i2 <= end_idx; i2++) {
      cur_val = (pa[no_dims * pidx[i2] + dim]);
      if (cur_val < split) {
        j = i2;
        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 (i2 = start_idx; i2 < end_idx; i2++) {
      cur_val = (pa[no_dims * pidx[i2] + dim]);
      if (cur_val > split) {
        j = i2;
        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    $0x38,%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,-0x60(%rbp)
mov    -0x28(%rbp),%rax
add    -0x30(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x90(%rbp)
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11bf <partition_double+0xbf>
mov    -0x38(%rbp),%rax
mov    -0x40(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x38(%rbp),%rax
mov    -0x40(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
ucomisd -0x60(%rbp),%xmm0
jbe    11ac <partition_double+0xac>
mov    -0x40(%rbp),%eax
mov    %eax,-0x3c(%rbp)
movsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    11b1 <partition_double+0xb1>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1154 <partition_double+0x54>
mov    -0x38(%rbp),%rax
mov    -0x3c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%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,-0x70(%rbp)
movsd  -0x68(%rbp),%xmm0
ucomisd -0x70(%rbp),%xmm0
jb     120c <partition_double+0x10c>
movl   $0x1,-0x4(%rbp)
jmp    15b5 <partition_double+0x4b5>
movsd  -0x68(%rbp),%xmm0
addsd  -0x70(%rbp),%xmm0
movsd  0xde2(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x90(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x50(%rbp),%rax
ja     133b <partition_double+0x23b>
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  -0x78(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1289 <partition_double+0x189>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    1336 <partition_double+0x236>
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 -0x78(%rbp),%xmm0
jb     12db <partition_double+0x1db>
cmpq   $0x0,-0x50(%rbp)
jbe    12d1 <partition_double+0x1d1>
mov    -0x50(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x50(%rbp)
jmp    12d6 <partition_double+0x1d6>
jmp    133b <partition_double+0x23b>
jmp    1331 <partition_double+0x231>
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    1336 <partition_double+0x236>
jmp    123a <partition_double+0x13a>
mov    -0x48(%rbp),%rax
cmp    -0x28(%rbp),%rax
jne    145d <partition_double+0x35d>
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,-0x78(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x58(%rbp)
mov    -0x58(%rbp),%rax
cmp    -0x90(%rbp),%rax
ja     1408 <partition_double+0x308>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    -0x18(%rbp),%rdx
mov    -0x58(%rbp),%rsi
imul   (%rdx,%rsi,8),%rcx
movslq -0x3c(%rbp),%rdx
add    %rdx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x88(%rbp),%xmm1
ff
movsd  -0x78(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    13f2 <partition_double+0x2f2>
mov    -0x58(%rbp),%rax
mov    %rax,-0xa0(%rbp)
movsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x78(%rbp)
jmp    13f7 <partition_double+0x2f7>
mov    -0x58(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x58(%rbp)
jmp    1389 <partition_double+0x289>
mov    -0x18(%rbp),%rax
mov    -0xa0(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0xa8(%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    -0xa8(%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    1589 <partition_double+0x489>
mov    -0x48(%rbp),%rax
mov    -0x90(%rbp),%rcx
add    $0x1,%rcx
cmp    %rcx,%rax
jne    1584 <partition_double+0x484>
mov    -0x90(%rbp),%rax
mov    %rax,-0xb0(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    -0x18(%rbp),%rdx
mov    -0xb0(%rbp),%rsi
imul   (%rdx,%rsi,8),%rcx
movslq -0x3c(%rbp),%rdx
add    %rdx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x58(%rbp),%rax
cmp    -0x90(%rbp),%rax
jae    152f <partition_double+0x42f>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    -0x18(%rbp),%rdx
mov    -0x58(%rbp),%rsi
imul   (%rdx,%rsi,8),%rcx
movslq -0x3c(%rbp),%rdx
add    %rdx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x88(%rbp),%xmm0
ff
ucomisd -0x78(%rbp),%xmm0
jbe    1519 <partition_double+0x419>
mov    -0x58(%rbp),%rax
mov    %rax,-0xb0(%rbp)
movsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x78(%rbp)
jmp    151e <partition_double+0x41e>
mov    -0x58(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x58(%rbp)
jmp    14b4 <partition_double+0x3b4>
mov    -0x18(%rbp),%rax
mov    -0xb0(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0xb8(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x90(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x18(%rbp),%rax
mov    -0xb0(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0xb8(%rbp),%rdx
mov    -0x18(%rbp),%rax
mov    -0x90(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x90(%rbp),%rax
mov    %rax,-0x48(%rbp)
jmp    1589 <partition_double+0x489>
mov    -0x3c(%rbp),%ecx
mov    0x10(%rbp),%rax
mov    %ecx,(%rax)
movsd  -0x78(%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    $0x38,%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    1305 <partition_double+0x205>
mov    0x48(%rsp),%r9
mov    0x40(%rsp),%r11
mov    0x38(%rsp),%r15
lea    (%r8,%rcx,1),%r12
add    $0xffffffffffffffff,%r12
movslq %edx,%r13
movslq %r10d,%r14
cmp    %rcx,%r12
jb     1292 <partition_double+0x192>
mov    %r11,%r15
mov    %r9,%rax
lea    (%r8,%rcx,1),%rdx
mov    %rdx,-0x8(%rsp)
addsd  %xmm1,%xmm0
mulsd  0xdf4(%rip),%xmm0
mov    %rcx,%rdx
mov    %r12,%rbp
jmp    1229 <partition_double+0x129>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rdx
cmp    %rbp,%rdx
ja     127e <partition_double+0x17e>
mov    (%rsi,%rdx,8),%r11
mov    %r11,%rbx
imul   %r13,%rbx
add    %r14,%rbx
ucomisd (%rdi,%rbx,8),%xmm0
ja     1220 <partition_double+0x120>
mov    (%rsi,%rbp,8),%r9
mov    %r9,%rbx
imul   %r13,%rbx
add    %r14,%rbx
movsd  (%rdi,%rbx,8),%xmm1
ucomisd %xmm0,%xmm1
jae    1270 <partition_double+0x170>
mov    %r9,(%rsi,%rdx,8)
mov    %r11,(%rsi,%rbp,8)
add    $0x1,%rdx
jmp    1275 <partition_double+0x175>
cs nopw 0x0(%rax,%rax,1)
nop
test   %rbp,%rbp
je     127e <partition_double+0x17e>
add    $0xffffffffffffffff,%rbp
cmp    %rbp,%rdx
jbe    1229 <partition_double+0x129>
cmp    %rcx,%rdx
mov    %rax,%r9
mov    %r15,%r11
mov    0x38(%rsp),%r15
jne    1310 <partition_double+0x210>
mov    (%rsi,%rcx,8),%r8
mov    %r8,%rdx
imul   %r13,%rdx
add    %r14,%rdx
movsd  (%rdi,%rdx,8),%xmm0
lea    0x1(%rcx),%rdx
cmp    %r12,%rdx
jbe    12b6 <partition_double+0x1b6>
mov    %r8,%rax
mov    %rcx,%rbp
jmp    12ed <partition_double+0x1ed>
mov    %rcx,%rbp
mov    %rdx,%rbx
nopl   0x0(%rax)
movapd %xmm0,%xmm1
mov    (%rsi,%rbx,8),%rax
imul   %r13,%rax
add    %r14,%rax
movsd  (%rdi,%rax,8),%xmm0
ucomisd %xmm0,%xmm1
cmova  %rbx,%rbp
minsd  %xmm1,%xmm0
add    $0x1,%rbx
cmp    %r12,%rbx
jbe    12c0 <partition_double+0x1c0>
mov    (%rsi,%rbp,8),%rax
mov    %r8,(%rsi,%rbp,8)
mov    %rax,(%rsi,%rcx,8)
mov    %r10d,(%r15)
movsd  %xmm0,(%r11)
sub    %rcx,%rdx
mov    %rdx,(%r9)
xor    %eax,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    -0x8(%rsp),%rbp
cmp    %rbp,%rdx
jne    12f5 <partition_double+0x1f5>
mov    -0x8(%rsi,%rbp,8),%rdx
mov    %rdx,%rax
imul   %r13,%rax
add    %r14,%rax
movsd  (%rdi,%rax,8),%xmm0
cmp    %rcx,%r12
jbe    1362 <partition_double+0x262>
test   $0x1,%r8b
jne    136a <partition_double+0x26a>
mov    (%rsi,%rcx,8),%rax
imul   %r13,%rax
add    %r14,%rax
movsd  (%rdi,%rax,8),%xmm1
ucomisd %xmm0,%xmm1
maxsd  %xmm0,%xmm1
mov    %r12,%rbx
cmova  %rcx,%rbx
lea    0x1(%rcx),%rbp
movapd %xmm1,%xmm0
jmp    1370 <partition_double+0x270>
mov    %rdx,%rax
mov    %r12,%rbx
jmp    13cf <partition_double+0x2cf>
mov    %r12,%rbx
mov    %rcx,%rbp
cmp    $0x2,%r8
je     13c6 <partition_double+0x2c6>
cs nopw 0x0(%rax,%rax,1)
mov    (%rsi,%rbp,8),%rax
imul   %r13,%rax
add    %r14,%rax
movsd  (%rdi,%rax,8),%xmm1
ucomisd %xmm0,%xmm1
cmova  %rbp,%rbx
maxsd  %xmm0,%xmm1
mov    0x8(%rsi,%rbp,8),%rax
imul   %r13,%rax
add    %r14,%rax
movsd  (%rdi,%rax,8),%xmm0
ucomisd %xmm1,%xmm0
lea    0x1(%rbp),%rax
cmova  %rax,%rbx
maxsd  %xmm1,%xmm0
add    $0x2,%rbp
cmp    %r12,%rbp
jne    1380 <partition_double+0x280>
mov    (%rsi,%rbx,8),%rax
mov    -0x8(%rsp),%rbp
mov    %rdx,(%rsi,%rbx,8)
mov    %rax,-0x8(%rsi,%rbp,8)
mov    %r12,%rdx
jmp    12f5 <partition_double+0x1f5>

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

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 %67
13: ; preds = %9
%14 = zext i32 %2 to i64
%15 = and i64 %14, 1
%16 = icmp eq i32 %2, 1
br i1 %16, label %50, label %17
17: ; preds = %13
%18 = and i64 %14, 4294967294
br label %19
19: ; preds = %19, %17
%20 = phi i64 [ 0, %17 ], [ %47, %19 ]
%21 = phi i32 [ 0, %17 ], [ %46, %19 ]
%22 = phi double [ 0.000000e+00, %17 ], [ %44, %19 ]
%23 = phi i64 [ 0, %17 ], [ %48, %19 ]
%24 = shl nuw nsw i64 %20, 1
%25 = or i64 %24, 1
%26 = getelementptr inbounds double, double* %5, i64 %25
%27 = load double, double* %26
%28 = getelementptr inbounds double, double* %5, i64 %24
%29 = load double, double* %28
%30 = fsub double %27, %29
%31 = fcmp ogt double %30, %22
%32 = select i1 %31, double %30, double %22
%33 = trunc i64 %20 to i32
%34 = select i1 %31, i32 %33, i32 %21
%35 = or i64 %20, 1
%36 = shl nuw nsw i64 %35, 1
%37 = or i64 %36, 1
%38 = getelementptr inbounds double, double* %5, i64 %37
%39 = load double, double* %38
%40 = getelementptr inbounds double, double* %5, i64 %36
%41 = load double, double* %40
%42 = fsub double %39, %41
%43 = fcmp ogt double %42, %32
%44 = select i1 %43, double %42, double %32
%45 = trunc i64 %35 to i32
%46 = select i1 %43, i32 %45, i32 %34
%47 = add nuw nsw i64 %20, 2
%48 = add nuw i64 %23, 2
%49 = icmp eq i64 %48, %18
br i1 %49, label %50, label %19
50: ; preds = %19, %13
%51 = phi i32 [ undef, %13 ], [ %46, %19 ]
%52 = phi i64 [ 0, %13 ], [ %47, %19 ]
%53 = phi i32 [ 0, %13 ], [ %46, %19 ]
%54 = phi double [ 0.000000e+00, %13 ], [ %44, %19 ]
%55 = icmp eq i64 %15, 0
br i1 %55, label %67, label %56
56: ; preds = %50
%57 = shl nuw nsw i64 %52, 1
%58 = or i64 %57, 1
%59 = getelementptr inbounds double, double* %5, i64 %58
%60 = load double, double* %59
%61 = getelementptr inbounds double, double* %5, i64 %57
%62 = load double, double* %61
%63 = fsub double %60, %62
%64 = fcmp ogt double %63, %54
%65 = trunc i64 %52 to i32
%66 = select i1 %64, i32 %65, i32 %53
br label %67
67: ; preds = %56, %50, %9
%68 = phi i32 [ 0, %9 ], [ %51, %50 ], [ %66, %56 ]
%69 = shl nsw i32 %68, 1
%70 = sext i32 %69 to i64
%71 = getelementptr inbounds double, double* %5, i64 %70
%72 = load double, double* %71
%73 = or i32 %69, 1
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds double, double* %5, i64 %74
%76 = load double, double* %75
%77 = fcmp ult double %72, %76
br i1 %77, label %78, label %225
78: ; preds = %67
%79 = fadd double %72, %76
%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 %68 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 %68 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 %148, label %130
130: ; preds = %119, %130
%131 = phi i64 [ %142, %130 ], [ %3, %119 ]
%132 = phi double [ %141, %130 ], [ %127, %119 ]
%133 = phi i64 [ %143, %130 ], [ %128, %119 ]
%134 = getelementptr inbounds i64, i64* %1, i64 %133
%135 = load i64, i64* %134
%136 = mul i64 %135, %120
%137 = add i64 %136, %124
%138 = getelementptr inbounds double, double* %0, i64 %137
%139 = load double, double* %138
%140 = fcmp olt double %139, %132
%141 = select i1 %140, double %139, double %132
%142 = select i1 %140, i64 %133, i64 %131
%143 = add i64 %133, 1
%144 = icmp ugt i64 %143, %11
br i1 %144, label %145, label %130
145: ; preds = %130
%146 = getelementptr inbounds i64, i64* %1, i64 %142
%147 = load i64, i64* %146
br label %148
148: ; preds = %145, %119
%149 = phi i64 [ %122, %119 ], [ %147, %145 ]
%150 = phi double [ %127, %119 ], [ %141, %145 ]
%151 = phi i64 [ %3, %119 ], [ %142, %145 ]
%152 = getelementptr inbounds i64, i64* %1, i64 %151
store i64 %122, i64* %152
store i64 %149, i64* %121
br label %221
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 %68 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 %216
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 [ %11, %165 ], [ %177, %168 ]
%183 = phi double [ %163, %165 ], [ %176, %168 ]
%184 = phi i64 [ %3, %165 ], [ %178, %168 ]
%185 = icmp eq i64 %4, 2
br i1 %185, label %211, label %186
186: ; preds = %179, %186
%187 = phi i64 [ %208, %186 ], [ %182, %179 ]
%188 = phi double [ %207, %186 ], [ %183, %179 ]
%189 = phi i64 [ %209, %186 ], [ %184, %179 ]
%190 = getelementptr inbounds i64, i64* %1, i64 %189
%191 = load i64, i64* %190
%192 = mul i64 %191, %156
%193 = add i64 %192, %160
%194 = getelementptr inbounds double, double* %0, i64 %193
%195 = load double, double* %194
%196 = fcmp ogt double %195, %188
%197 = select i1 %196, double %195, double %188
%198 = select i1 %196, i64 %189, i64 %187
%199 = add nuw i64 %189, 1
%200 = getelementptr inbounds i64, i64* %1, i64 %199
%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, %197
%207 = select i1 %206, double %205, double %197
%208 = select i1 %206, i64 %199, i64 %198
%209 = add nuw i64 %189, 2
%210 = icmp eq i64 %209, %11
br i1 %210, label %211, label %186
211: ; preds = %186, %179
%212 = phi double [ %180, %179 ], [ %207, %186 ]
%213 = phi i64 [ %181, %179 ], [ %208, %186 ]
%214 = getelementptr inbounds i64, i64* %1, i64 %213
%215 = load i64, i64* %214
br label %216
216: ; preds = %211, %155
%217 = phi i64 [ %158, %155 ], [ %215, %211 ]
%218 = phi double [ %163, %155 ], [ %212, %211 ]
%219 = phi i64 [ %11, %155 ], [ %213, %211 ]
%220 = getelementptr inbounds i64, i64* %1, i64 %219
store i64 %158, i64* %220
store i64 %217, i64* %157
br label %221
221: ; preds = %153, %216, %148
%222 = phi double [ %150, %148 ], [ %218, %216 ], [ %80, %153 ]
%223 = phi i64 [ %128, %148 ], [ %11, %216 ], [ %117, %153 ]
store i32 %68, i32* %6
store double %222, double* %7
%224 = sub i64 %223, %3
store i64 %224, i64* %8
br label %225
225: ; preds = %67, %221
%226 = phi i32 [ 0, %221 ], [ 1, %67 ]
ret i32 %226
}