#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);
short quickselect_short(int, int, short *);
short percentile_nocopy_short(int n, short *data, double pct) {
  int i, n1, n2;
  double N_;
  double dN;
  short 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_short(n1 + 1, n, data);
    temp += (short)((N_ - (double)n1) *
                    (double)(quickselect_short(n2 + 1, n, data) - temp));
  } else {
    temp = quickselect_short(n1 + 1, n, data);
  }
  return temp;
}


x86 assembly (clang, -O0):
<percentile_nocopy_short>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
cmpl   $0x1,-0x8(%rbp)
jne    115e <percentile_nocopy_short+0x2e>
mov    -0x10(%rbp),%rax
mov    (%rax),%ax
mov    %ax,-0x2(%rbp)
jmp    13c4 <percentile_nocopy_short+0x294>
cvtsi2sdl -0x8(%rbp),%xmm1
movsd  0xe9d(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x18(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
movsd  0xe7a(%rip),%xmm2
divsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jb     11fa <percentile_nocopy_short+0xca>
mov    -0x10(%rbp),%rax
mov    (%rax),%ax
mov    %ax,-0x3a(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    11ed <percentile_nocopy_short+0xbd>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
movswl -0x3a(%rbp),%ecx
cmp    %ecx,%eax
jge    11da <percentile_nocopy_short+0xaa>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x3a(%rbp)
jmp    11df <percentile_nocopy_short+0xaf>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11a6 <percentile_nocopy_short+0x76>
mov    -0x3a(%rbp),%ax
mov    %ax,-0x2(%rbp)
jmp    13c4 <percentile_nocopy_short+0x294>
movsd  -0x18(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  0xdf4(%rip),%xmm1
divsd  %xmm1,%xmm2
movsd  0xdf8(%rip),%xmm1
subsd  %xmm2,%xmm1
ucomisd %xmm1,%xmm0
jb     128c <percentile_nocopy_short+0x15c>
mov    -0x10(%rbp),%rax
mov    (%rax),%ax
mov    %ax,-0x3a(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    127f <percentile_nocopy_short+0x14f>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
movswl -0x3a(%rbp),%ecx
cmp    %ecx,%eax
jle    126c <percentile_nocopy_short+0x13c>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x3a(%rbp)
jmp    1271 <percentile_nocopy_short+0x141>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1238 <percentile_nocopy_short+0x108>
mov    -0x3a(%rbp),%ax
mov    %ax,-0x2(%rbp)
jmp    13c4 <percentile_nocopy_short+0x294>
movsd  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd69(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  -0x38(%rbp),%xmm1
movsd  0xd48(%rip),%xmm2
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
call   1040 <floor@plt>
mov    %eax,-0x20(%rbp)
movsd  -0x30(%rbp),%xmm0
call   1030 <ceil@plt>
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%eax
mov    -0x8(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jle    12f9 <percentile_nocopy_short+0x1c9>
mov    -0x8(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x8(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jle    1313 <percentile_nocopy_short+0x1e3>
mov    -0x8(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x20(%rbp)
jge    1324 <percentile_nocopy_short+0x1f4>
movl   $0x0,-0x20(%rbp)
cmpl   $0x0,-0x24(%rbp)
jge    1335 <percentile_nocopy_short+0x205>
movl   $0x0,-0x24(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x24(%rbp),%eax
je     13a6 <percentile_nocopy_short+0x276>
mov    -0x20(%rbp),%edi
add    $0x1,%edi
mov    -0x8(%rbp),%esi
mov    -0x10(%rbp),%rdx
call   1050 <quickselect_short@plt>
mov    %ax,-0x3a(%rbp)
movsd  -0x30(%rbp),%xmm0
cvtsi2sdl -0x20(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x24(%rbp),%edi
add    $0x1,%edi
mov    -0x8(%rbp),%esi
mov    -0x10(%rbp),%rdx
call   1050 <quickselect_short@plt>
movsd  -0x48(%rbp),%xmm0
cwtl
movswl -0x3a(%rbp),%ecx
sub    %ecx,%eax
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
movswl %ax,%ecx
movswl -0x3a(%rbp),%eax
add    %ecx,%eax
mov    %ax,-0x3a(%rbp)
jmp    13bc <percentile_nocopy_short+0x28c>
mov    -0x20(%rbp),%edi
add    $0x1,%edi
mov    -0x8(%rbp),%esi
mov    -0x10(%rbp),%rdx
call   1050 <quickselect_short@plt>
mov    %ax,-0x3a(%rbp)
mov    -0x3a(%rbp),%ax
mov    %ax,-0x2(%rbp)
movswl -0x2(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<percentile_nocopy_short>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x10,%rsp
mov    %rsi,%rbx
cmp    $0x1,%edi
jne    1156 <percentile_nocopy_short+0x26>
movzwl (%rbx),%ebp
mov    %ebp,%eax
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %edi,%r14d
cvtsi2sd %edi,%xmm2
movsd  0xe9b(%rip),%xmm1
divsd  %xmm2,%xmm1
mulsd  0xe97(%rip),%xmm1
ucomisd %xmm0,%xmm1
jae    124d <percentile_nocopy_short+0x11d>
movsd  0xe8d(%rip),%xmm2
subsd  %xmm1,%xmm2
ucomisd %xmm2,%xmm0
jae    1348 <percentile_nocopy_short+0x218>
lea    -0x1(%r14),%r15d
xorps  %xmm2,%xmm2
cvtsi2sd %r15d,%xmm2
mulsd  %xmm0,%xmm2
divsd  0xe67(%rip),%xmm2
subsd  %xmm1,%xmm2
movsd  %xmm2,0x8(%rsp)
movapd %xmm2,%xmm0
call   1040 <floor@plt>
mov    %eax,%r12d
movsd  0x8(%rsp),%xmm0
call   1030 <ceil@plt>
cmp    %r14d,%r12d
cmovge %r15d,%r12d
cmp    %r14d,%eax
cmovl  %eax,%r15d
xor    %eax,%eax
test   %r12d,%r12d
cmovs  %eax,%r12d
test   %r15d,%r15d
cmovs  %eax,%r15d
lea    0x1(%r12),%edi
mov    %r14d,%esi
mov    %rbx,%rdx
call   1050 <quickselect_short@plt>
mov    %eax,%ebp
cmp    %r15d,%r12d
je     1147 <percentile_nocopy_short+0x17>
xorps  %xmm0,%xmm0
cvtsi2sd %r12d,%xmm0
movsd  0x8(%rsp),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rsp)
add    $0x1,%r15d
mov    %r15d,%edi
mov    %r14d,%esi
mov    %rbx,%rdx
call   1050 <quickselect_short@plt>
cwtl
movswl %bp,%ecx
sub    %ecx,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x8(%rsp),%xmm0
cvttsd2si %xmm0,%eax
add    %ebp,%eax
mov    %eax,%ebp
jmp    1147 <percentile_nocopy_short+0x17>
movzwl (%rbx),%ebp
cmp    $0x2,%r14d
jl     1147 <percentile_nocopy_short+0x17>
mov    %r14d,%eax
lea    -0x1(%rax),%rdx
mov    $0x1,%ecx
cmp    $0x10,%rdx
jb     1330 <percentile_nocopy_short+0x200>
mov    %rdx,%rcx
and    $0xfffffffffffffff0,%rcx
movd   %ebp,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    -0x10(%rcx),%rsi
mov    %rsi,%rbp
shr    $0x4,%rbp
add    $0x1,%rbp
test   %rsi,%rsi
je     13e3 <percentile_nocopy_short+0x2b3>
mov    %rbp,%rsi
and    $0xfffffffffffffffe,%rsi
mov    $0x1,%edi
movdqa %xmm0,%xmm1
nopl   (%rax)
movdqu (%rbx,%rdi,2),%xmm2
pminsw %xmm0,%xmm2
movdqu 0x10(%rbx,%rdi,2),%xmm3
pminsw %xmm1,%xmm3
movdqu 0x20(%rbx,%rdi,2),%xmm0
pminsw %xmm2,%xmm0
movdqu 0x30(%rbx,%rdi,2),%xmm1
pminsw %xmm3,%xmm1
add    $0x20,%rdi
add    $0xfffffffffffffffe,%rsi
jne    12b0 <percentile_nocopy_short+0x180>
test   $0x1,%bpl
je     12fa <percentile_nocopy_short+0x1ca>
movdqu (%rbx,%rdi,2),%xmm2
pminsw %xmm2,%xmm0
movdqu 0x10(%rbx,%rdi,2),%xmm2
pminsw %xmm2,%xmm1
pminsw %xmm1,%xmm0
pshufd $0xee,%xmm0,%xmm1
pminsw %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
pminsw %xmm1,%xmm0
movdqa %xmm0,%xmm1
psrld  $0x10,%xmm1
pminsw %xmm0,%xmm1
movd   %xmm1,%ebp
cmp    %rcx,%rdx
je     1147 <percentile_nocopy_short+0x17>
or     $0x1,%rcx
xchg   %ax,%ax
movzwl (%rbx,%rcx,2),%edx
cmp    %bp,%dx
cmovl  %edx,%ebp
add    $0x1,%rcx
cmp    %rcx,%rax
jne    1330 <percentile_nocopy_short+0x200>
jmp    1147 <percentile_nocopy_short+0x17>
movzwl (%rbx),%ebp
cmp    $0x2,%r14d
jl     1147 <percentile_nocopy_short+0x17>
mov    %r14d,%eax
lea    -0x1(%rax),%rdx
mov    $0x1,%ecx
cmp    $0x10,%rdx
jb     1460 <percentile_nocopy_short+0x330>
mov    %rdx,%rcx
and    $0xfffffffffffffff0,%rcx
movd   %ebp,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    -0x10(%rcx),%rsi
mov    %rsi,%rbp
shr    $0x4,%rbp
add    $0x1,%rbp
test   %rsi,%rsi
je     13fb <percentile_nocopy_short+0x2cb>
mov    %rbp,%rsi
and    $0xfffffffffffffffe,%rsi
mov    $0x1,%edi
movdqa %xmm0,%xmm1
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqu (%rbx,%rdi,2),%xmm2
pmaxsw %xmm0,%xmm2
movdqu 0x10(%rbx,%rdi,2),%xmm3
pmaxsw %xmm1,%xmm3
movdqu 0x20(%rbx,%rdi,2),%xmm0
pmaxsw %xmm2,%xmm0
movdqu 0x30(%rbx,%rdi,2),%xmm1
pmaxsw %xmm3,%xmm1
add    $0x20,%rdi
add    $0xfffffffffffffffe,%rsi
jne    13b0 <percentile_nocopy_short+0x280>
jmp    1404 <percentile_nocopy_short+0x2d4>
mov    $0x1,%edi
movdqa %xmm0,%xmm1
test   $0x1,%bpl
jne    12e7 <percentile_nocopy_short+0x1b7>
jmp    12fa <percentile_nocopy_short+0x1ca>
mov    $0x1,%edi
movdqa %xmm0,%xmm1
test   $0x1,%bpl
je     141d <percentile_nocopy_short+0x2ed>
movdqu (%rbx,%rdi,2),%xmm2
pmaxsw %xmm2,%xmm0
movdqu 0x10(%rbx,%rdi,2),%xmm2
pmaxsw %xmm2,%xmm1
pmaxsw %xmm1,%xmm0
pshufd $0xee,%xmm0,%xmm1
pmaxsw %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
pmaxsw %xmm1,%xmm0
movdqa %xmm0,%xmm1
psrld  $0x10,%xmm1
pmaxsw %xmm0,%xmm1
movd   %xmm1,%ebp
cmp    %rcx,%rdx
je     1147 <percentile_nocopy_short+0x17>
or     $0x1,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzwl (%rbx,%rcx,2),%edx
cmp    %bp,%dx
cmovg  %edx,%ebp
add    $0x1,%rcx
cmp    %rcx,%rax
jne    1460 <percentile_nocopy_short+0x330>
jmp    1147 <percentile_nocopy_short+0x17>

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

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