#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int ceil(double);
int floor(double);
long quickselect_long(int, int, long *);
long percentile_nocopy_long(int n, long *data, double pct) {
  int i, n1, n2;
  double N_;
  double dN;
  long temp;
  if (n == 1)
    return (data[0]);
  dN = 1.0 / ((double)n);
  if (pct <= (dN / 2.0)) {
    temp = data[0];
    for (i = 1; i < n; i++) {
      if (data[i] < temp)
        temp = data[i];
    }
    return temp;
  }
  if (pct >= 100. - (dN / 2.0)) {
    temp = data[0];
    for (i = 1; i < n; i++) {
      if (data[i] > temp)
        temp = data[i];
    }
    return temp;
  }
  N_ = pct * ((double)(n - 1)) / 100. - dN / 2.0;
  n1 = floor((double)N_);
  n2 = ceil((double)N_);
  if (n1 > n - 1)
    n1 = n - 1;
  if (n2 > n - 1)
    n2 = n - 1;
  if (n1 < 0)
    n1 = 0;
  if (n2 < 0)
    n2 = 0;
  if (n1 != n2) {
    temp = quickselect_long(n1 + 1, n, data);
    temp += (long)((N_ - (double)n1) *
                   (double)(quickselect_long(n2 + 1, n, data) - temp));
  } else {
    temp = quickselect_long(n1 + 1, n, data);
  }
  return temp;
}


x86 assembly (clang, -O0):
<percentile_nocopy_long>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %edi,-0xc(%rbp)
mov    %rsi,-0x18(%rbp)
movsd  %xmm0,-0x20(%rbp)
cmpl   $0x1,-0xc(%rbp)
jne    115e <percentile_nocopy_long+0x2e>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x8(%rbp)
jmp    13ba <percentile_nocopy_long+0x28a>
cvtsi2sdl -0xc(%rbp),%xmm1
movsd  0xe9d(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x20(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  0xe7a(%rip),%xmm2
divsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jb     11f8 <percentile_nocopy_long+0xc8>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x48(%rbp)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11eb <percentile_nocopy_long+0xbb>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
cmp    -0x48(%rbp),%rax
jge    11d8 <percentile_nocopy_long+0xa8>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x48(%rbp)
jmp    11dd <percentile_nocopy_long+0xad>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11a6 <percentile_nocopy_long+0x76>
mov    -0x48(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13ba <percentile_nocopy_long+0x28a>
movsd  -0x20(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  0xdf6(%rip),%xmm1
divsd  %xmm1,%xmm2
movsd  0xdfa(%rip),%xmm1
subsd  %xmm2,%xmm1
ucomisd %xmm1,%xmm0
jb     1288 <percentile_nocopy_long+0x158>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x48(%rbp)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    127b <percentile_nocopy_long+0x14b>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
cmp    -0x48(%rbp),%rax
jle    1268 <percentile_nocopy_long+0x138>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x48(%rbp)
jmp    126d <percentile_nocopy_long+0x13d>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1236 <percentile_nocopy_long+0x106>
mov    -0x48(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13ba <percentile_nocopy_long+0x28a>
movsd  -0x20(%rbp),%xmm0
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd6d(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  -0x40(%rbp),%xmm1
movsd  0xd4c(%rip),%xmm2
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
call   1050 <floor@plt>
mov    %eax,-0x28(%rbp)
movsd  -0x38(%rbp),%xmm0
call   1030 <ceil@plt>
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jle    12f5 <percentile_nocopy_long+0x1c5>
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jle    130f <percentile_nocopy_long+0x1df>
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x2c(%rbp)
cmpl   $0x0,-0x28(%rbp)
jge    1320 <percentile_nocopy_long+0x1f0>
movl   $0x0,-0x28(%rbp)
cmpl   $0x0,-0x2c(%rbp)
jge    1331 <percentile_nocopy_long+0x201>
movl   $0x0,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x2c(%rbp),%eax
je     139c <percentile_nocopy_long+0x26c>
mov    -0x28(%rbp),%edi
add    $0x1,%edi
mov    -0xc(%rbp),%esi
mov    -0x18(%rbp),%rdx
call   1040 <quickselect_long@plt>
mov    %rax,-0x48(%rbp)
movsd  -0x38(%rbp),%xmm0
cvtsi2sdl -0x28(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x2c(%rbp),%edi
add    $0x1,%edi
mov    -0xc(%rbp),%esi
mov    -0x18(%rbp),%rdx
call   1040 <quickselect_long@plt>
movsd  -0x50(%rbp),%xmm0
sub    -0x48(%rbp),%rax
cvtsi2sd %rax,%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
add    -0x48(%rbp),%rax
mov    %rax,-0x48(%rbp)
jmp    13b2 <percentile_nocopy_long+0x282>
mov    -0x28(%rbp),%edi
add    $0x1,%edi
mov    -0xc(%rbp),%esi
mov    -0x18(%rbp),%rdx
call   1040 <quickselect_long@plt>
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<percentile_nocopy_long>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x10,%rsp
mov    %rsi,%r14
cmp    $0x1,%edi
jne    1157 <percentile_nocopy_long+0x27>
mov    (%r14),%rbx
mov    %rbx,%rax
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %edi,%r15d
cvtsi2sd %edi,%xmm2
movsd  0xe9a(%rip),%xmm1
divsd  %xmm2,%xmm1
mulsd  0xe96(%rip),%xmm1
ucomisd %xmm0,%xmm1
jae    1247 <percentile_nocopy_long+0x117>
movsd  0xe8c(%rip),%xmm2
subsd  %xmm1,%xmm2
ucomisd %xmm2,%xmm0
jae    127d <percentile_nocopy_long+0x14d>
lea    -0x1(%r15),%r12d
xorps  %xmm2,%xmm2
cvtsi2sd %r12d,%xmm2
mulsd  %xmm0,%xmm2
divsd  0xe66(%rip),%xmm2
subsd  %xmm1,%xmm2
movsd  %xmm2,0x8(%rsp)
movapd %xmm2,%xmm0
call   1050 <floor@plt>
mov    %eax,%ebp
movsd  0x8(%rsp),%xmm0
call   1030 <ceil@plt>
cmp    %r15d,%ebp
cmovge %r12d,%ebp
cmp    %r15d,%eax
cmovl  %eax,%r12d
xor    %eax,%eax
test   %ebp,%ebp
cmovs  %eax,%ebp
test   %r12d,%r12d
cmovs  %eax,%r12d
lea    0x1(%rbp),%edi
mov    %r15d,%esi
mov    %r14,%rdx
call   1040 <quickselect_long@plt>
mov    %rax,%rbx
cmp    %r12d,%ebp
je     1147 <percentile_nocopy_long+0x17>
xorps  %xmm0,%xmm0
cvtsi2sd %ebp,%xmm0
movsd  0x8(%rsp),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rsp)
add    $0x1,%r12d
mov    %r12d,%edi
mov    %r15d,%esi
mov    %r14,%rdx
call   1040 <quickselect_long@plt>
sub    %rbx,%rax
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
mulsd  0x8(%rsp),%xmm0
cvttsd2si %xmm0,%rax
add    %rax,%rbx
jmp    1147 <percentile_nocopy_long+0x17>
mov    (%r14),%rbx
cmp    $0x2,%r15d
jl     1147 <percentile_nocopy_long+0x17>
mov    %r15d,%ecx
lea    -0x1(%rcx),%rdx
add    $0xfffffffffffffffe,%rcx
mov    %edx,%eax
and    $0x3,%eax
cmp    $0x3,%rcx
jae    12ae <percentile_nocopy_long+0x17e>
mov    $0x1,%ecx
test   %rax,%rax
jne    130b <percentile_nocopy_long+0x1db>
jmp    1147 <percentile_nocopy_long+0x17>
mov    (%r14),%rbx
cmp    $0x2,%r15d
jl     1147 <percentile_nocopy_long+0x17>
mov    %r15d,%ecx
lea    -0x1(%rcx),%rdx
add    $0xfffffffffffffffe,%rcx
mov    %edx,%eax
and    $0x3,%eax
cmp    $0x3,%rcx
jae    1339 <percentile_nocopy_long+0x209>
mov    $0x1,%ecx
jmp    1392 <percentile_nocopy_long+0x262>
and    $0xfffffffffffffffc,%rdx
xor    %ecx,%ecx
jmp    12c9 <percentile_nocopy_long+0x199>
cs nopw 0x0(%rax,%rax,1)
add    $0x4,%rcx
cmp    %rcx,%rdx
je     12fe <percentile_nocopy_long+0x1ce>
mov    0x8(%r14,%rcx,8),%rdi
mov    0x10(%r14,%rcx,8),%rsi
cmp    %rbx,%rdi
cmovl  %rdi,%rbx
cmp    %rbx,%rsi
jl     12e2 <percentile_nocopy_long+0x1b2>
mov    %rbx,%rsi
mov    0x18(%r14,%rcx,8),%rdi
cmp    %rsi,%rdi
jl     12ef <percentile_nocopy_long+0x1bf>
mov    %rsi,%rdi
mov    0x20(%r14,%rcx,8),%rbx
cmp    %rdi,%rbx
jl     12c0 <percentile_nocopy_long+0x190>
mov    %rdi,%rbx
jmp    12c0 <percentile_nocopy_long+0x190>
add    $0x1,%rcx
test   %rax,%rax
je     1147 <percentile_nocopy_long+0x17>
lea    (%r14,%rcx,8),%rcx
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    (%rcx,%rdx,8),%rsi
cmp    %rbx,%rsi
cmovl  %rsi,%rbx
add    $0x1,%rdx
cmp    %rdx,%rax
jne    1320 <percentile_nocopy_long+0x1f0>
jmp    1147 <percentile_nocopy_long+0x17>
and    $0xfffffffffffffffc,%rdx
xor    %ecx,%ecx
jmp    1359 <percentile_nocopy_long+0x229>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x4,%rcx
cmp    %rcx,%rdx
je     138e <percentile_nocopy_long+0x25e>
mov    0x8(%r14,%rcx,8),%rdi
mov    0x10(%r14,%rcx,8),%rsi
cmp    %rbx,%rdi
cmovg  %rdi,%rbx
cmp    %rbx,%rsi
jg     1372 <percentile_nocopy_long+0x242>
mov    %rbx,%rsi
mov    0x18(%r14,%rcx,8),%rdi
cmp    %rsi,%rdi
jg     137f <percentile_nocopy_long+0x24f>
mov    %rsi,%rdi
mov    0x20(%r14,%rcx,8),%rbx
cmp    %rdi,%rbx
jg     1350 <percentile_nocopy_long+0x220>
mov    %rdi,%rbx
jmp    1350 <percentile_nocopy_long+0x220>
add    $0x1,%rcx
test   %rax,%rax
je     1147 <percentile_nocopy_long+0x17>
lea    (%r14,%rcx,8),%rcx
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    (%rcx,%rdx,8),%rsi
cmp    %rbx,%rsi
cmovg  %rsi,%rbx
add    $0x1,%rdx
cmp    %rdx,%rax
jne    13b0 <percentile_nocopy_long+0x280>
jmp    1147 <percentile_nocopy_long+0x17>

LLVM IR (-O0):
define i64 @percentile_nocopy_long(i32 %0, i64* %1, double %2) {
%4 = alloca i64
%5 = alloca i32
%6 = alloca i64*
%7 = alloca double
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca double
%12 = alloca double
%13 = alloca i64
store i32 %0, i32* %5
store i64* %1, i64** %6
store double %2, double* %7
%14 = load i32, i32* %5
%15 = icmp eq i32 %14, 1
br i1 %15, label %16, label %20
16: ; preds = %3
%17 = load i64*, i64** %6
%18 = getelementptr inbounds i64, i64* %17, i64 0
%19 = load i64, i64* %18
store i64 %19, i64* %4
br label %161
20: ; preds = %3
%21 = load i32, i32* %5
%22 = sitofp i32 %21 to double
%23 = fdiv double 1.000000e+00, %22
store double %23, double* %12
%24 = load double, double* %7
%25 = load double, double* %12
%26 = fdiv double %25, 2.000000e+00
%27 = fcmp ole double %24, %26
br i1 %27, label %28, label %56
28: ; preds = %20
%29 = load i64*, i64** %6
%30 = getelementptr inbounds i64, i64* %29, i64 0
%31 = load i64, i64* %30
store i64 %31, i64* %13
store i32 1, i32* %8
br label %32
32: ; preds = %51, %28
%33 = load i32, i32* %8
%34 = load i32, i32* %5
%35 = icmp slt i32 %33, %34
br i1 %35, label %36, label %54
36: ; preds = %32
%37 = load i64*, i64** %6
%38 = load i32, i32* %8
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i64, i64* %37, i64 %39
%41 = load i64, i64* %40
%42 = load i64, i64* %13
%43 = icmp slt i64 %41, %42
br i1 %43, label %44, label %50
44: ; preds = %36
%45 = load i64*, i64** %6
%46 = load i32, i32* %8
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i64, i64* %45, i64 %47
%49 = load i64, i64* %48
store i64 %49, i64* %13
br label %50
50: ; preds = %44, %36
br label %51
51: ; preds = %50
%52 = load i32, i32* %8
%53 = add nsw i32 %52, 1
store i32 %53, i32* %8
br label %32
54: ; preds = %32
%55 = load i64, i64* %13
store i64 %55, i64* %4
br label %161
56: ; preds = %20
%57 = load double, double* %7
%58 = load double, double* %12
%59 = fdiv double %58, 2.000000e+00
%60 = fsub double 1.000000e+02, %59
%61 = fcmp oge double %57, %60
br i1 %61, label %62, label %90
62: ; preds = %56
%63 = load i64*, i64** %6
%64 = getelementptr inbounds i64, i64* %63, i64 0
%65 = load i64, i64* %64
store i64 %65, i64* %13
store i32 1, i32* %8
br label %66
66: ; preds = %85, %62
%67 = load i32, i32* %8
%68 = load i32, i32* %5
%69 = icmp slt i32 %67, %68
br i1 %69, label %70, label %88
70: ; preds = %66
%71 = load i64*, i64** %6
%72 = load i32, i32* %8
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds i64, i64* %71, i64 %73
%75 = load i64, i64* %74
%76 = load i64, i64* %13
%77 = icmp sgt i64 %75, %76
br i1 %77, label %78, label %84
78: ; preds = %70
%79 = load i64*, i64** %6
%80 = load i32, i32* %8
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds i64, i64* %79, i64 %81
%83 = load i64, i64* %82
store i64 %83, i64* %13
br label %84
84: ; preds = %78, %70
br label %85
85: ; preds = %84
%86 = load i32, i32* %8
%87 = add nsw i32 %86, 1
store i32 %87, i32* %8
br label %66
88: ; preds = %66
%89 = load i64, i64* %13
store i64 %89, i64* %4
br label %161
90: ; preds = %56
%91 = load double, double* %7
%92 = load i32, i32* %5
%93 = sub nsw i32 %92, 1
%94 = sitofp i32 %93 to double
%95 = fmul double %91, %94
%96 = fdiv double %95, 1.000000e+02
%97 = load double, double* %12
%98 = fdiv double %97, 2.000000e+00
%99 = fsub double %96, %98
store double %99, double* %11
%100 = load double, double* %11
%101 = call i32 @floor(double %100)
store i32 %101, i32* %9
%102 = load double, double* %11
%103 = call i32 @ceil(double %102)
store i32 %103, i32* %10
%104 = load i32, i32* %9
%105 = load i32, i32* %5
%106 = sub nsw i32 %105, 1
%107 = icmp sgt i32 %104, %106
br i1 %107, label %108, label %111
108: ; preds = %90
%109 = load i32, i32* %5
%110 = sub nsw i32 %109, 1
store i32 %110, i32* %9
br label %111
111: ; preds = %108, %90
%112 = load i32, i32* %10
%113 = load i32, i32* %5
%114 = sub nsw i32 %113, 1
%115 = icmp sgt i32 %112, %114
br i1 %115, label %116, label %119
116: ; preds = %111
%117 = load i32, i32* %5
%118 = sub nsw i32 %117, 1
store i32 %118, i32* %10
br label %119
119: ; preds = %116, %111
%120 = load i32, i32* %9
%121 = icmp slt i32 %120, 0
br i1 %121, label %122, label %123
122: ; preds = %119
store i32 0, i32* %9
br label %123
123: ; preds = %122, %119
%124 = load i32, i32* %10
%125 = icmp slt i32 %124, 0
br i1 %125, label %126, label %127
126: ; preds = %123
store i32 0, i32* %10
br label %127
127: ; preds = %126, %123
%128 = load i32, i32* %9
%129 = load i32, i32* %10
%130 = icmp ne i32 %128, %129
br i1 %130, label %131, label %153
131: ; preds = %127
%132 = load i32, i32* %9
%133 = add nsw i32 %132, 1
%134 = load i32, i32* %5
%135 = load i64*, i64** %6
%136 = call i64 @quickselect_long(i32 %133, i32 %134, i64* %135)
store i64 %136, i64* %13
%137 = load double, double* %11
%138 = load i32, i32* %9
%139 = sitofp i32 %138 to double
%140 = fsub double %137, %139
%141 = load i32, i32* %10
%142 = add nsw i32 %141, 1
%143 = load i32, i32* %5
%144 = load i64*, i64** %6
%145 = call i64 @quickselect_long(i32 %142, i32 %143, i64* %144)
%146 = load i64, i64* %13
%147 = sub nsw i64 %145, %146
%148 = sitofp i64 %147 to double
%149 = fmul double %140, %148
%150 = fptosi double %149 to i64
%151 = load i64, i64* %13
%152 = add nsw i64 %151, %150
store i64 %152, i64* %13
br label %159
153: ; preds = %127
%154 = load i32, i32* %9
%155 = add nsw i32 %154, 1
%156 = load i32, i32* %5
%157 = load i64*, i64** %6
%158 = call i64 @quickselect_long(i32 %155, i32 %156, i64* %157)
store i64 %158, i64* %13
br label %159
159: ; preds = %153, %131
%160 = load i64, i64* %13
store i64 %160, i64* %4
br label %161
161: ; preds = %159, %88, %54, %16
%162 = load i64, i64* %4
ret i64 %162
}

LLVM IR (-O2):
define i64 @percentile_nocopy_long(i32 %0, i64* %1, double %2) {
%4 = icmp eq i32 %0, 1
br i1 %4, label %5, label %7
5: ; preds = %3
%6 = load i64, i64* %1
br label %150
7: ; preds = %3
%8 = sitofp i32 %0 to double
%9 = fdiv double 1.000000e+00, %8
%10 = fmul double %9, 5.000000e-01
%11 = fcmp ult double %10, %2
br i1 %11, label %49, label %12
12: ; preds = %7
%13 = load i64, i64* %1
%14 = icmp sgt i32 %0, 1
br i1 %14, label %15, label %150
15: ; preds = %12
%16 = zext i32 %0 to i64
%17 = add nsw i64 %16, -1
%18 = add nsw i64 %16, -2
%19 = and i64 %17, 3
%20 = icmp ult i64 %18, 3
br i1 %20, label %134, label %21
21: ; preds = %15
%22 = and i64 %17, -4
br label %23
23: ; preds = %23, %21
%24 = phi i64 [ 1, %21 ], [ %46, %23 ]
%25 = phi i64 [ %13, %21 ], [ %45, %23 ]
%26 = phi i64 [ 0, %21 ], [ %47, %23 ]
%27 = getelementptr inbounds i64, i64* %1, i64 %24
%28 = load i64, i64* %27
%29 = icmp slt i64 %28, %25
%30 = select i1 %29, i64 %28, i64 %25
%31 = add nuw nsw i64 %24, 1
%32 = getelementptr inbounds i64, i64* %1, i64 %31
%33 = load i64, i64* %32
%34 = icmp slt i64 %33, %30
%35 = select i1 %34, i64 %33, i64 %30
%36 = add nuw nsw i64 %24, 2
%37 = getelementptr inbounds i64, i64* %1, i64 %36
%38 = load i64, i64* %37
%39 = icmp slt i64 %38, %35
%40 = select i1 %39, i64 %38, i64 %35
%41 = add nuw nsw i64 %24, 3
%42 = getelementptr inbounds i64, i64* %1, i64 %41
%43 = load i64, i64* %42
%44 = icmp slt i64 %43, %40
%45 = select i1 %44, i64 %43, i64 %40
%46 = add nuw nsw i64 %24, 4
%47 = add i64 %26, 4
%48 = icmp eq i64 %47, %22
br i1 %48, label %134, label %23
49: ; preds = %7
%50 = fsub double 1.000000e+02, %10
%51 = fcmp ugt double %50, %2
br i1 %51, label %89, label %52
52: ; preds = %49
%53 = load i64, i64* %1
%54 = icmp sgt i32 %0, 1
br i1 %54, label %55, label %150
55: ; preds = %52
%56 = zext i32 %0 to i64
%57 = add nsw i64 %56, -1
%58 = add nsw i64 %56, -2
%59 = and i64 %57, 3
%60 = icmp ult i64 %58, 3
br i1 %60, label %118, label %61
61: ; preds = %55
%62 = and i64 %57, -4
br label %63
63: ; preds = %63, %61
%64 = phi i64 [ 1, %61 ], [ %86, %63 ]
%65 = phi i64 [ %53, %61 ], [ %85, %63 ]
%66 = phi i64 [ 0, %61 ], [ %87, %63 ]
%67 = getelementptr inbounds i64, i64* %1, i64 %64
%68 = load i64, i64* %67
%69 = icmp sgt i64 %68, %65
%70 = select i1 %69, i64 %68, i64 %65
%71 = add nuw nsw i64 %64, 1
%72 = getelementptr inbounds i64, i64* %1, i64 %71
%73 = load i64, i64* %72
%74 = icmp sgt i64 %73, %70
%75 = select i1 %74, i64 %73, i64 %70
%76 = add nuw nsw i64 %64, 2
%77 = getelementptr inbounds i64, i64* %1, i64 %76
%78 = load i64, i64* %77
%79 = icmp sgt i64 %78, %75
%80 = select i1 %79, i64 %78, i64 %75
%81 = add nuw nsw i64 %64, 3
%82 = getelementptr inbounds i64, i64* %1, i64 %81
%83 = load i64, i64* %82
%84 = icmp sgt i64 %83, %80
%85 = select i1 %84, i64 %83, i64 %80
%86 = add nuw nsw i64 %64, 4
%87 = add i64 %66, 4
%88 = icmp eq i64 %87, %62
br i1 %88, label %118, label %63
89: ; preds = %49
%90 = add nsw i32 %0, -1
%91 = sitofp i32 %90 to double
%92 = fmul double %91, %2
%93 = fdiv double %92, 1.000000e+02
%94 = fsub double %93, %10
%95 = tail call i32 @floor(double %94)
%96 = tail call i32 @ceil(double %94)
%97 = icmp slt i32 %95, %0
%98 = select i1 %97, i32 %95, i32 %90
%99 = icmp slt i32 %96, %0
%100 = select i1 %99, i32 %96, i32 %90
%101 = icmp sgt i32 %98, 0
%102 = select i1 %101, i32 %98, i32 0
%103 = icmp sgt i32 %100, 0
%104 = select i1 %103, i32 %100, i32 0
%105 = icmp eq i32 %102, %104
%106 = add nuw nsw i32 %102, 1
%107 = tail call i64 @quickselect_long(i32 %106, i32 %0, i64* %1)
br i1 %105, label %150, label %108
108: ; preds = %89
%109 = sitofp i32 %102 to double
%110 = fsub double %94, %109
%111 = add nuw nsw i32 %104, 1
%112 = tail call i64 @quickselect_long(i32 %111, i32 %0, i64* %1)
%113 = sub nsw i64 %112, %107
%114 = sitofp i64 %113 to double
%115 = fmul double %110, %114
%116 = fptosi double %115 to i64
%117 = add nsw i64 %107, %116
br label %150
118: ; preds = %63, %55
%119 = phi i64 [ undef, %55 ], [ %85, %63 ]
%120 = phi i64 [ 1, %55 ], [ %86, %63 ]
%121 = phi i64 [ %53, %55 ], [ %85, %63 ]
%122 = icmp eq i64 %59, 0
br i1 %122, label %150, label %123
123: ; preds = %118, %123
%124 = phi i64 [ %131, %123 ], [ %120, %118 ]
%125 = phi i64 [ %130, %123 ], [ %121, %118 ]
%126 = phi i64 [ %132, %123 ], [ 0, %118 ]
%127 = getelementptr inbounds i64, i64* %1, i64 %124
%128 = load i64, i64* %127
%129 = icmp sgt i64 %128, %125
%130 = select i1 %129, i64 %128, i64 %125
%131 = add nuw nsw i64 %124, 1
%132 = add i64 %126, 1
%133 = icmp eq i64 %132, %59
br i1 %133, label %150, label %123
134: ; preds = %23, %15
%135 = phi i64 [ undef, %15 ], [ %45, %23 ]
%136 = phi i64 [ 1, %15 ], [ %46, %23 ]
%137 = phi i64 [ %13, %15 ], [ %45, %23 ]
%138 = icmp eq i64 %19, 0
br i1 %138, label %150, label %139
139: ; preds = %134, %139
%140 = phi i64 [ %147, %139 ], [ %136, %134 ]
%141 = phi i64 [ %146, %139 ], [ %137, %134 ]
%142 = phi i64 [ %148, %139 ], [ 0, %134 ]
%143 = getelementptr inbounds i64, i64* %1, i64 %140
%144 = load i64, i64* %143
%145 = icmp slt i64 %144, %141
%146 = select i1 %145, i64 %144, i64 %141
%147 = add nuw nsw i64 %140, 1
%148 = add i64 %142, 1
%149 = icmp eq i64 %148, %19
br i1 %149, label %150, label %139
150: ; preds = %134, %139, %118, %123, %89, %12, %52, %108, %5
%151 = phi i64 [ %6, %5 ], [ %117, %108 ], [ %53, %52 ], [ %13, %12 ], [ %107, %89 ], [ %119, %118 ], [ %130, %123 ], [ %135, %134 ], [ %146, %139 ]
ret i64 %151
}